diff --git a/coral/package.json b/coral/package.json index 9df7b1291..dccd7566e 100644 --- a/coral/package.json +++ b/coral/package.json @@ -51,7 +51,7 @@ "react-hook-form": "^7.53.2", "react-markdown": "^9.0.1", "react-router-dom": "^6.27.0", - "react-syntax-highlighter": "^15.5.0", + "react-syntax-highlighter": "^15.6.1", "rehype-parse": "^9.0.1", "rehype-remark": "^10.0.0", "rehype-sanitize": "^6.0.0", @@ -96,7 +96,7 @@ "openapi-typescript": "^7.4.3", "prettier": "^3.3.3", "prop-types": "^15.8.1", - "react-aria": "^3.34.3", + "react-aria": "^3.36.0", "react-test-renderer": "^18.3.1", "rollup-plugin-visualizer": "^5.12.0", "ts-jest": "^29.2.5", diff --git a/coral/pnpm-lock.yaml b/coral/pnpm-lock.yaml index 4d3e2ef9a..5d7f9b8a5 100644 --- a/coral/pnpm-lock.yaml +++ b/coral/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^6.27.0 version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-syntax-highlighter: - specifier: ^15.5.0 - version: 15.5.0(react@18.3.1) + specifier: ^15.6.1 + version: 15.6.1(react@18.3.1) rehype-parse: specifier: ^9.0.1 version: 9.0.1 @@ -178,8 +178,8 @@ importers: specifier: ^15.8.1 version: 15.8.1 react-aria: - specifier: ^3.34.3 - version: 3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.36.0 + version: 3.36.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-test-renderer: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -624,30 +624,30 @@ packages: peerDependencies: '@types/node': '>=18' - '@internationalized/date@3.5.5': - resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} - '@internationalized/date@3.5.6': resolution: {integrity: sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==} - '@internationalized/message@3.1.4': - resolution: {integrity: sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==} + '@internationalized/date@3.6.0': + resolution: {integrity: sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==} '@internationalized/message@3.1.5': resolution: {integrity: sha512-hjEpLKFlYA3m5apldLqzHqw531qqfOEq0HlTWdfyZmcloWiUbWsYXD6YTiUmQmOtarthzhdjCAwMVrB8a4E7uA==} - '@internationalized/number@3.5.3': - resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} + '@internationalized/message@3.1.6': + resolution: {integrity: sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ==} '@internationalized/number@3.5.4': resolution: {integrity: sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A==} - '@internationalized/string@3.2.3': - resolution: {integrity: sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==} + '@internationalized/number@3.6.0': + resolution: {integrity: sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==} '@internationalized/string@3.2.4': resolution: {integrity: sha512-BcyadXPn89Ae190QGZGDUZPqxLj/xsP4U1Br1oSy8yfIjmpJ8cJtGYleaodqW/EmzFjwELtwDojLkf3FhV6SjA==} + '@internationalized/string@3.2.5': + resolution: {integrity: sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -804,47 +804,31 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/breadcrumbs@3.5.16': - resolution: {integrity: sha512-OXLKKu4SmjnSaSHkk4kow5/aH/SzlHWPJt+Uq3xec9TwDOr/Ob8aeFVGFoY0HxfGozuQlUz+4e+d29vfA0jNWg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/breadcrumbs@3.5.17': - resolution: {integrity: sha512-LJQ+u3TbPmtAWZ3/qC6VfLCzXiwVoB6GmI+HJ2pbjs6H9L8MoiLHsA4mgcz+P0rvx7SCs0Rhvy4JurV6R/R4xw==} + '@react-aria/breadcrumbs@3.5.19': + resolution: {integrity: sha512-mVngOPFYVVhec89rf/CiYQGTfaLRfHFtX+JQwY7sNYNqSA+gO8p4lNARe3Be6bJPgH+LUQuruIY9/ZDL6LT3HA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/button@3.10.0': resolution: {integrity: sha512-mhbn2tEsr991sjG6YMH6oN3ELWb4YvZZ8mnZHMNLa3l8T00PV0ClvQBsUndo6uSvuTHhpFzmMMkJFhYYUwCKlw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/button@3.9.8': - resolution: {integrity: sha512-MdbMQ3t5KSCkvKtwYd/Z6sgw0v+r1VQFRYOZ4L53xOkn+u140z8vBpNeWKZh/45gxGv7SJn9s2KstLPdCWmIxw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/calendar@3.5.11': - resolution: {integrity: sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/calendar@3.5.12': - resolution: {integrity: sha512-C8VRjRwEVPaGoCtjOlC0lb3mVSz4ajbal8jfvcbp7LOqCcmOVTUbiM7EPTy60EfZRanFNSp2D1ZstEZDU+cqsg==} + '@react-aria/button@3.11.0': + resolution: {integrity: sha512-b37eIV6IW11KmNIAm65F3SEl2/mgj5BrHIysW6smZX3KoKWTGYsYfcQkmtNgY0GOSFfDxMCoolsZ6mxC00nSDA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/checkbox@3.14.6': - resolution: {integrity: sha512-LICY1PR3WsW/VbuLMjZbxo75+poeo3XCXGcUnk6hxMlWfp/Iy/XHVsHlGu9stRPKRF8BSuOGteaHWVn6IXfwtA==} + '@react-aria/calendar@3.6.0': + resolution: {integrity: sha512-tZ3nd5DP8uxckbj83Pt+4RqgcTWDlGi7njzc7QqFOG2ApfnYDUXbIpb/Q4KY6JNlJskG8q33wo0XfOwNy8J+eg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/checkbox@3.14.7': - resolution: {integrity: sha512-aqVxXcr/8P7pQ7R34DlJX2SdBvWtHof9lLTVBY/9tgMplcKIoVBdlVUYPtqWxT3tGan+rruPQHbzTx8zJRFJyg==} + '@react-aria/checkbox@3.15.0': + resolution: {integrity: sha512-z/8xd4em7o0MroBXwkkwv7QRwiJaA1FwqMhRUb7iqtBGP2oSytBEDf0N7L09oci32a1P4ZPz2rMK5GlLh/PD6g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/collections@3.0.0-alpha.5': resolution: {integrity: sha512-8m8yZe1c5PYCylEN4lcG3ZL/1nyrON95nVsoknC8shY1uKP01oJd7w+f6hvVza0tJRQuVe4zW3gO4FVjv33a5g==} @@ -858,41 +842,35 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/combobox@3.10.3': - resolution: {integrity: sha512-EdDwr2Rp1xy7yWjOYHt2qF1IpAtUrkaNKZJzlIw1XSwcqizQY6E8orNPdZr6ZwD6/tgujxF1N71JTKyffrR0Xw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/combobox@3.10.4': - resolution: {integrity: sha512-jzLyRwpwH5SCfQl5giLSwLaw9EKlRiMG39kDZLRB4MQ1MN4sIdIP2TXBbdYcSLtYjduJm2JfRvs2ezI+QI+umA==} + '@react-aria/color@3.0.2': + resolution: {integrity: sha512-dSM5qQRcR1gRGYCBw0IGRmc29gjfoht3cQleKb8MMNcgHYa2oi5VdCs2yKXmYFwwVC6uPtnlNy9S6e0spqdr+w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/datepicker@3.11.2': - resolution: {integrity: sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA==} + '@react-aria/combobox@3.11.0': + resolution: {integrity: sha512-s88YMmPkMO1WSoiH1KIyZDLJqUwvM2wHXXakj3cYw1tBHGo4rOUFq+JWQIbM5EDO4HOR4AUUqzIUd0NO7t3zyg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/datepicker@3.11.3': - resolution: {integrity: sha512-HwGxDctFry5ew3Cu7gWpUVodaCg//V6NCihSRjLvnW/TWG+UFLzTafxTqqm8eRbicT3DJlXCLOUPk8Ek0txW6A==} + '@react-aria/datepicker@3.12.0': + resolution: {integrity: sha512-VYNXioLfddIHpwQx211+rTYuunDmI7VHWBRetCpH3loIsVFuhFSRchTQpclAzxolO3g0vO7pMVj9VYt7Swp6kg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/dialog@3.5.17': - resolution: {integrity: sha512-lvfEgaqg922J1hurscqCS600OZQVitGtdpo81kAefJaUzMnCxzrYviyT96aaW0simHOlimbYF5js8lxBLZJRaw==} + '@react-aria/dialog@3.5.20': + resolution: {integrity: sha512-l0GZVLgeOd3kL3Yj8xQW7wN3gn9WW3RLd/SGI9t7ciTq+I/FhftjXCWzXLlOCCTLMf+gv7eazecECtmoWUaZWQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/dialog@3.5.18': - resolution: {integrity: sha512-j0x0OwDZKyW2GqBZl2Dw/pHl0uSCzhHOg5jNeulkZC8xQa8COuksQf5NFzPmgRPnzqpbgvSzCSs41ymS8spmFg==} + '@react-aria/disclosure@3.0.0': + resolution: {integrity: sha512-xO9QTQSvymujTjCs1iCQ4+dKZvtF/rVVaFZBKlUtqIqwTHMdqeZu4fh5miLEnTyVLNHMGzLrFggsd8Q+niC9Og==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/disclosure@3.0.0-alpha.0': resolution: {integrity: sha512-/tleriRORdkRJf2JXjiRfhLfXA5WY0nPT3DoodZJgD5Fj/aCjrWXarVGUQuEk9vsH5pwinQiQB5So+cA+xF+UQ==} @@ -900,43 +878,37 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/dnd@3.7.2': - resolution: {integrity: sha512-NuE3EGqoBbe9aXAO9mDfbu4kMO7S4MCgkjkCqYi16TWfRUf38ajQbIlqodCx91b3LVN3SYvNbE3D4Tj5ebkljw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/dnd@3.7.3': resolution: {integrity: sha512-SF7v1AzpXr4CSf98pSzjcSBCaezpP6rsSnSJTz0j2jrYfdQhX0MPA2lyxS+kgU1AEzkK19THQeHuj8hxQc0bVw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/focus@3.18.2': - resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} + '@react-aria/dnd@3.8.0': + resolution: {integrity: sha512-JiqHY3E9fDU5Kb4gN22cuK6QNlpMCGe6ngR/BV+Q8mLEsdoWcoUAYOtYXVNNTRvCdVbEWI87FUU+ThyPpoDhNQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/focus@3.18.3': resolution: {integrity: sha512-WKUElg+5zS0D3xlVn8MntNnkzJql2J6MuzAMP8Sv5WTgFDse/XGR842dsxPTIyKKdrWVCRegCuwa4m3n/GzgJw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/form@3.0.8': - resolution: {integrity: sha512-8S2QiyUdAgK43M3flohI0R+2rTyzH088EmgeRArA8euvJTL16cj/oSOKMEgWVihjotJ9n6awPb43ZhKboyNsMg==} + '@react-aria/focus@3.19.0': + resolution: {integrity: sha512-hPF9EXoUQeQl1Y21/rbV2H4FdUR2v+4/I0/vB+8U3bT1CJ+1AFj1hc/rqx2DqEwDlEwOHN+E4+mRahQmlybq0A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/form@3.0.9': - resolution: {integrity: sha512-9M6IfC5t47G19c8roHWnkKd275BrECTzyTsc4rzf5OepJfHfG4evST6x+4gGOFYi8soC9XoQdJl4TRh/mft+gw==} + '@react-aria/form@3.0.11': + resolution: {integrity: sha512-oXzjTiwVuuWjZ8muU0hp3BrDH5qjVctLOF50mjPvqUbvXQTHhoDxWweyIXPQjGshaqBd2w4pWaE4A2rG2O/apw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/grid@3.10.3': - resolution: {integrity: sha512-l0r9mz05Gwjq3t6JOTNQOf+oAoWN0bXELPJtIr8m0XyXMPFCQe1xsTaX8igVQdrDmXyBc75RAWS0BJo2JF2fIA==} + '@react-aria/form@3.0.9': + resolution: {integrity: sha512-9M6IfC5t47G19c8roHWnkKd275BrECTzyTsc4rzf5OepJfHfG4evST6x+4gGOFYi8soC9XoQdJl4TRh/mft+gw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 '@react-aria/grid@3.10.4': resolution: {integrity: sha512-3AjJ0hwRhOCIHThIZrGWrjAuKDpaZuBkODW3dvgLqtsNm3tL46DI6U9O3vfp8lNbrWMsXJgjRXwvXvdv0/gwCA==} @@ -944,11 +916,17 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/gridlist@3.9.3': - resolution: {integrity: sha512-bb9GnKKeuL6NljoVUcHxr9F0cy/2WDOXRYeMikTnviRw6cuX95oojrhFfCUvz2d6ID22Btrvh7LkE+oIPVuc+g==} + '@react-aria/grid@3.11.0': + resolution: {integrity: sha512-lN5FpQgu2Rq0CzTPWmzRpq6QHcMmzsXYeClsgO3108uVp1/genBNAObYVTxGOKe/jb9q99trz8EtIn05O6KN1g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/gridlist@3.10.0': + resolution: {integrity: sha512-UcblfSZ7kJBrjg9mQ5VbnRevN81UiYB4NuL5PwIpBpridO7tnl4ew6+96PYU7Wj1chHhPS3x0b0zmuSVN7A0LA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/gridlist@3.9.4': resolution: {integrity: sha512-gGzS4ToSynn2KBycf9UCsWIJIbVl4RjoCjPF4NnukwzHmrXwbtZnlF0xsORQ5QxfqHH9UehTAHWFvOOHJSZZ2w==} @@ -956,69 +934,52 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/i18n@3.12.2': - resolution: {integrity: sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/i18n@3.12.3': resolution: {integrity: sha512-0Tp/4JwnCVNKDfuknPF+/xf3/woOc8gUjTU2nCjO3mCVb4FU7KFtjxQ2rrx+6hpIVG6g+N9qfMjRa/ggVH0CJg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/interactions@3.22.2': - resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} + '@react-aria/i18n@3.12.4': + resolution: {integrity: sha512-j9+UL3q0Ls8MhXV9gtnKlyozq4aM95YywXqnmJtzT1rYeBx7w28hooqrWkCYLfqr4OIryv1KUnPiCSLwC2OC7w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/interactions@3.22.3': resolution: {integrity: sha512-RRUb/aG+P0IKTIWikY/SylB6bIbLZeztnZY2vbe7RAG5MgVaCgn5HQ45SI15GlTmhsFG8CnF6slJsUFJiNHpbQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/label@3.7.11': - resolution: {integrity: sha512-REgejE5Qr8cXG/b8H2GhzQmjQlII/0xQW/4eDzydskaTLvA7lF5HoJUE6biYTquH5va38d8XlH465RPk+bvHzA==} + '@react-aria/interactions@3.22.5': + resolution: {integrity: sha512-kMwiAD9E0TQp+XNnOs13yVJghiy8ET8L0cbkeuTgNI96sOAp/63EJ1FSrDf17iD8sdjt41LafwX/dKXW9nCcLQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/label@3.7.12': resolution: {integrity: sha512-u9xT90lAlgb7xiv+p0md9QwCHz65XL7tjS5e29e88Rs3ptkv3aQubTqxVOUTEwzbNUT4A1QqTjUm1yfHewIRUw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/link@3.7.4': - resolution: {integrity: sha512-E8SLDuS9ssm/d42+3sDFNthfMcNXMUrT2Tq1DIZt22EsMcuEzmJ9B0P7bDP5RgvIw05xVGqZ20nOpU4mKTxQtA==} + '@react-aria/label@3.7.13': + resolution: {integrity: sha512-brSAXZVTey5RG/Ex6mTrV/9IhGSQFU4Al34qmjEDho+Z2qT4oPwf8k7TRXWWqzOU0ugYxekYbsLd2zlN3XvWcg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/link@3.7.5': - resolution: {integrity: sha512-j0F1BIdNoE7Tl+0KzzjbrmYuxt4aWAmDZDHvJKiYg71Jb1BAPz71eE1O1ybMoO04+OG/6HrRZTragfSQLAJ58A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/listbox@3.13.3': - resolution: {integrity: sha512-htluPyDfFtn66OEYaJdIaFCYH9wGCNk30vOgZrQkPul9F9Cjce52tTyPVR0ERsf14oCUsjjS5qgeq3dGidRqEw==} + '@react-aria/link@3.7.7': + resolution: {integrity: sha512-eVBRcHKhNSsATYWv5wRnZXRqPVcKAWWakyvfrYePIKpC3s4BaHZyTGYdefk8ZwZdEOuQZBqLMnjW80q1uhtkuA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/listbox@3.13.4': - resolution: {integrity: sha512-2aG4jzlB+srYBeM9ap/BNZe0E04yMjY2dPGXcigkaSJt6/yYAHCygXuouf2MzvBfkdV4QWyHIIgWZmAXXl6reg==} + '@react-aria/listbox@3.13.6': + resolution: {integrity: sha512-6hEXEXIZVau9lgBZ4VVjFR3JnGU+fJaPmV3HP0UZ2ucUptfG0MZo24cn+ZQJsWiuaCfNFv5b8qribiv+BcO+Kg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/live-announcer@3.3.4': - resolution: {integrity: sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==} + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/live-announcer@3.4.0': resolution: {integrity: sha512-VBxEdMq2SbtRbNTQNcDR2G6E3lEl5cJSBiHTTO8Ln1AL76LiazrylIXGgoktqzCfRQmyq0v8CHk1cNKDU9mvJg==} - '@react-aria/menu@3.15.3': - resolution: {integrity: sha512-vvUmVjJwIg3h2r+7isQXTwlmoDlPAFBckHkg94p3afrT1kNOTHveTsaVl17mStx/ymIioaAi3PrIXk/PZXp1jw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/live-announcer@3.4.1': + resolution: {integrity: sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig==} '@react-aria/menu@3.15.4': resolution: {integrity: sha512-4wfq8Lb7AltgSzBHdtypiPOnsRm8hHv7PUuHhlq/VT9yAkEFk4Flc7vKVF6VSFqrnCfyCf66B5aeapjNInAONg==} @@ -1026,21 +987,16 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/meter@3.4.16': - resolution: {integrity: sha512-hJqKnEE6mmK2Psx5kcI7NZ44OfTg0Bp7DatQSQ4zZE4yhnykRRwxqSKjze37tPR63cCqgRXtQ5LISfBfG54c0Q==} + '@react-aria/menu@3.16.0': + resolution: {integrity: sha512-TNk+Vd3TbpBPUxEloAdHRTaRxf9JBK7YmkHYiq0Yj5Lc22KS0E2eTyhpPM9xJvEWN2TlC5TEvNfdyui2kYWFFQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/meter@3.4.17': - resolution: {integrity: sha512-08wbQhfvVWzpWilhn/WD7cQ7TqafS/66umTk7+X6BW6TrS1//6loNNJV62IC3F7sskel4iEAtl2gW0WpW8zEdg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/numberfield@3.11.6': - resolution: {integrity: sha512-nvEWiQcWRwj6O2JXmkXEeWoBX/GVZT9zumFJcew3XknGTWJUr3h2AOymIQFt9g4mpag8IgOFEpSIlwhtZHdp1A==} + '@react-aria/meter@3.4.18': + resolution: {integrity: sha512-tTX3LLlmDIHqrC42dkdf+upb1c4UbhlpZ52gqB64lZD4OD4HE+vMTwNSe+7MRKMLvcdKPWCRC35PnxIHZ15kfQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/numberfield@3.11.7': resolution: {integrity: sha512-9bqg4sKqc5XLppHzJFRhgtkoeMu0N6Zg0AuVSiE/3CxE5Ad+y8tKpFEx9zh4o5BItyOWy18w5ZXnKjJGjd7waQ==} @@ -1048,11 +1004,11 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/overlays@3.23.2': - resolution: {integrity: sha512-vjlplr953YAuJfHiP4O+CyrTlr6OaFgXAGrzWq4MVMjnpV/PT5VRJWYFHR0sUGlHTPqeKS4NZbi/xCSgl/3pGQ==} + '@react-aria/numberfield@3.11.9': + resolution: {integrity: sha512-3tiGPx2y4zyOV7PmdBASes99ZZsFTZAJTnU45Z+p1CW4131lw7y2ZhbojBl7U6DaXAJvi1z6zY6cq2UE9w5a0Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/overlays@3.23.3': resolution: {integrity: sha512-vRW4DL466a27BBIP6dQqmmei4nX/nsur6DyF0Hmd46ygwOdvdA+5MwvXZUz9yUamB79UeS9BMQZuBVwhjoMwBQ==} @@ -1060,53 +1016,32 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/progress@3.4.16': - resolution: {integrity: sha512-RbDIFQg4+/LG+KYZeLAijt2zH7K2Gp0CY9RKWdho3nU5l3/w57Fa7NrfDGWtpImrt7bR2nRmXMA6ESfr7THfrg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/progress@3.4.17': - resolution: {integrity: sha512-5+01WNibLoNS5KcfU5p6vg7Lhz17plqqzv/uITx28zzj3saaj0VLR7n57Ig2fXe8ZEQoUS89BS3sIEsIf96S1A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/radio@3.10.7': - resolution: {integrity: sha512-o2tqIe7xd1y4HeCBQfz/sXIwLJuI6LQbVoCQ1hgk/5dGhQ0LiuXohRYitGRl9zvxW8jYdgLULmOEDt24IflE8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/radio@3.10.8': - resolution: {integrity: sha512-/vKQhKqpoCB/VqHuc46OOU+31HFtg6svcYzHBbz0wN/DSVCygYeTfB/36kY7x2GWWkT0pCsB4OcHJ+/0G3EfkQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/searchfield@3.7.8': - resolution: {integrity: sha512-SsF5xwH8Us548QgzivvbM7nhFbw7pu23xnRRIuhlP3MwOR3jRUFh17NKxf3Z0jvrDv/u0xfm3JKHIgaUN0KJ2A==} + '@react-aria/overlays@3.24.0': + resolution: {integrity: sha512-0kAXBsMNTc/a3M07tK9Cdt/ea8CxTAEJ223g8YgqImlmoBBYAL7dl5G01IOj67TM64uWPTmZrOklBchHWgEm3A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/searchfield@3.7.9': - resolution: {integrity: sha512-EHODG7HDFthwG5tx4fh+WP2hjNOp/rPAqdNScKBAN73nEf0F/qQpIwmdZF0EycCOzGSM5hhihjm0yMtTFYuzOQ==} + '@react-aria/progress@3.4.18': + resolution: {integrity: sha512-FOLgJ9t9i1u3oAAimybJG6r7/soNPBnJfWo4Yr6MmaUv90qVGa1h6kiuM5m9H/bm5JobAebhdfHit9lFlgsCmg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/select@3.14.10': - resolution: {integrity: sha512-xHkAJqvfKgnH5mVYwZj3ME7/Q3wUzgUZDK/iVuXUs3cAYap8ybM2d/2zOGcqv1keZHBUzwp9QtaN//FYK13jIA==} + '@react-aria/radio@3.10.10': + resolution: {integrity: sha512-NVdeOVrsrHgSfwL2jWCCXFsWZb+RMRZErj5vthHQW4nkHECGOzeX56VaLWTSvdoCPqi9wdIX8A6K9peeAIgxzA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/select@3.14.9': - resolution: {integrity: sha512-tiNgMyA2G9nKnFn3pB/lMSgidNToxSFU7r6l4OcG+Vyr63J7B/3dF2lTXq8IYhlfOR3K3uQkjroSx52CmC3NDw==} + '@react-aria/searchfield@3.7.11': + resolution: {integrity: sha512-wFf6QxtBFfoxy0ANxI0+ftFEBGynVCY0+ce4H4Y9LpUTQsIKMp3sdc7LoUFORWw5Yee6Eid5cFPQX0Ymnk+ZJg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/selection@3.19.3': - resolution: {integrity: sha512-GYoObXCXlmGK08hp7Qfl6Bk0U+bKP5YDWSsX+MzNjJsqzQSLm4S06tRB9ACM7gIo9dDCvL4IRxdSYTJAlJc6bw==} + '@react-aria/select@3.15.0': + resolution: {integrity: sha512-zgBOUNy81aJplfc3NKDJMv8HkXjBGzaFF3XDzNfW8vJ7nD9rcTRUN5SQ1XCEnKMv12B/Euk9zt6kd+tX0wk1vQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/selection@3.20.0': resolution: {integrity: sha512-h3giMcXo4SMZRL5HrqZvOLNTsdh5jCXwLUx0wpj/2EF0tcYQL6WDfn1iJ+rHARkUIs7X70fUV8iwlbUySZy1xg==} @@ -1114,31 +1049,32 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/separator@3.4.2': - resolution: {integrity: sha512-Xql9Kg3VlGesEUC7QheE+L5b3KgBv0yxiUU+/4JP8V2vfU/XSz4xmprHEeq7KVQVOetn38iiXU8gA5g26SEsUA==} + '@react-aria/selection@3.21.0': + resolution: {integrity: sha512-52JJ6hlPcM+gt0VV3DBmz6Kj1YAJr13TfutrKfGWcK36LvNCBm1j0N+TDqbdnlp8Nue6w0+5FIwZq44XPYiBGg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/separator@3.4.3': - resolution: {integrity: sha512-L+eCmSGfRJ9jScHZqBkmOkp44LBARisDjRdYbGrLlsAEcOiHUXufnfpxz2rgkUGBdUgnI9hIk12q5kdy0UxGjg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/slider@3.7.11': - resolution: {integrity: sha512-2WAwjANXPsA2LHJ5nxxV4c7ihFAzz2spaBz8+FJ7MDYE7WroYnE8uAXElea1aGo+Lk0DTiAdepLpBkggqPNanw==} + '@react-aria/separator@3.4.4': + resolution: {integrity: sha512-dH+qt0Mdh0nhKXCHW6AR4DF8DKLUBP26QYWaoThPdBwIpypH/JVKowpPtWms1P4b36U6XzHXHnTTEn/ZVoCqNA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/slider@3.7.12': resolution: {integrity: sha512-yZWBGxDHBL5Gjjdnz+igdO7VfYND9iZsSqynadZthWtfy1jA+qBR25I+Soc0D9gkr/2/JUJkFgkllYF1RzWMUQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/spinbutton@3.6.8': - resolution: {integrity: sha512-OJMAYRIZ0WrWE+5tZsywrSg4t+aOwl6vl/e1+J64YcGMM+p+AKd61KGG5T0OgNSORXjoVIZOmj6wZ6Od4xfPMw==} + '@react-aria/slider@3.7.14': + resolution: {integrity: sha512-7rOiKjLkEZ0j7mPMlwrqivc+K4OSfL14slaQp06GHRiJkhiWXh2/drPe15hgNq55HmBQBpA0umKMkJcqVgmXPA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/spinbutton@3.6.10': + resolution: {integrity: sha512-nhYEYk7xUNOZDaqiQ5w/nHH9ouqjJbabTWXH+KK7UR1oVGfo4z1wG94l8KWF3Z6SGGnBxzLJyTBguZ4g9aYTSg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/spinbutton@3.6.9': resolution: {integrity: sha512-m+uVJdiIc2LrLVDGjU7p8P2O2gUvTN26GR+NgH4rl+tUSuAB0+T1rjls/C+oXEqQjCpQihEB9Bt4M+VHpzmyjA==} @@ -1146,98 +1082,70 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/ssr@3.9.5': - resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/ssr@3.9.6': resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==} engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/switch@3.6.7': - resolution: {integrity: sha512-yBNvKylhc3ZRQ0+7mD0mIenRRe+1yb8YaqMMZr8r3Bf87LaiFtQyhRFziq6ZitcwTJz5LEWjBihxbSVvUrf49w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/switch@3.6.8': - resolution: {integrity: sha512-6Q0w7o+liB0ztKPL9UaRfX+hPPuy71AL3SuVCMK7RKfPqZwcmlwUDp2gr3j5fvs8gLev0r42XtEBqmGwkHTkEw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/table@3.15.3': - resolution: {integrity: sha512-nQCLjlEvyJHyuijHw8ESqnA9fxNJfQHx0WPcl08VDEb8VxcE/MVzSAIedSWaqjG5k9Oflz6o/F/zHtzw4AFAow==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/table@3.15.4': - resolution: {integrity: sha512-t4+vtUF63i6OrXmZ0AA/RmWyIt8cieUm7cSXhQMooAgUjkvVqTNkQQRsntVOb+UNI5KmiGSe4jB3H4GVXz2X9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/tabs@3.9.5': - resolution: {integrity: sha512-aQZGAoOIg1B16qlvXIy6+rHbNBNVcWkGjOjeyvqTTPMjXt/FmElkICnqckI7MRJ1lTqzyppCOBitYOHSXRo8Uw==} + '@react-aria/ssr@3.9.7': + resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + engines: {node: '>= 12'} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/tabs@3.9.6': - resolution: {integrity: sha512-iPQ2Im+srnSB06xIdVNHZZDJnZmUR0IG0MZAp6FXmbkCeLAd9tZQHgSFYwswBfgAStNnyFQHP5aSBJOJMRCACg==} + '@react-aria/switch@3.6.10': + resolution: {integrity: sha512-FtaI9WaEP1tAmra1sYlAkYXg9x75P5UtgY8pSbe9+1WRyWbuE1QZT+RNCTi3IU4fZ7iJQmXH6+VaMyzPlSUagw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/tag@3.4.5': - resolution: {integrity: sha512-iyJuATQ8t2cdLC7hiZm143eeZze/MtgxaMq0OewlI9TUje54bkw2Q+CjERdgisIo3Eemf55JJgylGrTcalEJAg==} + '@react-aria/table@3.16.0': + resolution: {integrity: sha512-9xF9S3CJ7XRiiK92hsIKxPedD0kgcQWwqTMtj3IBynpQ4vsnRiW3YNIzrn9C3apjknRZDTSta8O2QPYCUMmw2A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/tag@3.4.6': - resolution: {integrity: sha512-Uf1sPabwJx99diyXJTaVguiYozS49opjQxmK1PPbb87ipNN1YlSDVbP05IelVMbnbxXHudsRmzPOBmmblcj1GQ==} + '@react-aria/tabs@3.9.8': + resolution: {integrity: sha512-Nur/qRFBe+Zrt4xcCJV/ULXCS3Mlae+B89bp1Gl20vSDqk6uaPtGk+cS5k03eugOvas7AQapqNJsJgKd66TChw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/textfield@3.14.8': - resolution: {integrity: sha512-FHEvsHdE1cMR2B7rlf+HIneITrC40r201oLYbHAp3q26jH/HUujzFBB9I20qhXjyBohMWfQLqJhSwhs1VW1RJQ==} + '@react-aria/tag@3.4.8': + resolution: {integrity: sha512-exWl52bsFtJuzaqMYvSnLteUoPqb3Wf+uICru/yRtREJsWVqjJF38NCVlU73Yqd9qMPTctDrboSZFAWAWKDxoA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/textfield@3.14.9': resolution: {integrity: sha512-LPwZhthDVLyvnzXWco4eyYCD2pFmQ4Vw9ha9tb3QkZUIP6j8E52y76j0c59Nq7XYus3IHatVe7yYQk7kbo8Zrg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/toggle@3.10.7': - resolution: {integrity: sha512-/RJQU8QlPZXRElZ3Tt10F5K5STgUBUGPpfuFUGuwF3Kw3GpPxYsA1YAVjxXz2MMGwS0+y6+U/J1xIs1AF0Jwzg==} + '@react-aria/textfield@3.15.0': + resolution: {integrity: sha512-V5mg7y1OR6WXYHdhhm4FC7QyGc9TideVRDFij1SdOJrIo5IFB7lvwpOS0GmgwkVbtr71PTRMjZnNbrJUFU6VNA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/toggle@3.10.8': - resolution: {integrity: sha512-N6WTgE8ByMYY+ZygUUPGON2vW5NrxwU91H98+Nozl+Rq6ZYR2fD9i8oRtLtrYPxjU2HmaFwDyQdWvmMJZuDxig==} + '@react-aria/toggle@3.10.10': + resolution: {integrity: sha512-QwMT/vTNrbrILxWVHfd9zVQ3mV2NdBwyRu+DphVQiFAXcmc808LEaIX2n0lI6FCsUDC9ZejCyvzd91/YemdZ1Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/toolbar@3.0.0-beta.9': - resolution: {integrity: sha512-P80zgbPb0aIg22fHlgHRXXUSpNSAOnh1ljsLiSHAGdXPrC5nRijYwwKi7DNRsXqD+ljEJwF6ekZPo95dXXeYAA==} + '@react-aria/toolbar@3.0.0-beta.11': + resolution: {integrity: sha512-LM3jTRFNDgoEpoL568WaiuqiVM7eynSQLJis1hV0vlVnhTd7M7kzt7zoOjzxVb5Uapz02uCp1Fsm4wQMz09qwQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/tooltip@3.7.7': - resolution: {integrity: sha512-UOTTDbbUz7OaE48VjNSWl+XQbYCUs5Gss4I3Tv1pfRLXzVtGYXv3ur/vRayvZR0xd12ANY26fZPNkSmCFpmiXw==} + '@react-aria/toolbar@3.0.0-beta.9': + resolution: {integrity: sha512-P80zgbPb0aIg22fHlgHRXXUSpNSAOnh1ljsLiSHAGdXPrC5nRijYwwKi7DNRsXqD+ljEJwF6ekZPo95dXXeYAA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/tooltip@3.7.8': - resolution: {integrity: sha512-dlWfS3w8E6dw5Xoist4cVX2GQE5oh3VQr88dRyLto7BAPLFrp3I+8c9mZCVUobLS/f5QcQzLkqw750s4ENCyiw==} + '@react-aria/tooltip@3.7.10': + resolution: {integrity: sha512-Udi3XOnrF/SYIz72jw9bgB74MG/yCOzF5pozHj2FH2HiJlchYv/b6rHByV/77IZemdlkmL/uugrv/7raPLSlnw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/tree@3.0.0-beta.0': resolution: {integrity: sha512-bF9sp7x+Ciy0N2KJwy8epmDoNblyVmeB4vR/KWLVIKMjANCpzTbvhWZUBpQxkpO0eupInU2uN+FMNr0WKMyd7Q==} @@ -1245,32 +1153,32 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/utils@3.25.2': - resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/utils@3.25.3': resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/utils@3.26.0': + resolution: {integrity: sha512-LkZouGSjjQ0rEqo4XJosS4L3YC/zzQkfRM3KoqK6fUOmUJ9t0jQ09WjiF+uOoG9u+p30AVg3TrZRUWmoTS+koQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-aria/virtualizer@4.0.3': resolution: {integrity: sha512-neSf+EXtqmQiccHcp9CS2RbH3xA6FuZggLzGsM1NoqDdXIL7TLfc7lhaqi8VAZ03e1FCUSye08BCRk3DdpUiyA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/visually-hidden@3.8.15': - resolution: {integrity: sha512-l+sJ7xTdD5Sd6+rDNDaeJCSPnHOsI+BaJyApvb/YcVgHa7rB47lp6TXCWUCDItcPY4JqRGyeByRJVrtzBFTWCw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/visually-hidden@3.8.16': resolution: {integrity: sha512-3zThVIzEprez4A/GajOut6/JQ4WCu2ROHGZ1xH1+2GFjBJQaTfPBIjg6UIwaT7sgHRQIik8QidogLqXHbp81yA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/visually-hidden@3.8.18': + resolution: {integrity: sha512-l/0igp+uub/salP35SsNWq5mGmg3G5F5QMS1gDZ8p28n7CgjvzyiGhJbbca7Oxvaw1HRFzVl9ev+89I7moNnFQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-spring/animated@9.7.2': resolution: {integrity: sha512-ipvleJ99ipqlnHkz5qhSsgf/ny5aW0ZG8Q+/2Oj9cI7LCc7COdnrSO6V/v8MAX3JOoQNzfz6dye2s5Pt5jGaIA==} peerDependencies: @@ -1308,6 +1216,16 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/calendar@3.6.0': + resolution: {integrity: sha512-GqUtOtGnwWjtNrJud8nY/ywI4VBP5byToNVRTnxbMl+gYO1Qe/uc5NG7zjwMxhb2kqSBHZFdkF0DXVqG2Ul+BA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/checkbox@3.6.10': + resolution: {integrity: sha512-LHm7i4YI8A/RdgWAuADrnSAYIaYYpQeZqsp1a03Og0pJHAlZL0ymN3y2IFwbZueY0rnfM+yF+kWNXjJqbKrFEQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/checkbox@3.6.8': resolution: {integrity: sha512-c8TWjU67XHHBCpqj6+FXXhQUWGr2Pil1IKggX81pkedhWiJl3/7+WHJuZI0ivGnRjp3aISNOG8UNVlBEjS9E8A==} peerDependencies: @@ -1328,16 +1246,31 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/collections@3.12.0': + resolution: {integrity: sha512-MfR9hwCxe5oXv4qrLUnjidwM50U35EFmInUeFf8i9mskYwWlRYS0O1/9PZ0oF1M0cKambaRHKEy98jczgb9ycA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/color@3.8.0': resolution: {integrity: sha512-lBH91HEStZeayhE/FkDMt9WC0UISQiAn8DoD2hfpTGeeWscX/soyxZA7oVL7zBOG9RfDBMNzF+CybVROrWSKAQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/color@3.8.1': + resolution: {integrity: sha512-7eN7K+KJRu+rxK351eGrzoq2cG+yipr90i5b1cUu4lioYmcH4WdsfjmM5Ku6gypbafH+kTDfflvO6hiY1NZH+A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/combobox@3.10.0': resolution: {integrity: sha512-4W4HCCjjoddW/LZM3pSSeLoV7ncYXlaICKmqlBcbtLR5jY4U5Kx+pPpy3oJ1vCdjDHatIxZ0tVKEBP7vBQVeGQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/combobox@3.10.1': + resolution: {integrity: sha512-Rso+H+ZEDGFAhpKWbnRxRR/r7YNmYVtt+Rn0eNDNIUp3bYaxIBCdCySyAtALs4I8RZXZQ9zoUznP7YeVwG3cLg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/combobox@3.9.2': resolution: {integrity: sha512-ZsbAcD58IvxZqwYxg9d2gOf8R/k5RUB2TPUiGKD6wgWfEKH6SDzY3bgRByHGOyMCyJB62cHjih/ZShizNTguqA==} peerDependencies: @@ -1363,6 +1296,16 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/datepicker@3.11.0': + resolution: {integrity: sha512-d9MJF34A0VrhL5y5S8mAISA8uwfNCQKmR2k4KoQJm3De1J8SQeNzSjLviAwh1faDow6FXGlA6tVbTrHyDcBgBg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/disclosure@3.0.0': + resolution: {integrity: sha512-Z9+fi0/41ZXHjGopORQza7mk4lFEFslKhy65ehEo6O6j2GuIV0659ExIVDsmJoJSFjXCfGh0sX8oTSOlXi9gqg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/disclosure@3.0.0-alpha.0': resolution: {integrity: sha512-CbFUrEwhsP5+44PMHipn/Cd61VTvqyKmx1yeNDyvj/4bYhmxYLgQp/Ma+iEqe23JkXJh2JO/ws3l9FnebScCJQ==} peerDependencies: @@ -1378,12 +1321,17 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/flags@3.0.3': - resolution: {integrity: sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==} + '@react-stately/dnd@3.5.0': + resolution: {integrity: sha512-ZcWFw1npEDnATiy3TEdzA1skQ3UEIyfbNA6VhPNO8yiSVLxoxBOaEaq8VVS72fRGAtxud6dgOy8BnsP9JwDClQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-stately/flags@3.0.4': resolution: {integrity: sha512-RNJEkOALwKg+JeYsfNlfPc4GXm7hiBLX0yuHOkRapWEyDOfi0cinkV/TZG4goOZdQ5tBpHmemf2qqiHAxqHlzQ==} + '@react-stately/flags@3.0.5': + resolution: {integrity: sha512-6wks4csxUwPCp23LgJSnkBRhrWpd9jGd64DjcCTNB2AHIFu7Ab1W59pJpUL6TW7uAxVxdNKjgn6D1hlBy8qWsA==} + '@react-stately/form@3.0.5': resolution: {integrity: sha512-J3plwJ63HQz109OdmaTqTA8Qhvl3gcYYK7DtgKyNP6mc/Me2Q4tl2avkWoA+22NRuv5m+J8TpBk4AVHUEOwqeQ==} peerDependencies: @@ -1394,6 +1342,16 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/form@3.1.0': + resolution: {integrity: sha512-E2wxNQ0QaTyDHD0nJFtTSnEH9A3bpJurwxhS4vgcUmESHgjFEMLlC9irUSZKgvOgb42GAq+fHoWBsgKeTp9Big==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/grid@3.10.0': + resolution: {integrity: sha512-ii+DdsOBvCnHMgL0JvUfFwO1kiAPP19Bpdpl6zn/oOltk6F5TmnoyNrzyz+2///1hCiySI3FE1O7ujsAQs7a6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/grid@3.9.2': resolution: {integrity: sha512-2gK//sqAqg2Xaq6UITTFQwFUJnBRgcW+cKBVbFt+F8d152xB6UwwTS/K79E5PUkOotwqZgTEpkrSFs/aVxCLpw==} peerDependencies: @@ -1419,6 +1377,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/list@3.11.1': + resolution: {integrity: sha512-UCOpIvqBOjwLtk7zVTYWuKU1m1Oe61Q5lNar/GwHaV1nAiSQ8/yYlhr40NkBEs9X3plEfsV28UIpzOrYnu1tPg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/menu@3.8.2': resolution: {integrity: sha512-lt6hIHmSixMzkKx1rKJf3lbAf01EmEvvIlENL20GLiU9cRbpPnPJ1aJMZ5Ad5ygglA7wAemAx+daPhlTQfF2rg==} peerDependencies: @@ -1429,6 +1392,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/menu@3.9.0': + resolution: {integrity: sha512-++sm0fzZeUs9GvtRbj5RwrP+KL9KPANp9f4SvtI3s+MP+Y/X3X7LNNePeeccGeyikB5fzMsuyvd82bRRW9IhDQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/numberfield@3.9.6': resolution: {integrity: sha512-p2R9admGLI439qZzB39dyANhkruprJJtZwuoGVtxW/VD0ficw6BrPVqAaKG25iwKPkmveleh9p8o+yRqjGedcQ==} peerDependencies: @@ -1439,6 +1407,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/numberfield@3.9.8': + resolution: {integrity: sha512-J6qGILxDNEtu7yvd3/y+FpbrxEaAeIODwlrFo6z1kvuDlLAm/KszXAc75yoDi0OtakFTCMP6/HR5VnHaQdMJ3w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/overlays@3.6.10': resolution: {integrity: sha512-XxZ2qScT5JPwGk9qiVJE4dtVh3AXTcYwGRA5RsHzC26oyVVsegPqY2PmNJGblAh6Q57VyodoVUyebE0Eo5CzRw==} peerDependencies: @@ -1449,6 +1422,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/overlays@3.6.12': + resolution: {integrity: sha512-QinvZhwZgj8obUyPIcyURSCjTZlqZYRRCS60TF8jH8ZpT0tEAuDb3wvhhSXuYA3Xo9EHLwvLjEf3tQKKdAQArw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/radio@3.10.7': resolution: {integrity: sha512-ZwGzFR+sGd42DxRlDTp3G2vLZyhMVtgHkwv2BxazPHxPMvLO9yYl7+3PPNxAmhMB4tg2u9CrzffpGX2rmEJEXA==} peerDependencies: @@ -1459,6 +1437,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/radio@3.10.9': + resolution: {integrity: sha512-kUQ7VdqFke8SDRCatw2jW3rgzMWbvw+n2imN2THETynI47NmNLzNP11dlGO2OllRtTrsLhmBNlYHa3W62pFpAw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/searchfield@3.5.6': resolution: {integrity: sha512-gVzU0FeWiLYD8VOYRgWlk79Qn7b2eirqOnWhtI5VNuGN8WyNaCIuBp6SkXTW2dY8hs2Hzn8HlMbgy1MIc7130Q==} peerDependencies: @@ -1469,6 +1452,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/searchfield@3.5.8': + resolution: {integrity: sha512-jtquvGadx1DmtQqPKaVO6Qg/xpBjNxsOd59ciig9xRxpxV+90i996EX1E2R6R+tGJdSM1pD++7PVOO4yE++HOg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/select@3.6.7': resolution: {integrity: sha512-hCUIddw0mPxVy1OH6jhyaDwgNea9wESjf+MYdnnTG/abRB+OZv/dWScd87OjzVsHTHWcw7CN4ZzlJoXm0FJbKQ==} peerDependencies: @@ -1479,6 +1467,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/select@3.6.9': + resolution: {integrity: sha512-vASUDv7FhEYQURzM+JIwcusPv7/x/l3zHc/oKJPvoCl3aa9pwS8hZwS82SC00o2iFnrDscfDJju4IE/cd4hucg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/selection@3.16.2': resolution: {integrity: sha512-C4eSKw7BIZHJLPzwqGqCnsyFHiUIEyryVQZTJDt6d0wYBOHU6k1pW+Q4VhrZuzSv+IMiI2RkiXeJKc55f0ZXrg==} peerDependencies: @@ -1489,6 +1482,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/selection@3.18.0': + resolution: {integrity: sha512-6EaNNP3exxBhW2LkcRR4a3pg+3oDguZlBSqIVVR7lyahv/D8xXHRC4dX+m0mgGHJpsgjs7664Xx6c8v193TFxg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/slider@3.5.7': resolution: {integrity: sha512-gEIGTcpBLcXixd8LYiLc8HKrBiGQJltrrEGoOvvTP8KVItXQxmeL+JiSsh8qgOoUdRRpzmAoFNUKGEg2/gtN8A==} peerDependencies: @@ -1499,6 +1497,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/slider@3.6.0': + resolution: {integrity: sha512-w5vJxVh267pmD1X+Ppd9S3ZzV1hcg0cV8q5P4Egr160b9WMcWlUspZPtsthwUlN7qQe/C8y5IAhtde4s29eNag==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/table@3.12.2': resolution: {integrity: sha512-dUcsrdALylhWz6exqIoqtR/dnrzjIAptMyAUPT378Y/mCYs4PxKkHSvtPEQrZhdQS1ALIIgfeg9KUVIempoXPw==} peerDependencies: @@ -1509,6 +1512,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/table@3.13.0': + resolution: {integrity: sha512-mRbNYrwQIE7xzVs09Lk3kPteEVFVyOc20vA8ph6EP54PiUf/RllJpxZe/WUYLf4eom9lUkRYej5sffuUBpxjCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/tabs@3.6.10': resolution: {integrity: sha512-F7wfoiNsrBy7c02AYHyE1USGgj05HQ0hp7uXmQjp2LEa+AA0NKKi3HdswTHHySxb0ZRuoEE7E7vp/gXQYx2/Ow==} peerDependencies: @@ -1519,6 +1527,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/tabs@3.7.0': + resolution: {integrity: sha512-ox4hTkfZCoR4Oyr3Op3rBlWNq2Wxie04vhEYpTZQ2hobR3l4fYaOkd7CPClILktJ3TC104j8wcb0knWxIBRx9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/toggle@3.7.7': resolution: {integrity: sha512-AS+xB4+hHWa3wzYkbS6pwBkovPfIE02B9SnuYTe0stKcuejpWKo5L3QMptW0ftFYsW3ZPCXuneImfObEw2T01A==} peerDependencies: @@ -1529,6 +1542,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/toggle@3.8.0': + resolution: {integrity: sha512-pyt/k/J8BwE/2g6LL6Z6sMSWRx9HEJB83Sm/MtovXnI66sxJ2EfQ1OaXB7Su5PEL9OMdoQF6Mb+N1RcW3zAoPw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/tooltip@3.4.12': resolution: {integrity: sha512-QKYT/cze7n9qaBsk7o5ais3jRfhYCzcVRfps+iys/W+/9FFbbhjfQG995Lwi6b+vGOHWfXxXpwmyIO2tzM1Iog==} peerDependencies: @@ -1539,6 +1557,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/tooltip@3.5.0': + resolution: {integrity: sha512-+xzPNztJDd2XJD0X3DgWKlrgOhMqZpSzsIssXeJgO7uCnP8/Z513ESaipJhJCFC8fxj5caO/DK4Uu8hEtlB8cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/tree@3.8.4': resolution: {integrity: sha512-HFNclIXJ/3QdGQWxXbj+tdlmIX/XwCfzAMB5m26xpJ6HtJhia6dtx3GLfcdyHNjmuRbAsTBsAAnnVKBmNRUdIQ==} peerDependencies: @@ -1549,16 +1572,21 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/utils@3.10.3': - resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} + '@react-stately/tree@3.8.6': + resolution: {integrity: sha512-lblUaxf1uAuIz5jm6PYtcJ+rXNNVkqyFWTIMx6g6gW/mYvm8GNx1G/0MLZE7E6CuDGaO9dkLSY2bB1uqyKHidA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-stately/utils@3.10.4': resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/utils@3.10.5': + resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-stately/virtualizer@4.1.0': resolution: {integrity: sha512-MOaqpY3NloXrpCBvVUb3HL1p3Bh4YRtUq8D2ufC909u5vM6n6G5Swk1XPJ9KHfaftGhb5serwLkm2/Aha5CTbA==} peerDependencies: @@ -1569,188 +1597,158 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/breadcrumbs@3.7.7': - resolution: {integrity: sha512-ZmhXwD2LLzfEA2OvOCp/QvXu8A/Edsrn5q0qUDGsmOZj9SCVeT82bIv8P+mQnATM13mi2gyoik6102Jc1OscJA==} + '@react-types/breadcrumbs@3.7.9': + resolution: {integrity: sha512-eARYJo8J+VfNV8vP4uw3L2Qliba9wLV2bx9YQCYf5Lc/OE5B/y4gaTLz+Y2P3Rtn6gBPLXY447zCs5i7gf+ICg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/breadcrumbs@3.7.8': - resolution: {integrity: sha512-+BW2a+PrY8ArZ+pKecz13oJFrUAhthvXx17o3x0BhWUhRpAdtmTYt2hjw8zNanm2j0Kvgo1HYKgvtskCRxYcOA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/button@3.10.0': resolution: {integrity: sha512-rAyU+N9VaHLBdZop4zasn8IDwf9I5Q1EzHUKMtzIFf5aUlMUW+K460zI/l8UESWRSWAXK9/WPSXGxfcoCEjvAA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/button@3.9.6': - resolution: {integrity: sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw==} + '@react-types/button@3.10.1': + resolution: {integrity: sha512-XTtap8o04+4QjPNAshFWOOAusUTxQlBjU2ai0BTVLShQEjHhRVDBIWsI2B2FKJ4KXT6AZ25llaxhNrreWGonmA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/calendar@3.4.10': resolution: {integrity: sha512-PyjqxwJxSW2IpQx6y0D9O34fRCWn1gv9q0qFhgaIigIQrPg8zTE/CC7owHLxAtgCnnCt8exJ5rqi414csaHKlA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/calendar@3.4.9': - resolution: {integrity: sha512-O/PS9c21HgO9qzxOyZ7/dTccxabFZdF6tj3UED4DrBw7AN3KZ7JMzwzYbwHinOcO7nUcklGgNoAIHk45UAKR9g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/checkbox@3.8.3': - resolution: {integrity: sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA==} + '@react-types/calendar@3.5.0': + resolution: {integrity: sha512-O3IRE7AGwAWYnvJIJ80cOy7WwoJ0m8GtX/qSmvXQAjC4qx00n+b5aFNBYAQtcyc3RM5QpW6obs9BfwGetFiI8w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/checkbox@3.8.4': resolution: {integrity: sha512-fvZrlQmlFNsYHZpl7GVmyYQlKdUtO5MczMSf8z3TlSiCb5Kl3ha9PsZgLhJqGuVnzB2ArIBz0eZrYa3k0PhcpA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/checkbox@3.9.0': + resolution: {integrity: sha512-9hbHx0Oo2Hp5a8nV8Q75LQR0DHtvOIJbFaeqESSopqmV9EZoYjtY/h0NS7cZetgahQgnqYWQi44XGooMDCsmxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-types/color@3.0.0': resolution: {integrity: sha512-VUH8CROAM69GsMBilrJ1xyAdVsWL01nXQYrkZJxAEApv1OrcpIGSdsXLcGrjsrhjjiNVXxWFnqYRMsKkLzIl7g==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/combobox@3.12.1': - resolution: {integrity: sha512-bd5YwHZWtgnJx4jGbplWbYzXj7IbO5w3IY5suNR7r891rx6IktquZ8GQwyYH0pQ/x+X5LdK2xI59i6+QC2PmlA==} + '@react-types/color@3.0.1': + resolution: {integrity: sha512-KemFziO3GbmT3HEKrgOGdqNA6Gsmy9xrwFO3f8qXSG7gVz6M27Ic4R9HVQv4iAjap5uti6W13/pk2bc/jLVcEA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/combobox@3.13.0': resolution: {integrity: sha512-kH/a+Fjpr54M2JbHg9RXwMjZ9O+XVsdOuE5JCpWRibJP1Mfl1md8gY6y6zstmVY8COrSqFvMZWB+PzwaTWjTGw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/datepicker@3.8.2': - resolution: {integrity: sha512-Ih4F0bNVGrEuwCD8XmmBAspuuOBsj/Svn/pDFtC2RyAZjXfWh+sI+n4XLz/sYKjvARh5TUI8GNy9smYS4vYXug==} + '@react-types/combobox@3.13.1': + resolution: {integrity: sha512-7xr+HknfhReN4QPqKff5tbKTe2kGZvH+DGzPYskAtb51FAAiZsKo+WvnNAvLwg3kRoC9Rkn4TAiVBp/HgymRDw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/datepicker@3.8.3': resolution: {integrity: sha512-Y4qfPRBB6uzocosCOWSYMuwiZ3YXwLWQYiFB4KCglkvHyltbNz76LgoBEnclYA5HjwosIk4XywiXvHSYry8JnQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/dialog@3.5.12': - resolution: {integrity: sha512-JmpQbSpXltqEyYfEwoqDolABIiojeExkqolHNdQlayIsfFuSxZxNwXZPOpz58Ri/iwv21JP7K3QF0Gb2Ohxl9w==} + '@react-types/datepicker@3.9.0': + resolution: {integrity: sha512-dbKL5Qsm2MQwOTtVQdOcKrrphcXAqDD80WLlSQrBLg+waDuuQ7H+TrvOT0thLKloNBlFUGnZZfXGRHINpih/0g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/dialog@3.5.13': - resolution: {integrity: sha512-9k8daVcAqQsySkzDY6NIVlyGxtpEip4TKuLyzAehthbv78GQardD5fHdjQ6eXPRS4I2qZrmytrFFrlOnwWVGHw==} + '@react-types/dialog@3.5.14': + resolution: {integrity: sha512-OXWMjrALwrlgw8aHD8SeRm/s3tbAssdaEh2h73KUSeFau3fU3n5mfKv+WnFqsEaOtN261o48l7hTlS6615H9AA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/form@3.7.7': resolution: {integrity: sha512-CVRjCawPhYRHi/LuikOC2kz5vgvmjjKmF4/wUgR2QzD1Ok4wY1ZGSx9M9EZptCIZAt2mToR6woyLUdtzy+foeQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/grid@3.2.8': - resolution: {integrity: sha512-6PJrpukwMqlv3IhJSDkJuVbhHM8Oe6hd2supWqd9adMXrlSP7QHt9a8SgFcFblCCTx8JzUaA0PvY5sTudcEtOQ==} + '@react-types/grid@3.2.10': + resolution: {integrity: sha512-Z5cG0ITwqjUE4kWyU5/7VqiPl4wqMJ7kG/ZP7poAnLmwRsR8Ai0ceVn+qzp5nTA19cgURi8t3LsXn3Ar1FBoog==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/grid@3.2.9': resolution: {integrity: sha512-eMw0d2UIZ4QTzGgD1wGGPw0cv67KjAOCp4TcwWjgDV7Wa5SVV/UvOmpnIVDyfhkG/4KRI5OR9h+isy76B726qA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/link@3.5.7': - resolution: {integrity: sha512-2WyaVmm1qr9UrSG3Dq6iz+2ziuVp+DH8CsYZ9CA6aNNb6U18Hxju3LTPb4a5gM0eC7W0mQGNBmrgGlAdDZEJOw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/link@3.5.8': - resolution: {integrity: sha512-l/YGXddgAbLnIT7ekftXrK1D4n8NlLQwx0d4usyZpaxP1KwPzuwng20DxynamLc1atoKBqbUtZAnz32pe7vYgw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/listbox@3.5.1': - resolution: {integrity: sha512-n5bOgD9lgfK1qaLtag9WPnu151SwXBCNn/OgGY/Br9mWRl+nPUEYtFcPX+2VCld7uThf54kwrTmzlFnaraIlcw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/listbox@3.5.2': - resolution: {integrity: sha512-ML/Bt/MeO0FiixcuFQ+smpu1WguxTOqHDjSnhc1vcNxVQFWQOhyVy01LAY2J/T9TjfjyYGD41vyMTI0f6fcLEQ==} + '@react-types/link@3.5.9': + resolution: {integrity: sha512-JcKDiDMqrq/5Vpn+BdWQEuXit4KN4HR/EgIi3yKnNbYkLzxBoeQZpQgvTaC7NEQeZnSqkyXQo3/vMUeX/ZNIKw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/menu@3.9.11': - resolution: {integrity: sha512-IguQVF70d7aHXgWB1Rd2a/PiIuLZ2Nt7lyayJshLcy/NLOYmgpTmTyn2WCtlA5lTfQwmQrNFf4EvnWkeljJXdA==} + '@react-types/listbox@3.5.3': + resolution: {integrity: sha512-v1QXd9/XU3CCKr2Vgs7WLcTr6VMBur7CrxHhWZQQFExsf9bgJ/3wbUdjy4aThY/GsYHiaS38EKucCZFr1QAfqA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/menu@3.9.12': resolution: {integrity: sha512-1SPnkHKJdvOfwv9fEgK1DI6DYRs4D3hW2XcWlLhVXSjaC68CzOHGwFhKIKvZiDTW/11L770PRSEloIxHR09uFQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/meter@3.4.3': - resolution: {integrity: sha512-Y2fX5CTAPGRKxVSeepbeyN6/K+wlF9pMRcNxTSU2qDwdoFqNCtTWMcWuCsU/Y2L/zU0jFWu4x0Vo7WkrcsgcMA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/meter@3.4.4': - resolution: {integrity: sha512-0SEmPkShByC1gYkW7l+iJPg8QfEe2VrgwTciAtTfC4KIqAYmJVQtq6L+4d72EMxOh8RpQHePaY/RFHEJXAh72A==} + '@react-types/menu@3.9.13': + resolution: {integrity: sha512-7SuX6E2tDsqQ+HQdSvIda1ji/+ujmR86dtS9CUu5yWX91P25ufRjZ72EvLRqClWNQsj1Xl4+2zBDLWlceznAjw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/numberfield@3.8.5': - resolution: {integrity: sha512-LVWggkxwd1nyVZomXBPfQA1E4I4/i4PBifjcDs2AfcV7q5RE9D+DVIDXsYucVOBxPlDOxiAq/T9ypobspWSwHw==} + '@react-types/meter@3.4.5': + resolution: {integrity: sha512-04w1lEtvP/c3Ep8ND8hhH2rwjz2MtQ8o8SNLhahen3u0rX3jKOgD4BvHujsyvXXTMjj1Djp74sGzNawb4Ppi9w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/numberfield@3.8.6': resolution: {integrity: sha512-VtWEMAXUO1S9EEZI8whc7xv6DVccxhbWsRthMCg/LxiwU3U5KAveadNc2c5rtXkRpd3cnD5xFzz3dExXdmHkAg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/overlays@3.8.10': - resolution: {integrity: sha512-IcnB+VYfAJazRjWhBKZTmVMh3KTp/B1rRbcKkPx6t8djP9UQhKcohP7lAALxjJ56Jjz/GFC6rWyUcnYH0NFVRA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/overlays@3.8.9': - resolution: {integrity: sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig==} + '@react-types/numberfield@3.8.7': + resolution: {integrity: sha512-KccMPi39cLoVkB2T0V7HW6nsxQVAwt89WWCltPZJVGzsebv/k0xTQlPVAgrUake4kDLoE687e3Fr/Oe3+1bDhw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/progress@3.5.6': - resolution: {integrity: sha512-Nh43sjQ5adyN1bTHBPRaIPhXUdBqP0miYeJpeMY3V/KUl4qmouJLwDnccwFG4xLm6gBfYe22lgbbV7nAfNnuTQ==} + '@react-types/overlays@3.8.10': + resolution: {integrity: sha512-IcnB+VYfAJazRjWhBKZTmVMh3KTp/B1rRbcKkPx6t8djP9UQhKcohP7lAALxjJ56Jjz/GFC6rWyUcnYH0NFVRA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/progress@3.5.7': - resolution: {integrity: sha512-EqMDHmlpoZUZzTjdejGIkSM0pS2LBI9NdadHf3bDNTycHv+5L1xpMHUg8RGOW8a3sRVLRvfN1aO9l75QZkyj+w==} + '@react-types/overlays@3.8.11': + resolution: {integrity: sha512-aw7T0rwVI3EuyG5AOaEIk8j7dZJQ9m34XAztXJVZ/W2+4pDDkLDbJ/EAPnuo2xGYRGhowuNDn4tDju01eHYi+w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/radio@3.8.3': - resolution: {integrity: sha512-fUVJt4Bb6jOReFqnhHVNxWXH7t6c60uSFfoPKuXt/xI9LL1i2jhpur0ggpTfIn3qLIAmNBU6bKBCWAdr4KjeVQ==} + '@react-types/progress@3.5.8': + resolution: {integrity: sha512-PR0rN5mWevfblR/zs30NdZr+82Gka/ba7UHmYOW9/lkKlWeD7PHgl1iacpd/3zl/jUF22evAQbBHmk1mS6Mpqw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/radio@3.8.4': resolution: {integrity: sha512-GCuOwQL19iwKa74NAIk9hv4ivyI8oW1+ZCuc2fzyDdeQjzTIlv3qrIyShwpVy1IoI7/4DYTMZm/YXPoKhu5TTA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/searchfield@3.5.8': - resolution: {integrity: sha512-EcdqalHNIC6BJoRfmqUhAvXRd3aHkWlV1cFCz57JJKgUEFYyXPNrXd1b73TKLzTXEk+X/D6LKV15ILYpEaxu8w==} + '@react-types/radio@3.8.5': + resolution: {integrity: sha512-gSImTPid6rsbJmwCkTliBIU/npYgJHOFaI3PNJo7Y0QTAnFelCtYeFtBiWrFodSArSv7ASqpLLUEj9hZu/rxIg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/searchfield@3.5.9': - resolution: {integrity: sha512-c/x8BWpH1Zq+fWpeBtzw2AhQhGi7ahWPicV7PlnqwIGO0MrH/QCjX0dj+I+1xpcAh8Eq6ECa79HE74Rw6aJmFg==} + '@react-types/searchfield@3.5.10': + resolution: {integrity: sha512-7wW4pJzbReawoGPu8a4l+CODTCDN088EN/ysUzl622ewim57PjArjix+lpO4+aEtJqS9HKpq8UEbjwo9axpcUA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/select@3.9.6': - resolution: {integrity: sha512-cVSFR0eJLup/ht1Uto+y8uyLmHO89J6wNh65SIHb3jeVz9oLBAedP3YNI2qB+F9qFMUcA8PBSLXIIuT6gXzLgQ==} + '@react-types/searchfield@3.5.9': + resolution: {integrity: sha512-c/x8BWpH1Zq+fWpeBtzw2AhQhGi7ahWPicV7PlnqwIGO0MrH/QCjX0dj+I+1xpcAh8Eq6ECa79HE74Rw6aJmFg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 @@ -1759,76 +1757,76 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/shared@3.24.1': - resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} + '@react-types/select@3.9.8': + resolution: {integrity: sha512-RGsYj2oFjXpLnfcvWMBQnkcDuKkwT43xwYWZGI214/gp/B64tJiIUgTM5wFTRAeGDX23EePkhCQF+9ctnqFd6g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/shared@3.25.0': resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/slider@3.7.5': - resolution: {integrity: sha512-bRitwQRQjQoOcKEdPMljnvm474dwrmsc6pdsVQDh/qynzr+KO9IHuYc3qPW53WVE2hMQJDohlqtCAWQXWQ5Vcg==} + '@react-types/shared@3.26.0': + resolution: {integrity: sha512-6FuPqvhmjjlpEDLTiYx29IJCbCNWPlsyO+ZUmCUXzhUv2ttShOXfw8CmeHWHftT/b2KweAWuzqSlfeXPR76jpw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/slider@3.7.6': resolution: {integrity: sha512-z72wnEzSge6qTD9TUoUPp1A4j4jXk/MVii6rGE78XeE/Pq7HyyjU5bCagryMr9PC9MKa/oTiHcshKqWBDf57GA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/switch@3.5.5': - resolution: {integrity: sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/switch@3.5.6': - resolution: {integrity: sha512-gJ8t2yTCgcitz4ON4ELcLLmtlDkn2MUjjfu3ez/cwA1X/NUluPYkhXj5Z6H+KOlnveqrKCZDRoTgK74cQ6Cvfg==} + '@react-types/slider@3.7.7': + resolution: {integrity: sha512-lYTR9zXQV2fSEm/G3gwDENWiki1IXd/oorsgf0zu1DBi2SQDbOsLsGUXiwvD24Xy6OkUuhAqjLPPexezo7+u9g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/table@3.10.1': - resolution: {integrity: sha512-xsNh0Gm4GtNeSknZqkMsfGvc94fycmfhspGO+FzQKim2hB5k4yILwd+lHYQ2UKW6New9GVH/zN2Pd3v67IeZ2g==} + '@react-types/switch@3.5.7': + resolution: {integrity: sha512-1IKiq510rPTHumEZuhxuazuXBa2Cuxz6wBIlwf3NCVmgWEvU+uk1ETG0sH2yymjwCqhtJDKXi+qi9HSgPEDwAg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/table@3.10.2': resolution: {integrity: sha512-YzA4hcsYfnFFpA2UyGb1KKhLpWgaj5daApqjp126tCIosl8k1KxZmhKD50cwH0Jm19lALJseqo5VdlcJtcr4qg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/table@3.10.3': + resolution: {integrity: sha512-Ac+W+m/zgRzlTU8Z2GEg26HkuJFswF9S6w26r+R3MHwr8z2duGPvv37XRtE1yf3dbpRBgHEAO141xqS2TqGwNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-types/tabs@3.3.10': resolution: {integrity: sha512-s/Bw/HCIdWJPBw4O703ghKqhjGsIerRMIDxA88hbQYzfTDD6bkFDjCnsP2Tyy1G8Dg2rSPFUEE+k+PpLzqeEfQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/tabs@3.3.9': - resolution: {integrity: sha512-3Q9kRVvg/qDyeJR/W1+C2z2OyvDWQrSLvOCvAezX5UKzww4rBEAA8OqBlyDwn7q3fiwrh/m64l6p+dbln+RdxQ==} + '@react-types/tabs@3.3.11': + resolution: {integrity: sha512-BjF2TqBhZaIcC4lc82R5pDJd1F7kstj1K0Nokhz99AGYn8C0ITdp6lR+DPVY9JZRxKgP9R2EKfWGI90Lo7NQdA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/textfield@3.9.6': - resolution: {integrity: sha512-0uPqjJh4lYp1aL1HL9IlV8Cgp8eT0PcsNfdoCktfkLytvvBPmox2Pfm57W/d0xTtzZu2CjxhYNTob+JtGAOeXA==} + '@react-types/textfield@3.10.0': + resolution: {integrity: sha512-ShU3d6kLJGQjPXccVFjM3KOXdj3uyhYROqH9YgSIEVxgA9W6LRflvk/IVBamD9pJYTPbwmVzuP0wQkTDupfZ1w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/textfield@3.9.7': resolution: {integrity: sha512-vU5+QCOF9HgWGjAmmy+cpJibVW5voFomC5POmYHokm7kivYcMMjlonsgWwg/0xXrqE2qosH3tpz4jFoEuig1NQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/tooltip@3.4.11': - resolution: {integrity: sha512-WPikHQxeT5Lb09yJEaW6Ja3ecE0g1YM6ukWYS2v/iZLUPn5YlYrGytspuCYQNSh/u7suCz4zRLEHYCl7OCigjw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/tooltip@3.4.12': resolution: {integrity: sha512-FwsdSQ3UDIDORanQMGMLyzSUabw4AkKhwcRdPv4d5OT8GmJr7mBdZynfcsrKLJ0fzskIypMqspoutZidsI0MQg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/tooltip@3.4.13': + resolution: {integrity: sha512-KPekFC17RTT8kZlk7ZYubueZnfsGTDOpLw7itzolKOXGddTXsrJGBzSB4Bb060PBVllaDO0MOrhPap8OmrIl1Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@redocly/ajv@8.11.2': resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} @@ -3361,6 +3359,9 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -4521,17 +4522,11 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-aria@3.34.3: - resolution: {integrity: sha512-wSprEI5EojDFCm357MxnKAxJZN68OYIt6UH6N0KCo6MEUAVZMbhMSmGYjw/kLK4rI7KrbJDqGqUMQkwc93W9Ng==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - react-aria@3.35.0: - resolution: {integrity: sha512-cbbd3iIveLDRnpVrpc1iuz8OMlDdH6u8EjncW3MQuYOiEGaho9xcDtWMKiSEIZASEnd7LK4Rgm5iVPr2O+cssw==} + react-aria@3.36.0: + resolution: {integrity: sha512-AK5XyIhAN+e5HDlwlF+YwFrOrVI7RYmZ6kg/o7ZprQjkYqYKapXeUpWscmNm/3H2kDboE5Z4ymUnK6ZhobLqOw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} @@ -4607,8 +4602,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-syntax-highlighter@15.5.0: - resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + react-syntax-highlighter@15.6.1: + resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} peerDependencies: react: '>= 0.14.0' @@ -5454,7 +5449,7 @@ snapshots: lodash: 4.17.21 match-sorter: 6.3.1 react: 18.3.1 - react-aria: 3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-aria: 3.36.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-aria-components: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-stately: 3.32.2(react@18.3.1) @@ -5853,33 +5848,29 @@ snapshots: dependencies: '@types/node': 20.12.12 - '@internationalized/date@3.5.5': - dependencies: - '@swc/helpers': 0.5.1 - '@internationalized/date@3.5.6': dependencies: '@swc/helpers': 0.5.1 - '@internationalized/message@3.1.4': + '@internationalized/date@3.6.0': dependencies: '@swc/helpers': 0.5.1 - intl-messageformat: 10.2.5 '@internationalized/message@3.1.5': dependencies: '@swc/helpers': 0.5.1 intl-messageformat: 10.2.5 - '@internationalized/number@3.5.3': + '@internationalized/message@3.1.6': dependencies: '@swc/helpers': 0.5.1 + intl-messageformat: 10.2.5 '@internationalized/number@3.5.4': dependencies: '@swc/helpers': 0.5.1 - '@internationalized/string@3.2.3': + '@internationalized/number@3.6.0': dependencies: '@swc/helpers': 0.5.1 @@ -5887,6 +5878,10 @@ snapshots: dependencies: '@swc/helpers': 0.5.1 + '@internationalized/string@3.2.5': + dependencies: + '@swc/helpers': 0.5.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6160,23 +6155,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/breadcrumbs@3.5.16(react@18.3.1)': + '@react-aria/breadcrumbs@3.5.19(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/link': 3.7.4(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/breadcrumbs': 3.7.7(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/breadcrumbs@3.5.17(react@18.3.1)': - dependencies: - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/link': 3.7.5(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/breadcrumbs': 3.7.8(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/link': 3.7.7(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/breadcrumbs': 3.7.9(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6191,74 +6176,45 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/button@3.9.8(react@18.3.1)': + '@react-aria/button@3.11.0(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/toggle': 3.7.7(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/toolbar': 3.0.0-beta.11(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/toggle': 3.8.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/calendar@3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/calendar@3.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.5 - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/calendar': 3.5.4(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/calendar': 3.4.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/calendar@3.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@internationalized/date': 3.5.6 - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/live-announcer': 3.4.0 - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/calendar': 3.5.5(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/calendar': 3.4.10(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@internationalized/date': 3.6.0 + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/calendar': 3.6.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/calendar': 3.5.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/checkbox@3.14.6(react@18.3.1)': - dependencies: - '@react-aria/form': 3.0.8(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/toggle': 3.10.7(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/checkbox': 3.6.8(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/toggle': 3.7.7(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/checkbox@3.14.7(react@18.3.1)': + '@react-aria/checkbox@3.15.0(react@18.3.1)': dependencies: - '@react-aria/form': 3.0.9(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/toggle': 3.10.8(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/checkbox': 3.6.9(react@18.3.1) - '@react-stately/form': 3.0.6(react@18.3.1) - '@react-stately/toggle': 3.7.8(react@18.3.1) - '@react-types/checkbox': 3.8.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/form': 3.0.11(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/toggle': 3.10.10(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/checkbox': 3.6.10(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/toggle': 3.8.0(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6290,110 +6246,84 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/combobox@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/color@3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.8(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/combobox': 3.9.2(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/combobox': 3.12.1(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/numberfield': 3.11.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/slider': 3.7.14(react@18.3.1) + '@react-aria/spinbutton': 3.6.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.15.0(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-aria/visually-hidden': 3.8.18(react@18.3.1) + '@react-stately/color': 3.8.1(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-types/color': 3.0.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/combobox@3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/combobox@3.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/listbox': 3.13.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/live-announcer': 3.4.0 - '@react-aria/menu': 3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.23.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.9(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/collections': 3.11.0(react@18.3.1) - '@react-stately/combobox': 3.10.0(react@18.3.1) - '@react-stately/form': 3.0.6(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/combobox': 3.13.0(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/datepicker@3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@internationalized/date': 3.5.5 - '@internationalized/number': 3.5.3 - '@internationalized/string': 3.2.3 - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/form': 3.0.8(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/datepicker': 3.10.2(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/calendar': 3.4.9(react@18.3.1) - '@react-types/datepicker': 3.8.2(react@18.3.1) - '@react-types/dialog': 3.5.12(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/listbox': 3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/menu': 3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.15.0(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/combobox': 3.10.1(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/combobox': 3.13.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/datepicker@3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@internationalized/date': 3.5.6 - '@internationalized/number': 3.5.4 - '@internationalized/string': 3.2.4 - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/form': 3.0.9(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/spinbutton': 3.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/datepicker': 3.10.3(react@18.3.1) - '@react-stately/form': 3.0.6(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/calendar': 3.4.10(react@18.3.1) - '@react-types/datepicker': 3.8.3(react@18.3.1) - '@react-types/dialog': 3.5.13(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/datepicker@3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@internationalized/date': 3.6.0 + '@internationalized/number': 3.6.0 + '@internationalized/string': 3.2.5 + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/form': 3.0.11(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/spinbutton': 3.6.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/datepicker': 3.11.0(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/calendar': 3.5.0(react@18.3.1) + '@react-types/datepicker': 3.9.0(react@18.3.1) + '@react-types/dialog': 3.5.14(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/dialog@3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/dialog@3.5.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/dialog': 3.5.12(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/overlays': 3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/dialog': 3.5.14(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/dialog@3.5.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/disclosure@3.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/overlays': 3.23.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/dialog': 3.5.13(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/disclosure': 3.0.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6413,21 +6343,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/dnd@3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@internationalized/string': 3.2.3 - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/dnd': 3.4.2(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@react-aria/dnd@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@internationalized/string': 3.2.4 @@ -6443,14 +6358,20 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/focus@3.18.2(react@18.3.1)': + '@react-aria/dnd@3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/string': 3.2.5 + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/overlays': 3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/dnd': 3.5.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 - clsx: 2.1.0 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@react-aria/focus@3.18.3(react@18.3.1)': dependencies: @@ -6461,12 +6382,21 @@ snapshots: clsx: 2.1.0 react: 18.3.1 - '@react-aria/form@3.0.8(react@18.3.1)': + '@react-aria/focus@3.19.0(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + clsx: 2.1.0 + react: 18.3.1 + + '@react-aria/form@3.0.11(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6479,24 +6409,6 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/grid@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/grid': 3.9.2(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) - '@react-types/grid': 3.2.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@react-aria/grid@3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.3(react@18.3.1) @@ -6515,18 +6427,36 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/gridlist@3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/grid@3.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-stately/tree': 3.8.4(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/grid': 3.10.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/grid': 3.2.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/gridlist@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/grid': 3.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-stately/tree': 3.8.6(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6547,18 +6477,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/i18n@3.12.2(react@18.3.1)': - dependencies: - '@internationalized/date': 3.5.5 - '@internationalized/message': 3.1.4 - '@internationalized/number': 3.5.3 - '@internationalized/string': 3.2.3 - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - '@react-aria/i18n@3.12.3(react@18.3.1)': dependencies: '@internationalized/date': 3.5.6 @@ -6571,11 +6489,15 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/interactions@3.22.2(react@18.3.1)': + '@react-aria/i18n@3.12.4(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/date': 3.6.0 + '@internationalized/message': 3.1.6 + '@internationalized/number': 3.6.0 + '@internationalized/string': 3.2.5 + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6587,10 +6509,11 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/label@3.7.11(react@18.3.1)': + '@react-aria/interactions@3.22.5(react@18.3.1)': dependencies: - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6601,79 +6524,44 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/link@3.7.4(react@18.3.1)': + '@react-aria/label@3.7.13(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/link': 3.5.7(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/link@3.7.5(react@18.3.1)': + '@react-aria/link@3.7.7(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/link': 3.5.8(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/link': 3.5.9(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/listbox@3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/listbox@3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-types/listbox': 3.5.1(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-types/listbox': 3.5.3(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/listbox@3.13.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/collections': 3.11.0(react@18.3.1) - '@react-stately/list': 3.11.0(react@18.3.1) - '@react-types/listbox': 3.5.2(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/live-announcer@3.3.4': - dependencies: - '@swc/helpers': 0.5.1 - '@react-aria/live-announcer@3.4.0': dependencies: '@swc/helpers': 0.5.1 - '@react-aria/menu@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/live-announcer@3.4.1': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/menu': 3.8.2(react@18.3.1) - '@react-stately/tree': 3.8.4(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/menu': 3.9.11(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) '@react-aria/menu@3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -6693,37 +6581,32 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/meter@3.4.16(react@18.3.1)': + '@react-aria/menu@3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/progress': 3.4.16(react@18.3.1) - '@react-types/meter': 3.4.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/meter@3.4.17(react@18.3.1)': - dependencies: - '@react-aria/progress': 3.4.17(react@18.3.1) - '@react-types/meter': 3.4.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/overlays': 3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/menu': 3.9.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-stately/tree': 3.8.6(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/menu': 3.9.13(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@react-aria/numberfield@3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/meter@3.4.18(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.8(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/numberfield': 3.9.6(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/numberfield': 3.8.5(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/progress': 3.4.18(react@18.3.1) + '@react-types/meter': 3.4.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) '@react-aria/numberfield@3.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -6741,18 +6624,18 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/overlays@3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/numberfield@3.11.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-aria/visually-hidden': 3.8.15(react@18.3.1) - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/overlays': 3.8.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/spinbutton': 3.6.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.15.0(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/numberfield': 3.9.8(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/numberfield': 3.8.7(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6773,124 +6656,73 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/progress@3.4.16(react@18.3.1)': - dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/progress': 3.5.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/progress@3.4.17(react@18.3.1)': - dependencies: - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/progress': 3.5.7(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/radio@3.10.7(react@18.3.1)': + '@react-aria/overlays@3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/form': 3.0.8(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/radio': 3.10.7(react@18.3.1) - '@react-types/radio': 3.8.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-aria/visually-hidden': 3.8.18(react@18.3.1) + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/overlays': 3.8.11(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@react-aria/radio@3.10.8(react@18.3.1)': + '@react-aria/progress@3.4.18(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/form': 3.0.9(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/radio': 3.10.8(react@18.3.1) - '@react-types/radio': 3.8.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/progress': 3.5.8(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/searchfield@3.7.8(react@18.3.1)': + '@react-aria/radio@3.10.10(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/textfield': 3.14.8(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/searchfield': 3.5.6(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/searchfield': 3.5.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/form': 3.0.11(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/radio': 3.10.9(react@18.3.1) + '@react-types/radio': 3.8.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/searchfield@3.7.9(react@18.3.1)': + '@react-aria/searchfield@3.7.11(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/textfield': 3.14.9(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/searchfield': 3.5.7(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/searchfield': 3.5.9(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/textfield': 3.15.0(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/searchfield': 3.5.8(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/searchfield': 3.5.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/select@3.14.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/select@3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/form': 3.0.9(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/listbox': 3.13.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-aria/visually-hidden': 3.8.16(react@18.3.1) - '@react-stately/select': 3.6.8(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/select': 3.9.7(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/select@3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/form': 3.0.8(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-aria/visually-hidden': 3.8.15(react@18.3.1) - '@react-stately/select': 3.6.7(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/select': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/selection@3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/form': 3.0.11(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/listbox': 3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-aria/visually-hidden': 3.8.18(react@18.3.1) + '@react-stately/select': 3.6.9(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/select': 3.9.8(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6907,30 +6739,22 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/separator@3.4.2(react@18.3.1)': + '@react-aria/selection@3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/separator@3.4.3(react@18.3.1)': - dependencies: - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@react-aria/slider@3.7.11(react@18.3.1)': + '@react-aria/separator@3.4.4(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/slider': 3.5.7(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/slider': 3.7.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -6947,13 +6771,26 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/spinbutton@3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/slider@3.7.14(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/slider': 3.6.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/slider': 3.7.7(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-aria/spinbutton@3.6.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6969,143 +6806,73 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/ssr@3.9.5(react@18.3.1)': - dependencies: - '@swc/helpers': 0.5.1 - react: 18.3.1 - '@react-aria/ssr@3.9.6(react@18.3.1)': dependencies: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/switch@3.6.7(react@18.3.1)': + '@react-aria/ssr@3.9.7(react@18.3.1)': dependencies: - '@react-aria/toggle': 3.10.7(react@18.3.1) - '@react-stately/toggle': 3.7.7(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/switch': 3.5.5(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/switch@3.6.8(react@18.3.1)': - dependencies: - '@react-aria/toggle': 3.10.8(react@18.3.1) - '@react-stately/toggle': 3.7.8(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@react-types/switch': 3.5.6(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/table@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/live-announcer': 3.3.4 - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-aria/visually-hidden': 3.8.15(react@18.3.1) - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/flags': 3.0.3 - '@react-stately/table': 3.12.2(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) - '@react-types/grid': 3.2.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/table': 3.10.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-aria/table@3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/grid': 3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/live-announcer': 3.4.0 - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-aria/visually-hidden': 3.8.16(react@18.3.1) - '@react-stately/collections': 3.11.0(react@18.3.1) - '@react-stately/flags': 3.0.4 - '@react-stately/table': 3.12.3(react@18.3.1) - '@react-types/checkbox': 3.8.4(react@18.3.1) - '@react-types/grid': 3.2.9(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@react-types/table': 3.10.2(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@react-aria/tabs@3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/switch@3.6.10(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/tabs': 3.6.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/tabs': 3.3.9(react@18.3.1) + '@react-aria/toggle': 3.10.10(react@18.3.1) + '@react-stately/toggle': 3.8.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/switch': 3.5.7(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@react-aria/tabs@3.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/table@3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/tabs': 3.6.10(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@react-types/tabs': 3.3.10(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/grid': 3.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/live-announcer': 3.4.1 + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-aria/visually-hidden': 3.8.18(react@18.3.1) + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/flags': 3.0.5 + '@react-stately/table': 3.13.0(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/grid': 3.2.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/table': 3.10.3(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/tag@3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/tabs@3.9.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-types/button': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/tabs': 3.7.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/tabs': 3.3.11(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/tag@3.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/tag@3.4.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/gridlist': 3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/list': 3.11.0(react@18.3.1) - '@react-types/button': 3.10.0(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/gridlist': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-types/button': 3.10.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/textfield@3.14.8(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/form': 3.0.8(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/textfield': 3.9.6(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - '@react-aria/textfield@3.14.9(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.3(react@18.3.1) @@ -7119,25 +6886,36 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/toggle@3.10.7(react@18.3.1)': + '@react-aria/textfield@3.15.0(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/toggle': 3.7.7(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/form': 3.0.11(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/textfield': 3.10.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/toggle@3.10.8(react@18.3.1)': + '@react-aria/toggle@3.10.10(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/toggle': 3.7.8(react@18.3.1) - '@react-types/checkbox': 3.8.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/toggle': 3.8.0(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-aria/toolbar@3.0.0-beta.11(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7150,25 +6928,14 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-aria/tooltip@3.7.7(react@18.3.1)': + '@react-aria/tooltip@3.7.10(react@18.3.1)': dependencies: - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-stately/tooltip': 3.4.12(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/tooltip': 3.4.11(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - - '@react-aria/tooltip@3.7.8(react@18.3.1)': - dependencies: - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-stately/tooltip': 3.4.13(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) - '@react-types/tooltip': 3.4.12(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-stately/tooltip': 3.5.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/tooltip': 3.4.13(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7185,20 +6952,20 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/utils@3.25.2(react@18.3.1)': + '@react-aria/utils@3.25.3(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/ssr': 3.9.6(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 clsx: 2.1.0 react: 18.3.1 - '@react-aria/utils@3.25.3(react@18.3.1)': + '@react-aria/utils@3.26.0(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.6(react@18.3.1) - '@react-stately/utils': 3.10.4(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 clsx: 2.1.0 react: 18.3.1 @@ -7214,14 +6981,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/visually-hidden@3.8.15(react@18.3.1)': - dependencies: - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.1 - react: 18.3.1 - '@react-aria/visually-hidden@3.8.16(react@18.3.1)': dependencies: '@react-aria/interactions': 3.22.3(react@18.3.1) @@ -7230,6 +6989,14 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-aria/visually-hidden@3.8.18(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-spring/animated@9.7.2(react@18.3.1)': dependencies: '@react-spring/shared': 9.7.2(react@18.3.1) @@ -7265,10 +7032,10 @@ snapshots: '@react-stately/calendar@3.5.4(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.5 - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/calendar': 3.4.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/date': 3.5.6 + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/calendar': 3.4.10(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7281,12 +7048,30 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/calendar@3.6.0(react@18.3.1)': + dependencies: + '@internationalized/date': 3.6.0 + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/calendar': 3.5.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-stately/checkbox@3.6.10(react@18.3.1)': + dependencies: + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/checkbox@3.6.8(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/checkbox': 3.8.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7301,13 +7086,19 @@ snapshots: '@react-stately/collections@3.10.9(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-stately/collections@3.11.0(react@18.3.1)': + dependencies: + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-stately/collections@3.11.0(react@18.3.1)': + '@react-stately/collections@3.12.0(react@18.3.1)': dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7325,6 +7116,20 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/color@3.8.1(react@18.3.1)': + dependencies: + '@internationalized/number': 3.6.0 + '@internationalized/string': 3.2.5 + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/numberfield': 3.9.8(react@18.3.1) + '@react-stately/slider': 3.6.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/color': 3.0.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/combobox@3.10.0(react@18.3.1)': dependencies: '@react-stately/collections': 3.11.0(react@18.3.1) @@ -7338,22 +7143,35 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/combobox@3.10.1(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-stately/select': 3.6.9(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/combobox': 3.13.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/combobox@3.9.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-stately/select': 3.6.7(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/combobox': 3.12.1(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/list': 3.11.0(react@18.3.1) + '@react-stately/overlays': 3.6.11(react@18.3.1) + '@react-stately/select': 3.6.8(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/combobox': 3.13.0(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 '@react-stately/data@3.11.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7365,13 +7183,13 @@ snapshots: '@react-stately/datepicker@3.10.2(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.5 - '@internationalized/string': 3.2.3 - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/datepicker': 3.8.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/date': 3.5.6 + '@internationalized/string': 3.2.4 + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/overlays': 3.6.11(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/datepicker': 3.8.3(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7387,6 +7205,25 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/datepicker@3.11.0(react@18.3.1)': + dependencies: + '@internationalized/date': 3.6.0 + '@internationalized/string': 3.2.5 + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/datepicker': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-stately/disclosure@3.0.0(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/disclosure@3.0.0-alpha.0(react@18.3.1)': dependencies: '@react-stately/utils': 3.10.4(react@18.3.1) @@ -7396,8 +7233,8 @@ snapshots: '@react-stately/dnd@3.4.2(react@18.3.1)': dependencies: - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/selection': 3.17.0(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7408,17 +7245,24 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-stately/flags@3.0.3': + '@react-stately/dnd@3.5.0(react@18.3.1)': dependencies: + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 + react: 18.3.1 '@react-stately/flags@3.0.4': dependencies: '@swc/helpers': 0.5.1 + '@react-stately/flags@3.0.5': + dependencies: + '@swc/helpers': 0.5.1 + '@react-stately/form@3.0.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7428,12 +7272,27 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/form@3.1.0(react@18.3.1)': + dependencies: + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-stately/grid@3.10.0(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-types/grid': 3.2.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/grid@3.9.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-types/grid': 3.2.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/selection': 3.17.0(react@18.3.1) + '@react-types/grid': 3.2.9(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7459,10 +7318,10 @@ snapshots: '@react-stately/list@3.10.8(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/selection': 3.17.0(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7475,11 +7334,20 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/list@3.11.1(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/menu@3.8.2(react@18.3.1)': dependencies: - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-types/menu': 3.9.11(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/overlays': 3.6.11(react@18.3.1) + '@react-types/menu': 3.9.12(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7491,12 +7359,20 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/menu@3.9.0(react@18.3.1)': + dependencies: + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-types/menu': 3.9.13(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/numberfield@3.9.6(react@18.3.1)': dependencies: - '@internationalized/number': 3.5.3 - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/numberfield': 3.8.5(react@18.3.1) + '@internationalized/number': 3.5.4 + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/numberfield': 3.8.6(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7509,10 +7385,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/numberfield@3.9.8(react@18.3.1)': + dependencies: + '@internationalized/number': 3.6.0 + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/numberfield': 3.8.7(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/overlays@3.6.10(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/overlays': 3.8.9(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/overlays': 3.8.10(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7523,12 +7408,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/overlays@3.6.12(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/overlays': 3.8.11(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/radio@3.10.7(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/radio': 3.8.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/radio': 3.8.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7541,10 +7433,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/radio@3.10.9(react@18.3.1)': + dependencies: + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/radio': 3.8.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/searchfield@3.5.6(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/searchfield': 3.5.8(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/searchfield': 3.5.9(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7555,13 +7456,20 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/searchfield@3.5.8(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/searchfield': 3.5.10(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/select@3.6.7(react@18.3.1)': dependencies: - '@react-stately/form': 3.0.5(react@18.3.1) - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-types/select': 3.9.6(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.6(react@18.3.1) + '@react-stately/list': 3.11.0(react@18.3.1) + '@react-stately/overlays': 3.6.11(react@18.3.1) + '@react-types/select': 3.9.7(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7575,11 +7483,21 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/select@3.6.9(react@18.3.1)': + dependencies: + '@react-stately/form': 3.1.0(react@18.3.1) + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-types/select': 3.9.8(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/selection@3.16.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7591,11 +7509,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/selection@3.18.0(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/slider@3.5.7(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/slider': 3.7.5(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/slider': 3.7.6(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7607,16 +7533,24 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/slider@3.6.0(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/slider': 3.7.7(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/table@3.12.2(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/flags': 3.0.3 + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/flags': 3.0.4 '@react-stately/grid': 3.9.2(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/grid': 3.2.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/table': 3.10.1(react@18.3.1) + '@react-stately/selection': 3.17.0(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/grid': 3.2.9(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/table': 3.10.2(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7633,6 +7567,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/table@3.13.0(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/flags': 3.0.5 + '@react-stately/grid': 3.10.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/grid': 3.2.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/table': 3.10.3(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/tabs@3.6.10(react@18.3.1)': dependencies: '@react-stately/list': 3.11.0(react@18.3.1) @@ -7643,16 +7590,24 @@ snapshots: '@react-stately/tabs@3.6.9(react@18.3.1)': dependencies: - '@react-stately/list': 3.10.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/tabs': 3.3.9(react@18.3.1) + '@react-stately/list': 3.11.0(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/tabs': 3.3.10(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + + '@react-stately/tabs@3.7.0(react@18.3.1)': + dependencies: + '@react-stately/list': 3.11.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/tabs': 3.3.11(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 '@react-stately/toggle@3.7.7(react@18.3.1)': dependencies: - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/checkbox': 3.8.3(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/checkbox': 3.8.4(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7663,10 +7618,18 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/toggle@3.8.0(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/checkbox': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/tooltip@3.4.12(react@18.3.1)': dependencies: - '@react-stately/overlays': 3.6.10(react@18.3.1) - '@react-types/tooltip': 3.4.11(react@18.3.1) + '@react-stately/overlays': 3.6.11(react@18.3.1) + '@react-types/tooltip': 3.4.12(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7677,12 +7640,19 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/tooltip@3.5.0(react@18.3.1)': + dependencies: + '@react-stately/overlays': 3.6.12(react@18.3.1) + '@react-types/tooltip': 3.4.13(react@18.3.1) + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/tree@3.8.4(react@18.3.1)': dependencies: - '@react-stately/collections': 3.10.9(react@18.3.1) - '@react-stately/selection': 3.16.2(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.11.0(react@18.3.1) + '@react-stately/selection': 3.17.0(react@18.3.1) + '@react-stately/utils': 3.10.4(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7695,8 +7665,12 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 - '@react-stately/utils@3.10.3(react@18.3.1)': + '@react-stately/tree@3.8.6(react@18.3.1)': dependencies: + '@react-stately/collections': 3.12.0(react@18.3.1) + '@react-stately/selection': 3.18.0(react@18.3.1) + '@react-stately/utils': 3.10.5(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) '@swc/helpers': 0.5.1 react: 18.3.1 @@ -7705,6 +7679,11 @@ snapshots: '@swc/helpers': 0.5.1 react: 18.3.1 + '@react-stately/utils@3.10.5(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.1 + react: 18.3.1 + '@react-stately/virtualizer@4.1.0(react@18.3.1)': dependencies: '@react-aria/utils': 3.25.3(react@18.3.1) @@ -7717,16 +7696,10 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/breadcrumbs@3.7.7(react@18.3.1)': - dependencies: - '@react-types/link': 3.5.7(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - react: 18.3.1 - - '@react-types/breadcrumbs@3.7.8(react@18.3.1)': + '@react-types/breadcrumbs@3.7.9(react@18.3.1)': dependencies: - '@react-types/link': 3.5.8(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/link': 3.5.9(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/button@3.10.0(react@18.3.1)': @@ -7734,9 +7707,9 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/button@3.9.6(react@18.3.1)': + '@react-types/button@3.10.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/calendar@3.4.10(react@18.3.1)': @@ -7745,20 +7718,20 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/calendar@3.4.9(react@18.3.1)': + '@react-types/calendar@3.5.0(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.5 - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/date': 3.6.0 + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/checkbox@3.8.3(react@18.3.1)': + '@react-types/checkbox@3.8.4(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/checkbox@3.8.4(react@18.3.1)': + '@react-types/checkbox@3.9.0(react@18.3.1)': dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/color@3.0.0(react@18.3.1)': @@ -7767,9 +7740,10 @@ snapshots: '@react-types/slider': 3.7.6(react@18.3.1) react: 18.3.1 - '@react-types/combobox@3.12.1(react@18.3.1)': + '@react-types/color@3.0.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/slider': 3.7.7(react@18.3.1) react: 18.3.1 '@react-types/combobox@3.13.0(react@18.3.1)': @@ -7777,12 +7751,9 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/datepicker@3.8.2(react@18.3.1)': + '@react-types/combobox@3.13.1(react@18.3.1)': dependencies: - '@internationalized/date': 3.5.5 - '@react-types/calendar': 3.4.9(react@18.3.1) - '@react-types/overlays': 3.8.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/datepicker@3.8.3(react@18.3.1)': @@ -7793,16 +7764,18 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/dialog@3.5.12(react@18.3.1)': + '@react-types/datepicker@3.9.0(react@18.3.1)': dependencies: - '@react-types/overlays': 3.8.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@internationalized/date': 3.6.0 + '@react-types/calendar': 3.5.0(react@18.3.1) + '@react-types/overlays': 3.8.11(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/dialog@3.5.13(react@18.3.1)': + '@react-types/dialog@3.5.14(react@18.3.1)': dependencies: - '@react-types/overlays': 3.8.10(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/overlays': 3.8.11(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/form@3.7.7(react@18.3.1)': @@ -7810,9 +7783,9 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/grid@3.2.8(react@18.3.1)': + '@react-types/grid@3.2.10(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/grid@3.2.9(react@18.3.1)': @@ -7820,30 +7793,14 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/link@3.5.7(react@18.3.1)': + '@react-types/link@3.5.9(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/link@3.5.8(react@18.3.1)': + '@react-types/listbox@3.5.3(react@18.3.1)': dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) - react: 18.3.1 - - '@react-types/listbox@3.5.1(react@18.3.1)': - dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) - react: 18.3.1 - - '@react-types/listbox@3.5.2(react@18.3.1)': - dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) - react: 18.3.1 - - '@react-types/menu@3.9.11(react@18.3.1)': - dependencies: - '@react-types/overlays': 3.8.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/menu@3.9.12(react@18.3.1)': @@ -7852,24 +7809,25 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/meter@3.4.3(react@18.3.1)': + '@react-types/menu@3.9.13(react@18.3.1)': dependencies: - '@react-types/progress': 3.5.6(react@18.3.1) + '@react-types/overlays': 3.8.11(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/meter@3.4.4(react@18.3.1)': + '@react-types/meter@3.4.5(react@18.3.1)': dependencies: - '@react-types/progress': 3.5.7(react@18.3.1) + '@react-types/progress': 3.5.8(react@18.3.1) react: 18.3.1 - '@react-types/numberfield@3.8.5(react@18.3.1)': + '@react-types/numberfield@3.8.6(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/numberfield@3.8.6(react@18.3.1)': + '@react-types/numberfield@3.8.7(react@18.3.1)': dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/overlays@3.8.10(react@18.3.1)': @@ -7877,35 +7835,30 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/overlays@3.8.9(react@18.3.1)': + '@react-types/overlays@3.8.11(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/progress@3.5.6(react@18.3.1)': + '@react-types/progress@3.5.8(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/progress@3.5.7(react@18.3.1)': + '@react-types/radio@3.8.4(react@18.3.1)': dependencies: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/radio@3.8.3(react@18.3.1)': + '@react-types/radio@3.8.5(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/radio@3.8.4(react@18.3.1)': - dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) - react: 18.3.1 - - '@react-types/searchfield@3.5.8(react@18.3.1)': + '@react-types/searchfield@3.5.10(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) - '@react-types/textfield': 3.9.6(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + '@react-types/textfield': 3.10.0(react@18.3.1) react: 18.3.1 '@react-types/searchfield@3.5.9(react@18.3.1)': @@ -7914,27 +7867,22 @@ snapshots: '@react-types/textfield': 3.9.7(react@18.3.1) react: 18.3.1 - '@react-types/select@3.9.6(react@18.3.1)': - dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) - react: 18.3.1 - '@react-types/select@3.9.7(react@18.3.1)': dependencies: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/shared@3.24.1(react@18.3.1)': + '@react-types/select@3.9.8(react@18.3.1)': dependencies: + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/shared@3.25.0(react@18.3.1)': dependencies: react: 18.3.1 - '@react-types/slider@3.7.5(react@18.3.1)': + '@react-types/shared@3.26.0(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 '@react-types/slider@3.7.6(react@18.3.1)': @@ -7942,20 +7890,14 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/switch@3.5.5(react@18.3.1)': + '@react-types/slider@3.7.7(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/switch@3.5.6(react@18.3.1)': + '@react-types/switch@3.5.7(react@18.3.1)': dependencies: - '@react-types/shared': 3.25.0(react@18.3.1) - react: 18.3.1 - - '@react-types/table@3.10.1(react@18.3.1)': - dependencies: - '@react-types/grid': 3.2.8(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/table@3.10.2(react@18.3.1)': @@ -7964,19 +7906,25 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 + '@react-types/table@3.10.3(react@18.3.1)': + dependencies: + '@react-types/grid': 3.2.10(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + react: 18.3.1 + '@react-types/tabs@3.3.10(react@18.3.1)': dependencies: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/tabs@3.3.9(react@18.3.1)': + '@react-types/tabs@3.3.11(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 - '@react-types/textfield@3.9.6(react@18.3.1)': + '@react-types/textfield@3.10.0(react@18.3.1)': dependencies: - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/textfield@3.9.7(react@18.3.1)': @@ -7984,18 +7932,18 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - '@react-types/tooltip@3.4.11(react@18.3.1)': - dependencies: - '@react-types/overlays': 3.8.9(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - react: 18.3.1 - '@react-types/tooltip@3.4.12(react@18.3.1)': dependencies: '@react-types/overlays': 3.8.10(react@18.3.1) '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 + '@react-types/tooltip@3.4.13(react@18.3.1)': + dependencies: + '@react-types/overlays': 3.8.11(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) + react: 18.3.1 + '@redocly/ajv@8.11.2': dependencies: fast-deep-equal: 3.1.3 @@ -9221,7 +9169,7 @@ snapshots: debug: 4.3.6(supports-color@9.4.0) enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -9234,7 +9182,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.11.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -9244,7 +9192,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -9266,7 +9214,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -9813,6 +9761,8 @@ snapshots: highlight.js@10.7.3: {} + highlightjs-vue@1.0.0: {} + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 @@ -11334,93 +11284,52 @@ snapshots: '@swc/helpers': 0.5.1 client-only: 0.0.1 react: 18.3.1 - react-aria: 3.35.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-aria: 3.36.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-stately: 3.33.0(react@18.3.1) use-sync-external-store: 1.2.0(react@18.3.1) - react-aria@3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@internationalized/string': 3.2.3 - '@react-aria/breadcrumbs': 3.5.16(react@18.3.1) - '@react-aria/button': 3.9.8(react@18.3.1) - '@react-aria/calendar': 3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/checkbox': 3.14.6(react@18.3.1) - '@react-aria/combobox': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/datepicker': 3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dialog': 3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dnd': 3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/link': 3.7.4(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/meter': 3.4.16(react@18.3.1) - '@react-aria/numberfield': 3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/progress': 3.4.16(react@18.3.1) - '@react-aria/radio': 3.10.7(react@18.3.1) - '@react-aria/searchfield': 3.7.8(react@18.3.1) - '@react-aria/select': 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/separator': 3.4.2(react@18.3.1) - '@react-aria/slider': 3.7.11(react@18.3.1) - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-aria/switch': 3.6.7(react@18.3.1) - '@react-aria/table': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tabs': 3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tag': 3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.8(react@18.3.1) - '@react-aria/tooltip': 3.7.7(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-aria/visually-hidden': 3.8.15(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-aria@3.35.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@internationalized/string': 3.2.4 - '@react-aria/breadcrumbs': 3.5.17(react@18.3.1) - '@react-aria/button': 3.10.0(react@18.3.1) - '@react-aria/calendar': 3.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/checkbox': 3.14.7(react@18.3.1) - '@react-aria/color': 3.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/combobox': 3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/datepicker': 3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dialog': 3.5.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/dnd': 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.18.3(react@18.3.1) - '@react-aria/gridlist': 3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/i18n': 3.12.3(react@18.3.1) - '@react-aria/interactions': 3.22.3(react@18.3.1) - '@react-aria/label': 3.7.12(react@18.3.1) - '@react-aria/link': 3.7.5(react@18.3.1) - '@react-aria/listbox': 3.13.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/menu': 3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/meter': 3.4.17(react@18.3.1) - '@react-aria/numberfield': 3.11.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/overlays': 3.23.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/progress': 3.4.17(react@18.3.1) - '@react-aria/radio': 3.10.8(react@18.3.1) - '@react-aria/searchfield': 3.7.9(react@18.3.1) - '@react-aria/select': 3.14.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/selection': 3.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/separator': 3.4.3(react@18.3.1) - '@react-aria/slider': 3.7.12(react@18.3.1) - '@react-aria/ssr': 3.9.6(react@18.3.1) - '@react-aria/switch': 3.6.8(react@18.3.1) - '@react-aria/table': 3.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tabs': 3.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/tag': 3.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/textfield': 3.14.9(react@18.3.1) - '@react-aria/tooltip': 3.7.8(react@18.3.1) - '@react-aria/utils': 3.25.3(react@18.3.1) - '@react-aria/visually-hidden': 3.8.16(react@18.3.1) - '@react-types/shared': 3.25.0(react@18.3.1) + react-aria@3.36.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@internationalized/string': 3.2.5 + '@react-aria/breadcrumbs': 3.5.19(react@18.3.1) + '@react-aria/button': 3.11.0(react@18.3.1) + '@react-aria/calendar': 3.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/checkbox': 3.15.0(react@18.3.1) + '@react-aria/color': 3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/combobox': 3.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/datepicker': 3.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dialog': 3.5.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/disclosure': 3.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dnd': 3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.19.0(react@18.3.1) + '@react-aria/gridlist': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.12.4(react@18.3.1) + '@react-aria/interactions': 3.22.5(react@18.3.1) + '@react-aria/label': 3.7.13(react@18.3.1) + '@react-aria/link': 3.7.7(react@18.3.1) + '@react-aria/listbox': 3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/meter': 3.4.18(react@18.3.1) + '@react-aria/numberfield': 3.11.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/progress': 3.4.18(react@18.3.1) + '@react-aria/radio': 3.10.10(react@18.3.1) + '@react-aria/searchfield': 3.7.11(react@18.3.1) + '@react-aria/select': 3.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.21.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/separator': 3.4.4(react@18.3.1) + '@react-aria/slider': 3.7.14(react@18.3.1) + '@react-aria/ssr': 3.9.7(react@18.3.1) + '@react-aria/switch': 3.6.10(react@18.3.1) + '@react-aria/table': 3.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tabs': 3.9.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tag': 3.4.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.15.0(react@18.3.1) + '@react-aria/tooltip': 3.7.10(react@18.3.1) + '@react-aria/utils': 3.26.0(react@18.3.1) + '@react-aria/visually-hidden': 3.8.18(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11516,7 +11425,7 @@ snapshots: '@react-stately/toggle': 3.7.7(react@18.3.1) '@react-stately/tooltip': 3.4.12(react@18.3.1) '@react-stately/tree': 3.8.4(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 react-stately@3.33.0(react@18.3.1): @@ -11547,10 +11456,11 @@ snapshots: '@react-types/shared': 3.25.0(react@18.3.1) react: 18.3.1 - react-syntax-highlighter@15.5.0(react@18.3.1): + react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.23.7 highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 lowlight: 1.20.0 prismjs: 1.29.0 react: 18.3.1 diff --git a/core/pom.xml b/core/pom.xml index 822153042..1074530f1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -24,7 +24,7 @@ 2.16.1 5.3.0 1.12.0 - 3.4.1 + 3.5.0 3.4.0 1.12.1 2.1.214 @@ -33,7 +33,7 @@ v18.12.1 8.19.2 8.7.1 - 5.16.0 + 6.0.2 1.33 1.4 2.6.0 diff --git a/core/src/main/java/io/aiven/klaw/service/AclControllerService.java b/core/src/main/java/io/aiven/klaw/service/AclControllerService.java index 1ca39ad63..9c2e264ae 100644 --- a/core/src/main/java/io/aiven/klaw/service/AclControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/AclControllerService.java @@ -60,7 +60,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -100,7 +99,7 @@ public ApiResponse createAcl(AclRequestsModel aclRequestsModel) throws KlawExcep aclRequestsModel.setRequestingteam(commonUtilsService.getTeamId(currentUserName)); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -454,7 +453,7 @@ public List getAclRequestsForApprover( // get requests relevant to your teams or all teams if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { createdAclReqs = manageDatabase .getHandleDbRequests() @@ -521,7 +520,7 @@ private List updateCreatAclReqsList( public ApiResponse deleteAclRequests(String req_no) throws KlawException { try { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } String userName = getCurrentUserName(); @@ -544,7 +543,7 @@ public ApiResponse claimAcl(int aclId) throws KlawException { log.info("claimAcl {}", aclId); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -619,7 +618,7 @@ public ApiResponse createDeleteAclSubscriptionRequest(String req_no) throws Klaw log.info("createDeleteAclSubscriptionRequest {}", req_no); final String userName = getCurrentUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_DELETE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_DELETE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -677,7 +676,7 @@ public ApiResponse approveAclRequests(String req_no) final String userDetails = getCurrentUserName(); int tenantId = commonUtilsService.getTenantId(userDetails); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1033,7 +1032,7 @@ public ApiResponse declineAclRequests(String req_no, String reasonToDecline) String userDetails = getCurrentUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1111,10 +1110,6 @@ public List getConsumerOffsets( return consumerOffsetInfoList; } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - public ServiceAccountDetails getAivenServiceAccountDetails( String envId, String topicName, String serviceAccount, String aclReqNo) { String loggedInUser = getCurrentUserName(); diff --git a/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java index b1a0b1953..1304e4803 100644 --- a/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/AclSyncControllerService.java @@ -43,7 +43,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -82,7 +81,8 @@ public ApiResponse updateSyncAcls(List syncAclUpdates) throws Kl String userName = getUserName(); int tenantId = commonUtilsService.getTenantId(userName); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_SUBSCRIPTIONS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -179,7 +179,7 @@ public ApiResponse updateSyncBackAcls(SyncBackAcls syncBackAcls) throws KlawExce logArray.add("Type of Sync " + syncBackAcls.getTypeOfSync()); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.SYNC_BACK_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.SYNC_BACK_SUBSCRIPTIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -395,7 +395,8 @@ public List getSyncAcls( topicNameSearch = topicNameSearch.trim(); } - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_SUBSCRIPTIONS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_SUBSCRIPTIONS)) { return null; } @@ -440,7 +441,7 @@ public List getSyncBackAcls( int tenantId = commonUtilsService.getTenantId(userName); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.SYNC_BACK_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.SYNC_BACK_SUBSCRIPTIONS)) { return null; } @@ -698,7 +699,7 @@ private boolean verifyIfTopicExists( private List tenantFiltering(List teamList) { if (!commonUtilsService.isNotAuthorizedUser( - getPrincipal(), + commonUtilsService.getPrincipal(), Set.of( PermissionType.SYNC_BACK_SUBSCRIPTIONS, PermissionType.SYNC_TOPICS, @@ -726,7 +727,7 @@ private int counterIncrement() { } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public Env getEnvDetails(String envId, int tenantId) { @@ -737,8 +738,4 @@ public Env getEnvDetails(String envId, int tenantId) { .findFirst(); return envFound.orElse(null); } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } } diff --git a/core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java b/core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java index 8015eed25..82870fe1c 100644 --- a/core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/AnalyticsControllerService.java @@ -36,7 +36,6 @@ import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -343,7 +342,8 @@ public List getTeamsOverview(String forTeam, int numberOfDays) { final String currentUserName = getCurrentUserName(); Integer userTeamId = commonUtilsService.getTeamId(currentUserName); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { int tenantId = commonUtilsService.getTenantId(currentUserName); teamOverview.setProducerAclsPerTeamsOverview( @@ -593,7 +593,8 @@ private Map> getTopicNames(int tenantId) { final Set allowedEnvIdSet = commonUtilsService.getEnvsFromUserId(getCurrentUserName()); Map> topicsPerEnv = new HashMap<>(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { // normal user Integer userTeamId = commonUtilsService.getTeamId(getCurrentUserName()); List topics = @@ -630,7 +631,8 @@ private Map> getConsumerGroups(int tenantId) { final Set allowedEnvIdSet = commonUtilsService.getEnvsFromUserId(getCurrentUserName()); Map> aclsPerEnv = new HashMap<>(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { // normal user Integer userTeamId = commonUtilsService.getTeamId(getCurrentUserName()); List acls = @@ -665,8 +667,4 @@ private Map> getConsumerGroups(int tenantId) { return aclsPerEnv; } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } } diff --git a/core/src/main/java/io/aiven/klaw/service/BaseOverviewService.java b/core/src/main/java/io/aiven/klaw/service/BaseOverviewService.java index 2ef97ff05..f2367ce4b 100644 --- a/core/src/main/java/io/aiven/klaw/service/BaseOverviewService.java +++ b/core/src/main/java/io/aiven/klaw/service/BaseOverviewService.java @@ -31,7 +31,6 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Slf4j @@ -333,11 +332,7 @@ protected void generatePromotionDetails( } protected String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - protected Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } protected Env getEnvDetails(String envId, int tenantId) { diff --git a/core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java b/core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java index 0f3e94673..ccf07e74d 100644 --- a/core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/EnvsClustersTenantsControllerService.java @@ -107,7 +107,7 @@ public void setServices(ClusterApiService clusterApiService, MailUtils mailServi } private boolean isAuthorizedFor(PermissionType type) { - return !commonUtilsService.isNotAuthorizedUser(getPrincipal(), type); + return !commonUtilsService.isNotAuthorizedUser(commonUtilsService.getPrincipal(), type); } public synchronized EnvModelResponse getEnvDetails(String envSelected, String clusterType) { @@ -392,7 +392,8 @@ public List getKafkaConnectEnvs() { int tenantId = getUserDetails(userName).getTenantId(); List listEnvs = manageDatabase.getKafkaConnectEnvList(tenantId); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), ADD_EDIT_DELETE_ENVS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), ADD_EDIT_DELETE_ENVS)) { final Set allowedEnvIdSet = commonUtilsService.getEnvsFromUserId(userName); listEnvs = listEnvs.stream().filter(env -> allowedEnvIdSet.contains(env.getId())).collect(toList()); @@ -730,7 +731,7 @@ private void associateWithKafkaEnv(EnvTag envTag, String envId, String envName, } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } private Boolean isUserSuperAdmin() { @@ -858,10 +859,6 @@ public KwTenantModel getMyTenantInfo() { return kwTenantModel; } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - public ApiResponse deleteTenant() throws KlawException { if (!isAuthorizedFor(UPDATE_DELETE_MY_TENANT)) { return ApiResponse.NOT_AUTHORIZED; @@ -907,7 +904,7 @@ public ApiResponse deleteTenant() throws KlawException { public ApiResponse updateTenant(KwTenantModel kwTenantModel) throws KlawException { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.UPDATE_DELETE_MY_TENANT)) { + commonUtilsService.getPrincipal(), PermissionType.UPDATE_DELETE_MY_TENANT)) { return ApiResponse.NOT_AUTHORIZED; } diff --git a/core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java b/core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java index 69a5e3efc..a2441568d 100644 --- a/core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/KafkaConnectControllerService.java @@ -72,7 +72,6 @@ import org.jasypt.util.text.BasicTextEncryptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; @@ -111,7 +110,7 @@ public ApiResponse createConnectorRequest(KafkaConnectorRequestModel connectorRe String userName = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_CONNECTORS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -504,7 +503,7 @@ public ApiResponse restartConnector(KafkaConnectorRestartModel kafkaConnectorRes int tenantId = commonUtilsService.getTenantId(getUserName()); try { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.MANAGE_CONNECTORS)) { + commonUtilsService.getPrincipal(), PermissionType.MANAGE_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } return clusterApiService.restartConnector(kafkaConnectorRestartModel, tenantId); @@ -528,7 +527,7 @@ public List getCreatedConnectorRequests( // get requests relevant to your teams or all teams if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) createdTopicReqList = manageDatabase .getHandleDbRequests() @@ -637,7 +636,8 @@ public ApiResponse approveConnectorRequests(String connectorId) String userDetails = getUserName(); int tenantId = commonUtilsService.getTenantId(getUserName()); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.APPROVE_CONNECTORS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.APPROVE_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -788,7 +788,8 @@ public ApiResponse declineConnectorRequests(String connectorId, String reasonFor throws KlawException { log.info("declineConnectorRequests {} {}", connectorId, reasonForDecline); String userDetails = getUserName(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.APPROVE_CONNECTORS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.APPROVE_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -837,7 +838,7 @@ public ApiResponse createConnectorDeleteRequest(String connectorName, String env String userDetails = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_DELETE_CONNECTORS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_DELETE_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1553,11 +1554,7 @@ private List getFilteredConnectorsForTenant( } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public Env getKafkaConnectEnvDetails(String envId) { diff --git a/core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java index f10013d26..b49edc159 100644 --- a/core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/KafkaConnectSyncControllerService.java @@ -34,7 +34,6 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -81,7 +80,8 @@ public ApiResponse updateSyncConnectors(List updatedSyncTo log.info("updateSyncConnectors {}", updatedSyncTopics); String userName = getUserName(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_CONNECTORS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_CONNECTORS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -477,7 +477,8 @@ private List getSyncConnectorsList( } private List tenantFilterTeams(List teamList) { - if (!commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_CONNECTORS)) { + if (!commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_CONNECTORS)) { // tenant filtering int tenantId = commonUtilsService.getTenantId(getUserName()); List teams = manageDatabase.getHandleDbRequests().getAllTeams(tenantId); @@ -492,11 +493,7 @@ private List tenantFilterTeams(List teamList) { } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public Env getKafkaConnectorEnvDetails(String envId) { diff --git a/core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java b/core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java index 04da96233..af6f6950c 100644 --- a/core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/MetricsControllerService.java @@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -31,7 +30,7 @@ public class MetricsControllerService { @Autowired private CommonUtilsService commonUtilsService; private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } // default 1 min @@ -109,8 +108,4 @@ private ChartsJsOverview getBrokerTopMetricsOverview() { "Messages", commonUtilsService.getTenantId(getUserName())); } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } } diff --git a/core/src/main/java/io/aiven/klaw/service/OperationalRequestsService.java b/core/src/main/java/io/aiven/klaw/service/OperationalRequestsService.java index e29e203bb..0efe08c58 100644 --- a/core/src/main/java/io/aiven/klaw/service/OperationalRequestsService.java +++ b/core/src/main/java/io/aiven/klaw/service/OperationalRequestsService.java @@ -42,7 +42,6 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -264,7 +263,7 @@ public List getOperationalRequestsForApprover( int tenantId = commonUtilsService.getTenantId(userName); // get requests relevant to your teams or all teams if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { operationalRequestList = manageDatabase .getHandleDbRequests() @@ -400,7 +399,7 @@ public ApiResponse approveOperationalRequests(String reqId) { final String userName = getUserName(); int tenantId = commonUtilsService.getTenantId(userName); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_OPERATIONAL_CHANGES)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_OPERATIONAL_CHANGES)) { return ApiResponse.NOT_AUTHORIZED; } @@ -477,7 +476,7 @@ public ApiResponse approveOperationalRequests(String reqId) { } private void checkIsAuthorized(PermissionType permission) throws KlawNotAuthorizedException { - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), permission)) { + if (commonUtilsService.isNotAuthorizedUser(commonUtilsService.getPrincipal(), permission)) { throw new KlawNotAuthorizedException(TOPICS_ERR_101); } } @@ -486,10 +485,6 @@ private String getUserName() { return mailService.getCurrentUserName(); } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - public EnvIdInfo validateOffsetRequestDetails( String envId, String topicName, String consumerGroup) { log.debug("validateOffsetRequestDetails {} {} {}", envId, topicName, consumerGroup); @@ -520,7 +515,7 @@ public ApiResponse deleteOperationalRequest(String operationalRequestId) throws log.info("deleteOperationalRequest {}", operationalRequestId); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_OPERATIONAL_CHANGES)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_OPERATIONAL_CHANGES)) { return ApiResponse.NOT_AUTHORIZED; } String userName = getUserName(); @@ -546,7 +541,7 @@ public ApiResponse declineOperationalRequest(String reqId, String reasonForDecli throws KlawException { log.debug("declineOperationalRequest {} {}", reqId, reasonForDecline); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_OPERATIONAL_CHANGES)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_OPERATIONAL_CHANGES)) { return ApiResponse.NOT_AUTHORIZED; } diff --git a/core/src/main/java/io/aiven/klaw/service/RequestStatisticsService.java b/core/src/main/java/io/aiven/klaw/service/RequestStatisticsService.java index 791992308..097a04f4e 100644 --- a/core/src/main/java/io/aiven/klaw/service/RequestStatisticsService.java +++ b/core/src/main/java/io/aiven/klaw/service/RequestStatisticsService.java @@ -14,7 +14,6 @@ import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -118,10 +117,6 @@ private void updateRequestsCountOverview( } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } } diff --git a/core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java b/core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java index d0e550a86..e7b660ff6 100644 --- a/core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/RolesPermissionsControllerService.java @@ -13,7 +13,6 @@ import java.util.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Slf4j @@ -37,14 +36,14 @@ public RolesPermissionsControllerService( } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public List getRoles() { int tenantId = commonUtilsService.getTenantId(getUserName()); try { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.FULL_ACCESS_USERS_TEAMS_ROLES)) + commonUtilsService.getPrincipal(), PermissionType.FULL_ACCESS_USERS_TEAMS_ROLES)) return Arrays.asList( manageDatabase.getKwPropertyValue("klaw.adduser.roles", tenantId).split(",")); else { @@ -68,7 +67,7 @@ public Map>> getPermissions(boolean isExternal if (isExternalCall && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.UPDATE_PERMISSIONS)) { + commonUtilsService.getPrincipal(), PermissionType.UPDATE_PERMISSIONS)) { return null; } @@ -110,7 +109,8 @@ public Map getPermissionDescriptions() { public ApiResponse updatePermissions(KwRolesPermissionsModel[] permissionsSet) throws KlawException { - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.UPDATE_PERMISSIONS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.UPDATE_PERMISSIONS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -166,7 +166,7 @@ public ApiResponse updatePermissions(KwRolesPermissionsModel[] permissionsSet) public ApiResponse deleteRole(String roleId) throws KlawException { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_ROLES)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_ROLES)) { return ApiResponse.NOT_AUTHORIZED; } @@ -191,7 +191,7 @@ public ApiResponse deleteRole(String roleId) throws KlawException { public ApiResponse addRoleId(String roleId) throws KlawException { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_ROLES)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_ROLES)) { return ApiResponse.NOT_AUTHORIZED; } @@ -216,10 +216,6 @@ public ApiResponse addRoleId(String roleId) throws KlawException { } } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - protected Set getApproverRoles(String requestType, int tenantId) { Map>> existingPermissions = getPermissions(false); Set approverRoles = new HashSet<>(); diff --git a/core/src/main/java/io/aiven/klaw/service/SchemaRegistryControllerService.java b/core/src/main/java/io/aiven/klaw/service/SchemaRegistryControllerService.java index 1577e69cd..779cf3c63 100644 --- a/core/src/main/java/io/aiven/klaw/service/SchemaRegistryControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/SchemaRegistryControllerService.java @@ -45,7 +45,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -102,7 +101,8 @@ public List getSchemaRequests( search, isApproval && !commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS), + commonUtilsService.getPrincipal(), + PermissionType.APPROVE_ALL_REQUESTS_TEAMS), isMyRequest); // tenant filtering @@ -205,7 +205,7 @@ public ApiResponse deleteSchemaRequests(String avroSchemaId) throws KlawExceptio log.info("deleteSchemaRequests {}", avroSchemaId); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_DELETE_SCHEMAS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_DELETE_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } String userName = getUserName(); @@ -231,7 +231,8 @@ public ApiResponse execSchemaRequests(String avroSchemaId) throws KlawException log.info("execSchemaRequests {}", avroSchemaId); String userDetails = getUserName(); int tenantId = commonUtilsService.getTenantId(getUserName()); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.APPROVE_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.APPROVE_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -415,7 +416,8 @@ public ApiResponse execSchemaRequestsDecline(String avroSchemaId, String reasonF throws KlawException { log.info("execSchemaRequestsDecline {}", avroSchemaId); String userDetails = getUserName(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.APPROVE_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.APPROVE_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } int tenantId = commonUtilsService.getTenantId(getUserName()); @@ -452,7 +454,7 @@ public ApiResponse promoteSchema(SchemaPromotion schemaPromotion) throws Excepti String userDetails = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SCHEMAS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -542,7 +544,7 @@ public ApiResponse uploadSchema( String userName = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SCHEMAS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } schemaRequest.setRequestor(userName); @@ -732,10 +734,6 @@ private String prettyPrintUglyJsonString(String json) { } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } } diff --git a/core/src/main/java/io/aiven/klaw/service/SchemaRegistrySyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/SchemaRegistrySyncControllerService.java index 5175dc18c..6b96944cb 100644 --- a/core/src/main/java/io/aiven/klaw/service/SchemaRegistrySyncControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/SchemaRegistrySyncControllerService.java @@ -42,7 +42,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -106,7 +105,8 @@ public SyncSchemasList getSchemasOfEnvironmentFromMetadataDb( Integer teamId) { SyncSchemasList syncSchemasList = new SyncSchemasList(); List schemaInfoList; - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_BACK_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_BACK_SCHEMAS)) { return syncSchemasList; } @@ -229,7 +229,8 @@ private SyncSchemasList getSchemaOfEnvironmentFromCluster( boolean showAllTopics) throws KlawException { SyncSchemasList syncSchemasList = new SyncSchemasList(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_SCHEMAS)) { return syncSchemasList; } @@ -440,7 +441,8 @@ public ApiResponse updateSyncSchemas(SyncSchemaUpdates syncSchemaUpdates) throws private ApiResponse updateSyncSchemasToCluster(SyncSchemaUpdates syncSchemaUpdates) throws KlawException { - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_BACK_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_BACK_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } List logArray = new ArrayList<>(); @@ -546,7 +548,8 @@ private ApiResponse updateSyncSchemasToCluster(SyncSchemaUpdates syncSchemaUpdat private ApiResponse updateSyncSchemasToMetadata(SyncSchemaUpdates syncSchemaUpdates) throws Exception { - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_SCHEMAS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_SCHEMAS)) { return ApiResponse.NOT_AUTHORIZED; } String userDetails = getUserName(); @@ -705,11 +708,7 @@ private Integer getTeamIdFromDb(int tenantId, SchemaSubjectInfoResponse mp) { } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public ApiResponse resetCacheClusterApi(SchemaResetCache schemaResetCache) throws KlawException { diff --git a/core/src/main/java/io/aiven/klaw/service/ServerConfigService.java b/core/src/main/java/io/aiven/klaw/service/ServerConfigService.java index 3da6ac2af..f594c5ecd 100644 --- a/core/src/main/java/io/aiven/klaw/service/ServerConfigService.java +++ b/core/src/main/java/io/aiven/klaw/service/ServerConfigService.java @@ -50,7 +50,6 @@ import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -125,7 +124,7 @@ public void getAllProperties() { public Collection getAllProps() { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { + commonUtilsService.getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { return new ArrayList<>(); } return key2Props.values(); @@ -136,7 +135,7 @@ public List getAllEditableProps() { KwPropertiesResponse propertiesResponse = new KwPropertiesResponse(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { + commonUtilsService.getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { propertiesResponse.setResult(ApiResultStatus.NOT_AUTHORIZED.value); listMap.add(propertiesResponse); return listMap; @@ -194,7 +193,7 @@ public ApiResponse updateKwCustomProperty(KwPropertiesModel kwPropertiesModel) String kwVal = kwPropertiesModel.getKwValue().trim(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { + commonUtilsService.getPrincipal(), PermissionType.UPDATE_SERVERCONFIG)) { return ApiResponse.NOT_AUTHORIZED; } @@ -552,10 +551,6 @@ public ConnectivityStatus testClusterApiConnection(String clusterApiUrl) throws return connectivityStatus; } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - private Integer getTenantIdFromName(String tenantName) { return manageDatabase.getTenantMap().entrySet().stream() .filter(obj -> Objects.equals(obj.getValue(), tenantName)) @@ -565,6 +560,6 @@ private Integer getTenantIdFromName(String tenantName) { } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } } diff --git a/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java b/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java index eaaa01550..caabfffdc 100644 --- a/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/TopicControllerService.java @@ -82,7 +82,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -525,7 +524,7 @@ public List getTopicRequestsForApprover( int tenantId = commonUtilsService.getTenantId(userName); // get requests relevant to your teams or all teams if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { createdTopicReqList = manageDatabase .getHandleDbRequests() @@ -717,10 +716,10 @@ public ApiResponse approveTopicRequests(String topicId) throws KlawException { if (topicRequest.getRequestOperationType().equals(RequestOperationType.CREATE.value) && Boolean.parseBoolean(isOptionalExtraPermissionForPromote) && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_TOPICS_CREATE)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_TOPICS_CREATE)) { return ApiResponse.notOk(ApiResultStatus.NOT_AUTHORIZED.value + ". " + TOPICS_ERR_116); } else if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_TOPICS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_TOPICS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -882,7 +881,8 @@ private ApiResponse validateTopicRequest(TopicRequest topicRequest, String userN public ApiResponse declineTopicRequests(String topicId, String reasonForDecline) throws KlawException { log.info("declineTopicRequests {} {}", topicId, reasonForDecline); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.APPROVE_TOPICS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.APPROVE_TOPICS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1301,11 +1301,7 @@ private int counterIncrement() { } public String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - public Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public Env getEnvDetails(String envId) { diff --git a/core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java b/core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java index 1a75b2a66..1a88dc7e4 100644 --- a/core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/TopicSyncControllerService.java @@ -68,7 +68,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @EnableScheduling @@ -287,7 +286,8 @@ public SyncTopicsList getSyncTopics( log.info("getSyncTopics {} {} {}", env, pageNo, topicNameSearch); if (!"-1".equals(pageNo)) { // ignore check for scheduler - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_TOPICS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_TOPICS)) { return null; } } @@ -586,7 +586,7 @@ private void updateClusterDeletedTopicsList( private List tenantFilterTeams(Integer tenantId, boolean scheduledThread) { if (!scheduledThread && (!commonUtilsService.isNotAuthorizedUser( - getPrincipal(), + commonUtilsService.getPrincipal(), Set.of( PermissionType.SYNC_BACK_SUBSCRIPTIONS, PermissionType.SYNC_TOPICS, @@ -619,7 +619,8 @@ public ApiResponse updateSyncBackTopics(SyncBackTopics syncBackTopics) { "Target Environment " + getEnvDetails(syncBackTopics.getTargetEnv(), tenantId).getName()); logArray.add("Type of Sync " + syncBackTopics.getTypeOfSync()); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_BACK_TOPICS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_BACK_TOPICS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -914,7 +915,8 @@ public ApiResponse updateSyncTopicsBulk(SyncTopicsBulk syncTopicsBulk) throws Kl logArray.add("Assigned to Team " + syncTopicsBulk.getSelectedTeam()); logArray.add("Type of Sync " + syncTopicsBulk.getTypeOfSync()); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_TOPICS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_TOPICS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1055,7 +1057,8 @@ public ApiResponse updateSyncTopics(List updatedSyncTopics) log.info("updateSyncTopics {}", updatedSyncTopics); String userDetails = getUserName(); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SYNC_TOPICS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SYNC_TOPICS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1244,11 +1247,7 @@ private List handleTopicDeletes( } private String getUserName() { - return mailService.getUserName(getPrincipal()); - } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public Env getEnvDetails(String envId, Integer tenantId) { diff --git a/core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java b/core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java index a3c559e26..3e8bb7224 100644 --- a/core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/UiConfigControllerService.java @@ -18,7 +18,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -45,7 +44,7 @@ public DbAuthInfo getDbAuth() { } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public List showActivityLog( @@ -55,7 +54,8 @@ public List showActivityLog( List origActivityList; int tenantId = commonUtilsService.getTenantId(getUserName()); - if (commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { + if (commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.ALL_TEAMS_REPORTS)) { origActivityList = manageDatabase .getHandleDbRequests() @@ -124,8 +124,4 @@ public ApiResponse sendMessageToAdmin(String contactFormSubject, String contactF public List getRequestTypeStatuses() { return manageDatabase.getRequestStatusList(); } - - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } } diff --git a/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java b/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java index 4abc46e62..19ee7f225 100644 --- a/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java @@ -57,7 +57,6 @@ import org.jasypt.util.text.BasicTextEncryptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.factory.PasswordEncoderFactories; @@ -425,7 +424,7 @@ public ApiResponse deleteTeam(Integer teamId) throws KlawException { String userName = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -469,7 +468,7 @@ public ApiResponse deleteUser(String userIdToDelete, boolean isExternal) throws int tenantId = commonUtilsService.getTenantId(getUserName()); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -484,7 +483,7 @@ public ApiResponse deleteUser(String userIdToDelete, boolean isExternal) throws // user to be deleted has superuser permissions. // check if you (logged in user who is deleting) have superuser permissions to delete user if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.FULL_ACCESS_USERS_TEAMS_ROLES)) { + commonUtilsService.getPrincipal(), PermissionType.FULL_ACCESS_USERS_TEAMS_ROLES)) { return ApiResponse.notOk(TEAMS_ERR_106); } } @@ -574,7 +573,7 @@ public ApiResponse addNewUser(UserInfoModel newUser, boolean isExternal) throws if (isExternal && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -662,7 +661,7 @@ public ApiResponse addNewTeam(TeamModel newTeam, boolean isExternal) throws Klaw if (isExternal && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -707,7 +706,7 @@ public ApiResponse updateTeam(TeamModel updatedTeam) throws KlawException { log.info("updateTeam {}", updatedTeam); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_TEAMS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -836,7 +835,7 @@ public UserInfoModelResponse getMyProfileInfo() { } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } Map addTwoDefaultTeams( @@ -977,7 +976,7 @@ public ApiResponse registerUser(RegisterUserInfoModel newUser, boolean isExterna public List getNewUserRequests() throws KlawNotAuthorizedException { if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { throw new KlawNotAuthorizedException("You are not authorized to view this information."); } int tenantId = commonUtilsService.getTenantId(getUserName()); @@ -1008,7 +1007,7 @@ public ApiResponse approveNewUserRequests( if (isExternal && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1050,7 +1049,7 @@ public ApiResponse declineNewUserRequests(String username) throws KlawException String userDetails = getUserName(); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { return ApiResponse.NOT_AUTHORIZED; } @@ -1086,10 +1085,6 @@ public Env getEnvDetailsFromId(String envId) { return envFound.orElse(null); } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - private boolean userNamePatternValidation(String userName) { Matcher m1 = emailUsernamePattern.matcher(userName); Matcher m2 = defaultPattern.matcher(userName); diff --git a/core/src/main/java/io/aiven/klaw/service/UtilControllerService.java b/core/src/main/java/io/aiven/klaw/service/UtilControllerService.java index f6754bfab..95286255b 100644 --- a/core/src/main/java/io/aiven/klaw/service/UtilControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/UtilControllerService.java @@ -47,7 +47,6 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Service; @@ -112,7 +111,7 @@ public DashboardStats getDashboardStats() { } private String getUserName() { - return mailService.getUserName(getPrincipal()); + return mailService.getUserName(commonUtilsService.getPrincipal()); } public String getTenantNameFromUser(String userId, UserInfo userInfo) { @@ -135,11 +134,11 @@ public Map getAllRequestsToBeApproved(String requestor, int tena Map countList = new HashMap<>(); String roleToSet = ""; if (!commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_SUBSCRIPTIONS)) { roleToSet = APPROVER_SUBSCRIPTIONS; } if (!commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { + commonUtilsService.getPrincipal(), PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) { roleToSet = REQUESTOR_SUBSCRIPTIONS; } List allSchemaReqs = @@ -153,7 +152,7 @@ public Map getAllRequestsToBeApproved(String requestor, int tena null, null, !commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS), + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS), false); List allAclReqs; @@ -161,7 +160,7 @@ public Map getAllRequestsToBeApproved(String requestor, int tena List allConnectorReqs; if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) { allAclReqs = reqsHandle.getAllAclRequests( true, @@ -244,7 +243,7 @@ public Map getAllRequestsToBeApproved(String requestor, int tena countList.put("connectors", allConnectorReqs.size() + ""); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { countList.put("users", "0"); } else { countList.put("users", reqsHandle.getCountRegisterUsersInfoForTenant(tenantId) + ""); @@ -260,7 +259,7 @@ public AuthenticationInfo getAuth() { if (userName != null) { String teamName = manageDatabase.getTeamNameFromTeamId(tenantId, commonUtilsService.getTeamId(userName)); - String authority = commonUtilsService.getAuthority(getPrincipal()); + String authority = commonUtilsService.getAuthority(commonUtilsService.getPrincipal()); Map outstanding = getAllRequestsToBeApproved(userName, tenantId); String outstandingTopicReqs = outstanding.get("topics"); @@ -318,7 +317,8 @@ public AuthenticationInfo getAuth() { authenticationInfo.setKafkaconnect_clusters_count( "" + manageDatabase.getKafkaConnectEnvList(tenantId).size()); - final Set permissions = commonUtilsService.getPermissions(getPrincipal()); + final Set permissions = + commonUtilsService.getPermissions(commonUtilsService.getPrincipal()); final String canUpdatePermissions = getPermission(permissions, PermissionType.UPDATE_PERMISSIONS); final String addEditRoles = getPermission(permissions, PermissionType.ADD_EDIT_DELETE_ROLES); @@ -464,7 +464,7 @@ public AuthenticationInfo getAuth() { isOptionalExtraPermissionForTopicCreateEnabled); if (commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.APPROVE_TOPICS_CREATE)) { + commonUtilsService.getPrincipal(), PermissionType.APPROVE_TOPICS_CREATE)) { authenticationInfo.setKlawOptionalPermissionNewTopicCreation("false"); } else { authenticationInfo.setKlawOptionalPermissionNewTopicCreation("true"); @@ -550,16 +550,13 @@ public void shutdownContext() { return; } - if (!commonUtilsService.isNotAuthorizedUser(getPrincipal(), PermissionType.SHUTDOWN_KLAW)) { + if (!commonUtilsService.isNotAuthorizedUser( + commonUtilsService.getPrincipal(), PermissionType.SHUTDOWN_KLAW)) { log.info("Klaw Shutdown requested by {}", getUserName()); context.close(); } } - private Object getPrincipal() { - return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } - public Map getBasicInfo() { Map resultBasicInfo = new HashMap<>(); resultBasicInfo.put("contextPath", kwContextPath); @@ -613,7 +610,7 @@ public ApiResponse resetCache(ResetEntityCache resetEntityCache) { // resources } else if (entityType.equals(EntityType.USERS.name()) && commonUtilsService.isNotAuthorizedUser( - getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { + commonUtilsService.getPrincipal(), PermissionType.ADD_EDIT_DELETE_USERS)) { return ApiResponse.NOT_AUTHORIZED; } log.debug("Reset cache triggered on the instance {}", resetEntityCache); diff --git a/core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java index 2f669da1c..f2dfc193e 100644 --- a/core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/AclControllerServiceTest.java @@ -68,12 +68,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -119,7 +115,8 @@ public void setUp() throws Exception { rolesPermissionsControllerService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); when(commonUtilsService.getEnvDetails(anyString(), anyInt())).thenReturn(env); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } private void mockKafkaFlavor() { @@ -146,14 +143,6 @@ private void mockKafkaFlavorAiven() { when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - @Test @Order(1) public void createAclProducer() throws KlawException { @@ -168,6 +157,9 @@ public void createAclProducer() throws KlawException { Env env = new Env(); env.setClusterId(1); when(commonUtilsService.getEnvDetails(anyString(), anyInt())).thenReturn(env); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); stubUserInfo(); mockKafkaFlavor(); @@ -186,6 +178,9 @@ public void createAclConsumer() throws KlawException { hashMap.put("result", ApiResultStatus.SUCCESS.value); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())).thenReturn(topicList); when(handleDbRequests.requestForAcl(any())).thenReturn(hashMap); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); mockKafkaFlavor(); stubUserInfo(); @@ -206,6 +201,9 @@ public void createAclConsumerThrowError() { .thenThrow(new RuntimeException("Failure in creating request")); stubUserInfo(); mockKafkaFlavor(); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); KlawException thrown = Assertions.assertThrows( @@ -219,7 +217,9 @@ public void createAclNotAuthorized() throws KlawException { AclRequests aclRequestsDao = new AclRequests(); AclRequestsModel aclRequests = getAclRequestProducer(); copyProperties(aclRequests, aclRequestsDao); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(true); stubUserInfo(); ApiResponse resultResp = aclControllerService.createAcl(aclRequests); @@ -233,6 +233,9 @@ public void createAclTopicNotFound() throws KlawException { AclRequestsModel aclRequests = getAclRequestProducer(); copyProperties(aclRequests, aclRequestsDao); when(handleDbRequests.getTopics(anyString(), anyInt())).thenReturn(Collections.emptyList()); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); stubUserInfo(); ApiResponse resultResp = aclControllerService.createAcl(aclRequests); @@ -249,6 +252,9 @@ public void createAclInvalidPattern() throws KlawException { List topicList = utilMethods.getTopics(); copyProperties(aclRequestsModel, aclRequestsDao); when(handleDbRequests.getTopics(anyString(), anyInt())).thenReturn(topicList); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); stubUserInfo(); mockKafkaFlavor(); @@ -270,6 +276,9 @@ public void createAclConsumerFailure() throws KlawException { when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())).thenReturn(topicList); when(handleDbRequests.validateIfConsumerGroupUsedByAnotherTeam(anyInt(), anyInt(), anyString())) .thenReturn(true); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); stubUserInfo(); mockKafkaFlavor(); @@ -293,6 +302,9 @@ public void createAclProducerEmptyTxnId() throws KlawException { hashMap.put("result", ApiResultStatus.SUCCESS.value); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())).thenReturn(topicList); when(handleDbRequests.requestForAcl(any())).thenReturn(hashMap); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); stubUserInfo(); mockKafkaFlavor(); @@ -438,7 +450,9 @@ public void getCreatedAclRequestsNotAuthorizedForAllTeams() { any(), anyInt())) .thenReturn(getAclRequests("testtopic", 16)); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + .thenReturn(true); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(manageDatabase.getTeamNameFromTeamId(anyInt(), anyInt())).thenReturn(teamName); @@ -465,6 +479,9 @@ public void deleteAclRequests() throws KlawException { when(commonUtilsService.getTenantId(userDetails.getUsername())).thenReturn(1); when(handleDbRequests.deleteAclRequest(anyInt(), anyString(), anyInt())) .thenReturn(ApiResultStatus.SUCCESS.value); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse result = aclControllerService.deleteAclRequests(req_no); assertThat(result.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); } @@ -473,16 +490,6 @@ public void deleteAclRequests() throws KlawException { @Order(14) public void deleteAclRequestsNotAuthorized() throws KlawException { String req_no = "1001"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); - ApiResponse result = aclControllerService.deleteAclRequests(req_no); - assertThat(result.getMessage()).isEqualTo(ApiResultStatus.NOT_AUTHORIZED.value); - } - - @Test - @Order(14) - public void deleteAclRequestsNotRequestOwner() throws KlawException { - String req_no = "1001"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse result = aclControllerService.deleteAclRequests(req_no); assertThat(result.getMessage()).isEqualTo(ApiResultStatus.NOT_AUTHORIZED.value); } @@ -494,6 +501,9 @@ public void deleteAclRequestsFailure() { when(mailService.getCurrentUserName()).thenReturn("testuser"); when(handleDbRequests.deleteAclRequest(anyInt(), anyString(), anyInt())) .thenThrow(new RuntimeException("failure in deleting request")); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); KlawException thrown = Assertions.assertThrows( KlawException.class, () -> aclControllerService.deleteAclRequests(req_no)); @@ -515,6 +525,8 @@ public void approveAclRequests() throws KlawException, KlawBadRequestException { .thenReturn(ApiResultStatus.SUCCESS.value); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); Topic t1 = new Topic(); t1.setTopicname("testtopic"); t1.setEnvironment("1"); @@ -548,6 +560,8 @@ public void approveAclRequestsWithAivenAcl() throws KlawException, KlawBadReques .thenReturn(ApiResultStatus.SUCCESS.value); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); Topic t1 = new Topic(); t1.setTopicname("testtopic"); t1.setEnvironment("1"); @@ -561,7 +575,6 @@ public void approveAclRequestsWithAivenAcl() throws KlawException, KlawBadReques @Order(18) public void approveAclRequestsNotAuthorized() throws KlawException, KlawBadRequestException { stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse apiResp = aclControllerService.approveAclRequests("112"); assertThat(apiResp.getMessage()).isEqualTo(ApiResultStatus.NOT_AUTHORIZED.value); } @@ -573,6 +586,8 @@ public void approveAclRequestsOwnRequest() throws KlawException, KlawBadRequestE AclRequests aclReq = getAclRequestDao(); aclReq.setRequestor("kwusera"); when(handleDbRequests.getAclRequest(anyInt(), anyInt())).thenReturn(aclReq); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests("112"); assertThat(apiResp.getMessage()) .isEqualTo("You are not allowed to approve your own subscription requests."); @@ -591,6 +606,8 @@ public void approveAclRequestsFailure1() throws KlawException, KlawBadRequestExc t1.setTopicname("testtopic"); t1.setEnvironment("1"); when(manageDatabase.getTopicsForTenant(anyInt())).thenReturn(List.of(t1)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResponse = ApiResponse.notOk("failure"); when(clusterApiService.approveAclRequests(any(), anyInt())) @@ -621,6 +638,8 @@ public void approveAclRequestsFailure2() throws KlawException, KlawBadRequestExc .thenReturn(new ResponseEntity<>(apiResponse, HttpStatus.OK)); when(handleDbRequests.updateAclRequest(any(), any(), anyMap(), anyBoolean())) .thenThrow(new RuntimeException("Error")); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(req_no); assertThat(apiResp.getMessage()).isEqualTo("failure"); @@ -637,6 +656,8 @@ public void approveAclRequestsFailure3() throws KlawException, KlawBadRequestExc when(handleDbRequests.getAclRequest(anyInt(), anyInt())).thenReturn(aclReq); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(req_no); assertThat(apiResp.getMessage()).isEqualTo("This request does not exist anymore."); @@ -654,6 +675,8 @@ public void declineAclRequests() throws KlawException { .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(handleDbRequests.declineAclRequest(any(), any())) .thenReturn(ApiResultStatus.SUCCESS.value); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse resultResp = aclControllerService.declineAclRequests(req_no, ""); assertThat(resultResp.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); @@ -669,6 +692,8 @@ public void declineAclRequestsFailure() { when(handleDbRequests.getAclRequest(anyInt(), anyInt())).thenReturn(aclReq); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); when(handleDbRequests.declineAclRequest(any(), anyString())) .thenThrow(new RuntimeException("failure in declining request")); @@ -693,6 +718,9 @@ public void createDeleteAclSubscriptionRequest() throws KlawException { Map hashMap = new HashMap<>(); hashMap.put("result", ApiResultStatus.SUCCESS.value); when(handleDbRequests.requestForAcl(any())).thenReturn(hashMap); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_DELETE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse resultResp = aclControllerService.createDeleteAclSubscriptionRequest(reqNo); assertThat(resultResp.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); @@ -1006,6 +1034,9 @@ public void getAclRequestsForApprover_RequestOperationType(RequestOperationType when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(manageDatabase.getTeamNameFromTeamId(anyInt(), anyInt())).thenReturn(teamName); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + .thenReturn(false); List listReqs = aclControllerService.getAclRequestsForApprover( @@ -1047,6 +1078,9 @@ public void createDeleteAclSubscriptionRequestFailure() throws KlawException { Map hashMap = new HashMap<>(); hashMap.put("result", ApiResultStatus.SUCCESS.value); when(handleDbRequests.requestForAcl(any())).thenReturn(hashMap); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_DELETE_SUBSCRIPTIONS)) + .thenReturn(false); when(handleDbRequests.getAllAclRequests( anyBoolean(), @@ -1083,6 +1117,8 @@ public void approveAclRequestsFailure4() throws KlawException, KlawBadRequestExc t1.setTopicname("testtopic1"); // non-existing topic t1.setEnvironment("1"); when(manageDatabase.getTopicsForTenant(anyInt())).thenReturn(List.of(t1)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(req_no); assertThat(apiResp.getMessage()).isEqualTo(ACL_ERR_101); @@ -1095,10 +1131,6 @@ public void claimAcl_NotAuthorized() throws KlawException, KlawBadRequestExcepti int aclId = 224; stubUserInfo(); - - when(commonUtilsService.isNotAuthorizedUser( - any(), eq(PermissionType.REQUEST_CREATE_SUBSCRIPTIONS))) - .thenReturn(true); ApiResponse apiResp = aclControllerService.claimAcl(aclId); assertThat(apiResp.getMessage()).isEqualTo(ApiResultStatus.NOT_AUTHORIZED.value); @@ -1110,11 +1142,11 @@ public void claimAcl_NotAuthorized() throws KlawException, KlawBadRequestExcepti public void claimAcl_AclDoesNotExist() throws KlawException { int aclId = 224; stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser( - any(), eq(PermissionType.REQUEST_CREATE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.getAcl(eq(aclId), anyInt())).thenReturn(Optional.empty()); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.claimAcl(aclId); assertThat(apiResp.getMessage()).isEqualTo("Acl does not exist."); @@ -1127,13 +1159,13 @@ public void claimAcl_TopicDoesNotExistOnACL() throws KlawException { int aclId = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser( - any(), eq(PermissionType.REQUEST_CREATE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.getAcl(eq(aclId), anyInt())).thenReturn(Optional.of(acl)); when(handleDbRequests.getTopics(eq(acl.getTopicname()), eq(TENANT_ID))) .thenReturn(new ArrayList<>()); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.claimAcl(aclId); assertThat(apiResp.getMessage()).isEqualTo("Unable to find the topic related to this ACL."); @@ -1146,9 +1178,6 @@ public void claimAcl_claimAlreadyExists() throws KlawException { int aclId = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser( - any(), eq(PermissionType.REQUEST_CREATE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.getAcl(eq(aclId), anyInt())).thenReturn(Optional.of(acl)); ArrayList topics = new ArrayList<>(); @@ -1163,6 +1192,9 @@ public void claimAcl_claimAlreadyExists() throws KlawException { eq(TENANT_ID), eq(aclId))) .thenReturn(true); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.claimAcl(aclId); assertThat(apiResp.getMessage()).isEqualTo(ACL_ERR_108); @@ -1175,9 +1207,6 @@ public void claimAcl_createClaimRequest() throws KlawException { int aclId = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser( - any(), eq(PermissionType.REQUEST_CREATE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.getAcl(eq(aclId), anyInt())).thenReturn(Optional.of(acl)); ArrayList topics = new ArrayList<>(); @@ -1207,6 +1236,9 @@ public void claimAcl_createClaimRequest() throws KlawException { put("result", ApiResultStatus.SUCCESS.value); } }); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.claimAcl(aclId); verify(approvalService, times(1)) .sendEmailToApprovers( @@ -1227,8 +1259,6 @@ public void claimAcl_createClaimRequest() throws KlawException { public void claimAcl_approveClaim_NotAuthorized() throws KlawException, KlawBadRequestException { String reqNum = "224"; stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(true); ApiResponse apiResp = aclControllerService.approveAclRequests(reqNum); assertThat(apiResp.isSuccess()).isFalse(); @@ -1242,8 +1272,6 @@ public void claimAcl_approveClaim_transferOwnership() int reqNum = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); AclRequests aclReq = getAclClaimRequestDao(reqNum); when(handleDbRequests.getAclRequest(eq(reqNum), eq(TENANT_ID))) @@ -1261,6 +1289,8 @@ public void claimAcl_approveClaim_transferOwnership() .thenReturn(false); when(manageDatabase.getTeamObjForTenant(eq(TENANT_ID))) .thenReturn(getTeamsListWithServiceAccounts(aclReq)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(String.valueOf(reqNum)); @@ -1299,8 +1329,6 @@ public void claimAcl_approveClaim_transferOwnership() int reqNum = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); AclRequests aclReq = getAclClaimRequestDao(reqNum); when(handleDbRequests.getAclRequest(eq(reqNum), eq(TENANT_ID))) @@ -1318,6 +1346,8 @@ public void claimAcl_approveClaim_transferOwnership() .thenReturn(true); when(manageDatabase.getTeamObjForTenant(eq(TENANT_ID))) .thenReturn(getTeamsListWithServiceAccounts(aclReq)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(String.valueOf(reqNum)); @@ -1342,8 +1372,6 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() int reqNum = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); AclRequests aclReq = getAclClaimRequestDao(reqNum); when(handleDbRequests.getAclRequest(eq(reqNum), eq(TENANT_ID))) @@ -1354,6 +1382,8 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() topics.add(createTopic()); when(manageDatabase.getTopicsForTenant(TENANT_ID)).thenReturn(topics); when(approvalService.isRequestFullyApproved(any())).thenReturn(false); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(String.valueOf(reqNum)); @@ -1380,8 +1410,6 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() int reqNum = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); AclRequests aclReq = getAclClaimRequestDao(reqNum); when(handleDbRequests.getAclRequest(eq(reqNum), eq(TENANT_ID))) @@ -1404,6 +1432,8 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() .existsAclSslInTeam(aclReq.getTeamId(), aclReq.getTenantId(), aclReq.getAcl_ssl())) .thenReturn(false); when(manageDatabase.getTeamObjForTenant(eq(TENANT_ID))).thenReturn(existingTeams); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(String.valueOf(reqNum)); @@ -1443,8 +1473,6 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() int reqNum = 224; stubUserInfo(); Acl acl = createAcl(); - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.APPROVE_SUBSCRIPTIONS))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); AclRequests aclReq = getAclClaimRequestDao(reqNum); when(handleDbRequests.getAclRequest(eq(reqNum), eq(TENANT_ID))) @@ -1466,6 +1494,8 @@ public void claimAcl_approveClaim_Not_fullyApproved_doNot_transferOwnership() .existsAclSslInTeam(aclReq.getTeamId(), aclReq.getTenantId(), aclReq.getAcl_ssl())) .thenReturn(false); when(manageDatabase.getTeamObjForTenant(eq(TENANT_ID))).thenReturn(existingTeams); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse apiResp = aclControllerService.approveAclRequests(String.valueOf(reqNum)); @@ -1516,6 +1546,9 @@ public void createAclProducer_alreadyExists() throws KlawException { .thenReturn(true); stubUserInfo(); mockKafkaFlavor(); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); ApiResponse resultResp = aclControllerService.createAcl(aclRequests); assertThat(resultResp.getMessage()).isEqualTo("Subscription already exists."); @@ -1542,6 +1575,10 @@ public void createAclConsumer_alreadyExists() throws KlawException { mockKafkaFlavor(); stubUserInfo(); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) + .thenReturn(false); + ApiResponse resultResp = aclControllerService.createAcl(aclRequests); assertThat(resultResp.getMessage()).isEqualTo("Subscription already exists."); } diff --git a/core/src/test/java/io/aiven/klaw/service/AclSyncControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/AclSyncControllerServiceTest.java index 87bb8f90e..50306bbba 100644 --- a/core/src/test/java/io/aiven/klaw/service/AclSyncControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/AclSyncControllerServiceTest.java @@ -42,12 +42,8 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -80,15 +76,8 @@ public void setUp() throws Exception { ReflectionTestUtils.setField( aclSyncControllerService, "commonUtilsService", commonUtilsService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -96,7 +85,7 @@ private void loginMock() { public void updateSyncAcls() throws KlawException { stubUserInfo(); when(handleDbRequests.addToSyncacls(anyList())).thenReturn(ApiResultStatus.SUCCESS.value); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) .thenReturn(false); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); @@ -110,7 +99,7 @@ public void updateSyncAcls() throws KlawException { @Order(2) public void updateSyncAclsFailure1() throws KlawException { stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) .thenReturn(false); ApiResponse resultResp = @@ -122,7 +111,7 @@ public void updateSyncAclsFailure1() throws KlawException { @Order(3) public void updateSyncAclsFailure2() { stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) .thenReturn(false); when(handleDbRequests.addToSyncacls(anyList())).thenThrow(new RuntimeException("Error")); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) @@ -140,7 +129,7 @@ public void updateSyncAclsFailure2() { public void updateSyncAclsFailure3() throws KlawException { List updates = new ArrayList<>(); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) .thenReturn(false); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -153,7 +142,7 @@ public void updateSyncAclsFailure3() throws KlawException { public void updateSyncAclsFailure4() { when(handleDbRequests.addToSyncacls(anyList())).thenThrow(new RuntimeException("Error")); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) .thenReturn(false); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -187,6 +176,8 @@ public void getAclsSyncTrue1() throws KlawException { .thenReturn(clustersHashMap); when(clustersHashMap.get(any())).thenReturn(kwClusters); when(kwClusters.getBootstrapServers()).thenReturn("clusters"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) + .thenReturn(false); List aclList = aclSyncControllerService.getSyncAcls(envSelected, pageNo, "1", topicNameSearch, ""); @@ -217,6 +208,8 @@ public void getAclsSyncTrueNonApacheKafka() throws KlawException { .thenReturn(clustersHashMap); when(clustersHashMap.get(any())).thenReturn(kwClusters); when(kwClusters.getBootstrapServers()).thenReturn("clusters"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) + .thenReturn(false); List aclList = aclSyncControllerService.getSyncAcls(envSelected, pageNo, "1", topicNameSearch, ""); @@ -263,6 +256,8 @@ public void getAclsSyncTrueGetDeletedOnClusterNonApacheKafka() throws KlawExcept .thenReturn(clustersHashMap); when(clustersHashMap.get(any())).thenReturn(kwClusters); when(kwClusters.getBootstrapServers()).thenReturn("clusters"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) + .thenReturn(false); List aclList = aclSyncControllerService.getSyncAcls(envSelected, pageNo, "1", topicNameSearch, ""); @@ -291,6 +286,8 @@ public void getAclsSyncTrue2() throws KlawException { .thenReturn(clustersHashMap); when(clustersHashMap.get(any())).thenReturn(kwClusters); when(kwClusters.getBootstrapServers()).thenReturn("clusters"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SUBSCRIPTIONS)) + .thenReturn(false); List aclList = aclSyncControllerService.getSyncAcls(envSelected, pageNo, "", topicNameSearch, ""); @@ -324,7 +321,8 @@ public void updateSyncBackAcls() throws KlawException { .thenReturn(clustersHashMap); when(clustersHashMap.get(any())).thenReturn(kwClusters); when(kwClusters.getKafkaFlavor()).thenReturn(KafkaFlavors.AIVEN_FOR_APACHE_KAFKA.value); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.SYNC_BACK_SUBSCRIPTIONS)) .thenReturn(false); when(handleDbRequests.getSyncAclsFromReqNo(anyInt(), anyInt())) .thenReturn(getAclsSOT0().get(0)); @@ -407,6 +405,6 @@ private List getAclsSOT0NonApacheKafka() { private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(101); - when(mailService.getUserName(any())).thenReturn("kwusera"); + when(mailService.getUserName(userDetails)).thenReturn("kwusera"); } } diff --git a/core/src/test/java/io/aiven/klaw/service/AnalyticsControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/AnalyticsControllerServiceTest.java index 8996e7081..65c23223a 100644 --- a/core/src/test/java/io/aiven/klaw/service/AnalyticsControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/AnalyticsControllerServiceTest.java @@ -7,7 +7,6 @@ import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; import io.aiven.klaw.UtilMethods; import io.aiven.klaw.config.ManageDatabase; @@ -30,19 +29,17 @@ import java.util.Map; import java.util.Set; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.test.context.junit.jupiter.SpringExtension; -@ExtendWith(MockitoExtension.class) +@ExtendWith(SpringExtension.class) class AnalyticsControllerServiceTest { public static final int NUMBER_OF_DAYS = 30; @Mock private ManageDatabase manageDatabase; @@ -52,12 +49,11 @@ class AnalyticsControllerServiceTest { @Mock private HandleDbRequestsJdbc handleDbRequestsJdbc; @Mock private UserDetails userDetails; - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + @BeforeEach + public void setUp() { + Mockito.when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + Mockito.when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + .thenReturn(true); } @Test @@ -460,13 +456,9 @@ public void getTeamsOverview_UnauthorizedUser() { teamOverview.setTopicsPerTeamsOverview(chartsJsOverview); List expected = List.of(teamOverview); - loginMock(); Mockito.when(commonUtilsService.getCurrentUserName()).thenReturn(TestConstants.USERNAME); Mockito.when(commonUtilsService.getTeamId(TestConstants.USERNAME)) .thenReturn(TestConstants.TEAM_ID); - Mockito.when( - commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.ALL_TEAMS_REPORTS))) - .thenReturn(true); Mockito.when(commonUtilsService.getTenantId(TestConstants.USERNAME)) .thenReturn(TestConstants.TENANT_ID); Mockito.doReturn(chartsJsOverview) @@ -509,12 +501,11 @@ public void getTeamsOverview_AuthorizedUser() { teamOverview.setTopicsPerTeamsOverview(chartsJsOverview); List expected = List.of(teamOverview); - loginMock(); Mockito.when(commonUtilsService.getCurrentUserName()).thenReturn(TestConstants.USERNAME); Mockito.when(commonUtilsService.getTeamId(TestConstants.USERNAME)) .thenReturn(TestConstants.TEAM_ID); Mockito.when( - commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.ALL_TEAMS_REPORTS))) + commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ALL_TEAMS_REPORTS)) .thenReturn(false); Mockito.when(commonUtilsService.getTenantId(TestConstants.USERNAME)) .thenReturn(TestConstants.TENANT_ID); @@ -577,7 +568,6 @@ public void generateReport_UnauthorizedUser() { Topic topic = UtilMethods.getDummyTopic(); Acl acl = UtilMethods.getDummyAcl(); - loginMock(); Mockito.when(commonUtilsService.getCurrentUserName()).thenReturn(TestConstants.USERNAME); Mockito.when(commonUtilsService.getTenantId(TestConstants.USERNAME)) .thenReturn(TestConstants.TENANT_ID); @@ -593,9 +583,6 @@ public void generateReport_UnauthorizedUser() { Mockito.doReturn(TestConstants.ENV_NAME) .when(analyticsControllerService) .getEnvName(TestConstants.ENV_ID); - Mockito.when( - commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.ALL_TEAMS_REPORTS))) - .thenReturn(true); Mockito.when(commonUtilsService.getTeamId(TestConstants.USERNAME)) .thenReturn(TestConstants.TEAM_ID); Mockito.when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequestsJdbc); @@ -620,7 +607,6 @@ public void generateReport_AuthorizedUser() { Topic topic = UtilMethods.getDummyTopic(); Acl acl = UtilMethods.getDummyAcl(); - loginMock(); Mockito.when(commonUtilsService.getCurrentUserName()).thenReturn(TestConstants.USERNAME); Mockito.when(commonUtilsService.getTenantId(TestConstants.USERNAME)) .thenReturn(TestConstants.TENANT_ID); @@ -637,7 +623,7 @@ public void generateReport_AuthorizedUser() { .when(analyticsControllerService) .getEnvName(TestConstants.ENV_ID); Mockito.when( - commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.ALL_TEAMS_REPORTS))) + commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ALL_TEAMS_REPORTS)) .thenReturn(false); Mockito.when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequestsJdbc); Mockito.when(handleDbRequestsJdbc.getAllTopics(TestConstants.TENANT_ID)) diff --git a/core/src/test/java/io/aiven/klaw/service/EnvsClustersTenantsControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/EnvsClustersTenantsControllerServiceTest.java index 161000034..a74016632 100644 --- a/core/src/test/java/io/aiven/klaw/service/EnvsClustersTenantsControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/EnvsClustersTenantsControllerServiceTest.java @@ -69,6 +69,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -79,6 +80,7 @@ class EnvsClustersTenantsControllerServiceTest { private EnvsClustersTenantsControllerService service; @Mock private MailUtils mailService; + @Mock private UserDetails userDetails; @Mock private CommonUtilsService commonUtilsService; @@ -102,10 +104,12 @@ public void setup() { ReflectionTestUtils.setField( service, "usersTeamsControllerService", usersTeamsControllerService); ReflectionTestUtils.setField(service, "defaultDataService", defaultDataService); - when(mailService.getUserName(any())).thenReturn("testuser"); + when(mailService.getUserName(userDetails)).thenReturn("testuser"); when(handleDbRequestsJdbc.getUsersInfo(any())).thenReturn(buildUserInfo()); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequestsJdbc); when(commonUtilsService.getTenantId(any())).thenReturn(101); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -117,6 +121,8 @@ void addNewEnv() throws KlawException, KlawValidationException { Env SchemaEnv = generateKafkaEnv("9", "Schema"); when(handleDbRequestsJdbc.addNewEnv(any())).thenReturn(ApiResultStatus.SUCCESS.value); when(handleDbRequestsJdbc.getEnvDetails(anyString(), anyInt())).thenReturn(SchemaEnv); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); assertThat(response.getMessage()).contains("success"); } @@ -134,6 +140,8 @@ void addNewEnvNameAlreadyInUse() throws KlawException, KlawValidationException { buildEnv("5", 101, "TST", KafkaClustersType.SCHEMA_REGISTRY, 5))); when(manageDatabase.getKafkaEnvList(anyInt())) .thenReturn(List.of(buildEnv("4", 101, "DEV", KafkaClustersType.KAFKA, 4))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); assertThat(response.getMessage()) .contains("Failure. Please choose a different name. This environment name already exists."); @@ -150,6 +158,8 @@ void addNewEnvWithAssociatedEnv() throws KlawException, KlawValidationException when(handleDbRequestsJdbc.getEnvDetails(eq("1"), eq(101))) .thenReturn(kafkaEnv) .thenReturn(null); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); kafkaEnv.setAssociatedEnv(env.getAssociatedEnv()); verify(handleDbRequestsJdbc, times(1)).addNewEnv(eq(kafkaEnv)); @@ -180,6 +190,8 @@ void updateEnvWithDifferentAssociatedEnv() throws KlawException, KlawValidationE .thenReturn(generateKafkaEnv("2", "Kafka")); when(handleDbRequestsJdbc.getNextSeqIdAndUpdate(eq(EntityType.ENVIRONMENT.name()), eq(101))) .thenReturn(1); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); kafkaEnv.setAssociatedEnv(env.getAssociatedEnv()); verify(handleDbRequestsJdbc, times(1)).addNewEnv(eq(kafkaEnv)); @@ -203,6 +215,8 @@ void updateEnvWithKafkaEnvAlreadyAssociatedWithAnotherEnv() { Env kafkaEnv = generateKafkaEnv("1", "Kafka"); kafkaEnv.setAssociatedEnv(new EnvTag("2", "TST_SCH")); when(handleDbRequestsJdbc.getEnvDetails(eq("1"), eq(101))).thenReturn(kafkaEnv); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); assertThatExceptionOfType(KlawValidationException.class) .isThrownBy( @@ -222,6 +236,8 @@ void addEnvWithoutAssociatedEnv() throws KlawValidationException, KlawException when(handleDbRequestsJdbc.getEnvDetails(eq("1"), eq(101))).thenReturn(env1).thenReturn(null); when(handleDbRequestsJdbc.addNewEnv(any())).thenReturn(ApiResultStatus.SUCCESS.value); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); assertThat(response.getMessage()).contains("success"); @@ -243,6 +259,8 @@ void addEnvRemoveAssociatedEnv() throws KlawValidationException, KlawException { when(handleDbRequestsJdbc.addNewEnv(any())).thenReturn(ApiResultStatus.SUCCESS.value); when(handleDbRequestsJdbc.getNextSeqIdAndUpdate(eq(EntityType.ENVIRONMENT.name()), eq(101))) .thenReturn(1); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); assertThat(response.getMessage()).contains("success"); @@ -264,6 +282,8 @@ void addEnvRemoveAssociatedEnvIncorrectIdSupplied() when(handleDbRequestsJdbc.addNewEnv(any())).thenReturn(ApiResultStatus.SUCCESS.value); when(handleDbRequestsJdbc.getNextSeqIdAndUpdate(eq(EntityType.ENVIRONMENT.name()), eq(101))) .thenReturn(1); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) + .thenReturn(false); ApiResponse response = service.addNewEnv(env); assertThat(response.getMessage()).contains("success"); @@ -308,7 +328,7 @@ void getEnvs(KafkaClustersType type, String searchBy, String pageNo, int expecte put(101, ""); } }); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); List response = service.getEnvsPaginated(type, "", pageNo, searchBy); @@ -321,7 +341,6 @@ void getEnvs(KafkaClustersType type, String searchBy, String pageNo, int expecte username = "james", authorities = {"ADMIN", "USER"}) void deleteTenantUnauthorizedUser1() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse response = service.deleteTenant(); assertThat(response).isEqualTo(ApiResponse.NOT_AUTHORIZED); @@ -332,7 +351,8 @@ void deleteTenantUnauthorizedUser1() throws KlawException { username = "james", authorities = {"ADMIN", "USER"}) void deleteTenantUnauthorizedUser2() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.UPDATE_DELETE_MY_TENANT)) .thenReturn(false); ApiResponse response = service.deleteTenant(); @@ -345,7 +365,8 @@ void deleteTenantUnauthorizedUser2() throws KlawException { authorities = {"ADMIN", "USER"}) void deleteTenantFailed() throws KlawException { int tenantId = 102; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.UPDATE_DELETE_MY_TENANT)) .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); when(manageDatabase.getTenantMap()) @@ -374,7 +395,8 @@ void deleteTenantFailed() throws KlawException { authorities = {"ADMIN", "USER"}) void deleteTenant() throws KlawException { int tenantId = 102; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.UPDATE_DELETE_MY_TENANT)) .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); when(manageDatabase.getTenantMap()) @@ -425,7 +447,6 @@ void addTenantIdExceedMax() throws KlawException { void addTenantIdUnauthorized() throws KlawException { when(handleDbRequestsJdbc.getTenants()).thenReturn(List.of(new KwTenants(), new KwTenants())); ReflectionTestUtils.setField(service, "maxNumberOfTenantsCanBeCreated", 100); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse response = service.addTenantId(new KwTenantModel(), true); assertThat(response).isEqualTo(ApiResponse.NOT_AUTHORIZED); @@ -446,7 +467,7 @@ void addTenantIdInternal() throws KlawException { kwTenant2.setTenantId(102); when(handleDbRequestsJdbc.getTenants()).thenReturn(List.of(kwTenant1, kwTenant2)); ReflectionTestUtils.setField(service, "maxNumberOfTenantsCanBeCreated", 100); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_TENANT)) .thenReturn(false); when(handleDbRequestsJdbc.addNewTenant(any())).thenReturn("add new tenant"); ApiResponse response = service.addTenantId(kwTenantModel, false); @@ -474,7 +495,7 @@ void addTenantIdExternal() throws KlawException { when(handleDbRequestsJdbc.getTenants()).thenReturn(List.of(kwTenant1, kwTenant2)); ReflectionTestUtils.setField(service, "maxNumberOfTenantsCanBeCreated", 100); ReflectionTestUtils.setField(service, "kwInstallationType", "kwInstallationType"); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_TENANT)) .thenReturn(false); when(handleDbRequestsJdbc.addNewTenant(any())).thenReturn("add new tenant"); List kwProperties = List.of(new KwProperties()); @@ -552,7 +573,6 @@ void getUpdateEnvStatus() throws KlawBadRequestException { username = "james", authorities = {"ADMIN", "USER"}) void deleteEnvironmentUnauthorized() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse response = service.deleteEnvironment("envId", "envType"); assertThat(response).isEqualTo(ApiResponse.NOT_AUTHORIZED); @@ -565,7 +585,7 @@ void deleteEnvironmentUnauthorized() throws KlawException { void deleteEnvironmentExistKafkaComponents() throws KlawException { int tenantId = 101; String envId = "20"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.existsKafkaComponentsForEnv(envId, tenantId)).thenReturn(true); @@ -581,7 +601,7 @@ void deleteEnvironmentExistKafkaComponents() throws KlawException { void deleteEnvironmentExistKafkaConnectComponents() throws KlawException { int tenantId = 101; String envId = "20"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.existsConnectorComponentsForEnv(envId, tenantId)).thenReturn(true); @@ -597,7 +617,7 @@ void deleteEnvironmentExistKafkaConnectComponents() throws KlawException { void deleteEnvironmentExistSchemaRegistryComponents() throws KlawException { int tenantId = 101; String envId = "20"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.existsSchemaComponentsForEnv(envId, tenantId)).thenReturn(true); @@ -614,7 +634,7 @@ void deleteEnvironmentExistSchemaRegistryComponents() throws KlawException { void deleteEnvironmentWithAssociatedEnv() throws KlawException { int tenantId = 101; String envId = "20"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.existsKafkaComponentsForEnv(envId, tenantId)).thenReturn(false); @@ -643,7 +663,7 @@ void deleteEnvironmentWithAssociatedEnv() throws KlawException { void deleteEnvironmentFailed() throws KlawException { int tenantId = 101; String envId = "20"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.existsKafkaComponentsForEnv(envId, tenantId)).thenReturn(false); @@ -662,7 +682,6 @@ void deleteEnvironmentFailed() throws KlawException { username = "james", authorities = {"ADMIN", "USER"}) void addNewClusterUnauthorized() { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse response = service.addNewCluster(new KwClustersModel()); assertThat(response).isEqualTo(ApiResponse.NOT_AUTHORIZED); @@ -674,7 +693,8 @@ void addNewClusterUnauthorized() { authorities = {"ADMIN", "USER"}) void addNewCluster() { int tenantId = 101; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(handleDbRequestsJdbc.addNewCluster(any(KwClusters.class))) @@ -698,7 +718,8 @@ void addNewCluster() { authorities = {"ADMIN", "USER"}) void addNewClusterFailed() { int tenantId = 101; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(handleDbRequestsJdbc.addNewCluster(any(KwClusters.class))) @@ -720,7 +741,8 @@ void addNewClusterFailed() { authorities = {"ADMIN", "USER"}) void addNewClusterNameExists() { int tenantId = 101; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(manageDatabase.getClusters(KafkaClustersType.ALL, tenantId)) @@ -805,7 +827,6 @@ void getSyncEnvs() { username = "james", authorities = {"ADMIN", "USER"}) void getEnvDetailsUnauthorized() { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); when(commonUtilsService.getEnvsFromUserId(anyString())).thenReturn(new HashSet<>()); EnvModelResponse result = service.getEnvDetails("env id", "cluster type"); assertThat(result).isNull(); @@ -818,7 +839,7 @@ void getEnvDetailsUnauthorized() { void getEnvDetails() { int tenantId = 101; String envId = "1"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.getEnvDetails(envId, tenantId)) @@ -857,7 +878,8 @@ void getClusters() { List.of( buildEnv("1", tenantId, "env1", KafkaClustersType.KAFKA, 1), buildEnv("2", tenantId, "env2", KafkaClustersType.KAFKA, 2))); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); List result = service.getClusters(KafkaClustersType.KAFKA.value); @@ -879,7 +901,6 @@ void getMyTenantInfo() { KwTenants tenant = buildTenants(tenantId); when(handleDbRequestsJdbc.getMyTenants(tenantId)).thenReturn(Optional.of(tenant)); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); KwTenantModel result = service.getMyTenantInfo(); assertThat(result.getTenantName()).isEqualTo(tenant.getTenantName()); assertThat(result.getContactPerson()).isEqualTo(tenant.getContactPerson()); @@ -980,7 +1001,6 @@ void getClusterDetails() { username = "james", authorities = {"ADMIN", "USER"}) void updateTenantUnauthorized() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse result = service.updateTenant(new KwTenantModel()); assertThat(result).isEqualTo(ApiResponse.NOT_AUTHORIZED); } @@ -992,7 +1012,8 @@ void updateTenantUnauthorized() throws KlawException { void updateTenantFailed() throws KlawException { int tenantId = 101; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.UPDATE_DELETE_MY_TENANT)) .thenReturn(false); when(handleDbRequestsJdbc.addNewTenant(any(KwTenants.class))) .thenReturn("failed to add new tenant"); @@ -1008,7 +1029,8 @@ void updateTenantFailed() throws KlawException { void updateTenant() throws KlawException { int tenantId = 101; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.UPDATE_DELETE_MY_TENANT)) .thenReturn(false); when(handleDbRequestsJdbc.addNewTenant(any(KwTenants.class))) .thenReturn(ApiResultStatus.SUCCESS.value); @@ -1026,7 +1048,6 @@ void updateTenant() throws KlawException { void getClusterInfoFromEnvUnauthorized() { int tenantId = 101; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); when(commonUtilsService.getEnvsFromUserId(anyString())).thenReturn(new HashSet<>()); ClusterInfo result = service.getClusterInfoFromEnv("1", KafkaClustersType.KAFKA.value); assertThat(result).isNull(); @@ -1040,7 +1061,7 @@ void getClusterInfoFromEnv() { int tenantId = 101; String envId = "1"; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequestsJdbc.getEnvDetails(envId, tenantId)) .thenReturn(buildEnv(envId, tenantId, "env1", KafkaClustersType.KAFKA, 1)); @@ -1055,7 +1076,6 @@ void getClusterInfoFromEnv() { username = "james", authorities = {"ADMIN", "USER"}) void deleteClusterUnauthorized() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse result = service.deleteCluster("cluster id"); assertThat(result).isEqualTo(ApiResponse.NOT_AUTHORIZED); } @@ -1068,7 +1088,8 @@ void deleteClusterNotAllowed() throws KlawException { int tenantId = 101; String clusterId = "1"; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(manageDatabase.getAllEnvList(tenantId)) .thenReturn(List.of(buildEnv("1", tenantId, "env1", KafkaClustersType.KAFKA, 1))); @@ -1085,7 +1106,8 @@ void deleteClusterFailed() throws KlawException { int tenantId = 101; String clusterId = "2"; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(manageDatabase.getAllEnvList(tenantId)) .thenReturn(List.of(buildEnv("1", tenantId, "env1", KafkaClustersType.KAFKA, 1))); @@ -1103,7 +1125,8 @@ void deleteCluster() throws KlawException { int tenantId = 101; String clusterId = "2"; when(commonUtilsService.getTenantId(any())).thenReturn(tenantId); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.ADD_EDIT_DELETE_CLUSTERS)) .thenReturn(false); when(manageDatabase.getAllEnvList(tenantId)) .thenReturn(List.of(buildEnv("1", tenantId, "env1", KafkaClustersType.KAFKA, 1))); diff --git a/core/src/test/java/io/aiven/klaw/service/KafkaConnectControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/KafkaConnectControllerServiceTest.java index 8f5bfaaf2..7b834ed0f 100644 --- a/core/src/test/java/io/aiven/klaw/service/KafkaConnectControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/KafkaConnectControllerServiceTest.java @@ -51,10 +51,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -109,15 +105,8 @@ public void setUp() throws Exception { rolesPermissionsControllerService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); } @Test @@ -127,7 +116,8 @@ public void createConnectorRequest() throws KlawException { resultMap.put("result", ApiResultStatus.SUCCESS.value); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_CONNECTORS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(TENANT_ID); when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); @@ -155,7 +145,8 @@ public void createConnectorRequestInvalidJsonConfig() { KafkaConnectorRequestModel kafkaConnectorRequestModel = getConnectRequestModel(); kafkaConnectorRequestModel.setConnectorConfig("plain string"); // Invalid json stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_CONNECTORS)) .thenReturn(false); when(handleDbRequests.requestForConnector(any())) .thenThrow(new RuntimeException("Unrecognized token")); @@ -173,7 +164,8 @@ public void createConnectorRequestParameterTopicsDoesntExist() throws KlawExcept KafkaConnectorRequestModel kafkaConnectorRequestModel = getConnectRequestModel(); kafkaConnectorRequestModel.setConnectorConfig(getInvalidValidConnConfig()); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_CONNECTORS)) .thenReturn(false); ApiResponse apiResponse = @@ -189,7 +181,8 @@ public void createConnectorRequestParameterTopicsTopicRegexExist() throws KlawEx KafkaConnectorRequestModel kafkaConnectorRequestModel = getConnectRequestModel(); kafkaConnectorRequestModel.setConnectorConfig(getInvalidValidConnConfigTopicsTopicsRegex()); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_CONNECTORS)) .thenReturn(false); ApiResponse apiResponse = @@ -204,8 +197,6 @@ public void createClaimConnectorRequest() throws KlawException { Set envListIds = new HashSet<>(); envListIds.add("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.getConnectorsFromName(eq("ConnectorOne"), eq(TENANT_ID))) .thenReturn(List.of(getKwKafkaConnector())); @@ -227,8 +218,6 @@ public void createClaimConnectorRequestAlreadyExists() throws KlawException { Set envListIds = new HashSet<>(); envListIds.add("DEV"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); when(handleDbRequests.existsConnectorRequest( "ConnectorOne", "1", RequestStatus.CREATED.value, TENANT_ID)) @@ -247,8 +236,6 @@ public void getRequests_OrderBy_NEWEST_FIRST() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(handleDbRequests.getAllConnectorRequests( anyString(), @@ -291,8 +278,6 @@ public void getRequests_OrderBy_OLDEST_FIRST() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(handleDbRequests.getAllConnectorRequests( anyString(), @@ -335,8 +320,6 @@ public void getRequests_IsOnlyMyRequests() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(handleDbRequests.getAllConnectorRequests( anyString(), @@ -380,8 +363,6 @@ public void getRequests_() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(handleDbRequests.getAllConnectorRequests( anyString(), @@ -425,8 +406,6 @@ public void getClaimRequests_WhereConnectorIsDeleted() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); List connectorRequests = generateKafkaConnectorRequests(9); connectorRequests.addAll(generateKafkaConnectorRequests(1, 7, RequestOperationType.CLAIM)); when(handleDbRequests.getAllConnectorRequests( @@ -473,8 +452,6 @@ public void getClaimRequests_WhereConnectorIsNotDeleted() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); List connectorRequests = generateKafkaConnectorRequests(9); connectorRequests.addAll(generateKafkaConnectorRequests(1, 7, RequestOperationType.CLAIM)); when(handleDbRequests.getAllConnectorRequests( @@ -524,8 +501,6 @@ public void getConnectorOverview_WithNoParams_returnsNull() throws KlawException envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(3)); @@ -542,8 +517,6 @@ public void getConnectorOverview_WithAllEnvs_noPromotionOrderSet() throws KlawEx envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(3)); @@ -588,8 +561,6 @@ public void getConnectorOverview_WithAllEnvs() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(3)); @@ -621,8 +592,6 @@ public void getConnectorOverview_WithOneEnv() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(3)); @@ -655,8 +624,6 @@ public void getConnectorOverview_WithOneEnvAndPromotion() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -690,8 +657,6 @@ public void getConnectorOverview_WithOneEnvAndNoPromotionForBaseEnv() throws Kla envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -775,8 +740,6 @@ public void getConnectorOverview_WithHighestEnvAndConnectorOwnerSet() throws Kla envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -810,8 +773,6 @@ public void getConnectorOverview_WithRequestsOpen() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -855,8 +816,6 @@ public void getConnectorOverview_WithNoRequestsOpen() throws KlawException { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -897,8 +856,6 @@ public void getConnectorOverviewPerEnv_ConnectorDoesNotExist() { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -923,8 +880,6 @@ public void getConnectorOverviewPerEnv_ConnectorOwnedByDifferentTeam() { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -954,8 +909,6 @@ public void getConnectorOverview_WithClaimRequestsOpenAndNoOtherRequestOpen() envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -1005,8 +958,6 @@ public void getConnectorOverview_WithPromotionRequestsOpen() throws KlawExceptio envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(TENANT_ID); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTeamId(eq(USERNAME))).thenReturn(8); when(handleDbRequests.getConnectors(eq(CONNECTOR_NAME), eq(TENANT_ID))) .thenReturn(generateKafkaConnectors(2)); @@ -1158,7 +1109,7 @@ private String getInvalidValidConnConfigTopicsTopicsRegex() { private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(TENANT_ID); - when(mailService.getUserName(any())).thenReturn(USERNAME); + when(mailService.getUserName(userDetails)).thenReturn(USERNAME); Env e = new Env(); e.setId("1"); e.setName("DEV"); diff --git a/core/src/test/java/io/aiven/klaw/service/KafkaConnectSyncControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/KafkaConnectSyncControllerServiceTest.java index efa5da0e2..a2ab46fe0 100644 --- a/core/src/test/java/io/aiven/klaw/service/KafkaConnectSyncControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/KafkaConnectSyncControllerServiceTest.java @@ -38,10 +38,6 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -98,7 +94,8 @@ public void setUp() throws Exception { kafkaConnectSyncControllerService, "clusterApiService", clusterApiService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } private void environmentSetUp() { @@ -112,18 +109,10 @@ private void environmentSetUp() { when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(List.of(env, test)); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(101); - when(mailService.getUserName(any())).thenReturn(USERNAME); + when(mailService.getUserName(userDetails)).thenReturn(USERNAME); when(commonUtilsService.getTenantId(eq(USERNAME))).thenReturn(TENANT_ID); } @@ -134,7 +123,7 @@ public void updateSyncConnectorsSuccess() throws KlawException { when(manageDatabase.getTenantConfig()).thenReturn(tenantConfig); when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_CONNECTORS)) .thenReturn(false); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); diff --git a/core/src/test/java/io/aiven/klaw/service/OperationalRequestsServiceTest.java b/core/src/test/java/io/aiven/klaw/service/OperationalRequestsServiceTest.java index 3c1abba10..85fda15b1 100644 --- a/core/src/test/java/io/aiven/klaw/service/OperationalRequestsServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/OperationalRequestsServiceTest.java @@ -41,10 +41,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -94,15 +90,8 @@ public void setUp() throws Exception { env.setName("DEV"); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -110,7 +99,8 @@ private void loginMock() { public void createConsumerOffsetsResetRequestDoesNotOwnGroup() throws KlawNotAuthorizedException { ConsumerOffsetResetRequestModel consumerOffsetResetRequestModel = utilMethods.getConsumerOffsetResetRequest(1001); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) .thenReturn(false); ApiResponse apiResponse = @@ -125,7 +115,8 @@ public void createRequestEmptyResetTimeForDateTimeResetType() throws KlawNotAuth ConsumerOffsetResetRequestModel consumerOffsetResetRequestModel = utilMethods.getConsumerOffsetResetRequest(1001); consumerOffsetResetRequestModel.setOffsetResetType(OffsetResetType.TO_DATE_TIME); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) .thenReturn(false); when(handleDbRequests.getSyncAcls(anyString(), anyString(), anyInt(), anyString(), anyInt())) .thenReturn(utilMethods.getAcls()); @@ -141,7 +132,8 @@ public void createRequestEmptyResetTimeForDateTimeResetType() throws KlawNotAuth public void createRequestWhichAlreadyExists() throws KlawNotAuthorizedException { ConsumerOffsetResetRequestModel consumerOffsetResetRequestModel = utilMethods.getConsumerOffsetResetRequest(1001); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) .thenReturn(false); when(handleDbRequests.getSyncAcls(anyString(), anyString(), anyInt(), anyString(), anyInt())) .thenReturn(utilMethods.getAcls()); @@ -169,7 +161,8 @@ public void createRequestWhichAlreadyExists() throws KlawNotAuthorizedException public void createRequestSuccess() throws KlawNotAuthorizedException { ConsumerOffsetResetRequestModel consumerOffsetResetRequestModel = utilMethods.getConsumerOffsetResetRequest(1001); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.REQUEST_CREATE_SUBSCRIPTIONS)) .thenReturn(false); when(handleDbRequests.getSyncAcls(anyString(), anyString(), anyInt(), anyString(), anyInt())) .thenReturn(utilMethods.getAcls()); @@ -203,7 +196,8 @@ public void approveOperationalRequestsSuccess() throws KlawException { UtilMethods.getOffsetsTimingMapMap(); ApiResponse apiResponse = ApiResponse.builder().success(true).data(offsetPositionsBeforeAndAfter).build(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_OPERATIONAL_CHANGES)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(mailService.getCurrentUserName()).thenReturn("testuser"); @@ -220,7 +214,8 @@ public void approveOperationalRequestsSuccess() throws KlawException { @Order(6) public void approveOperationalRequestsFailure() throws KlawException { ApiResponse apiResponse = ApiResponse.builder().success(false).build(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_OPERATIONAL_CHANGES)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(mailService.getCurrentUserName()).thenReturn("testuser"); diff --git a/core/src/test/java/io/aiven/klaw/service/RequestStatisticsServiceTest.java b/core/src/test/java/io/aiven/klaw/service/RequestStatisticsServiceTest.java index fcf371d3e..9f9555364 100644 --- a/core/src/test/java/io/aiven/klaw/service/RequestStatisticsServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/RequestStatisticsServiceTest.java @@ -1,7 +1,6 @@ package io.aiven.klaw.service; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -24,10 +23,6 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -56,7 +51,7 @@ void setUp() { requestStatisticsService, "commonUtilsService", commonUtilsService); ReflectionTestUtils.setField(requestStatisticsService, "mailService", mailService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); } @Test @@ -124,18 +119,10 @@ public void getRequestsCountOverview() { .hasSize(2); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(101); - when(mailService.getUserName(any())).thenReturn("kwusera"); + when(mailService.getUserName(userDetails)).thenReturn("kwusera"); when(mailService.getCurrentUserName()).thenReturn("kwusera"); } } diff --git a/core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java index 13dc0e2fb..ddeb97005 100644 --- a/core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/SchemaRegistryControllerServiceTest.java @@ -45,12 +45,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -108,19 +104,12 @@ public void setUp() throws Exception { rolesPermissionsControllerService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); Boolean validateOnSave = true; ReflectionTestUtils.setField( schemaRegistryControllerService, "validateCompatiblityOnSave", validateOnSave); utilMethods = new UtilMethods(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -147,6 +136,9 @@ public void getSchemaRequests() { when(handleDbRequests.getAllUsersInfoForTeam(anyInt(), anyInt())).thenReturn(List.of(userInfo)); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(this.env); when(manageDatabase.getTeamNameFromTeamId(anyInt(), anyInt())).thenReturn("teamname"); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + .thenReturn(false); List listReqs = schemaRegistryControllerService.getSchemaRequests( @@ -171,6 +163,8 @@ public void deleteSchemaRequestsSuccess() throws KlawException { stubUserInfo(); when(handleDbRequests.deleteSchemaRequest(anyInt(), anyString(), anyInt())) .thenReturn(ApiResultStatus.SUCCESS.value); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_DELETE_SCHEMAS)) + .thenReturn(false); ApiResponse resultResp = schemaRegistryControllerService.deleteSchemaRequests("" + schemaReqId); assertThat(resultResp.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); } @@ -183,11 +177,14 @@ public void deleteSchemaRequestsFailure() { stubUserInfo(); when(handleDbRequests.deleteSchemaRequest(anyInt(), anyString(), anyInt())) .thenThrow(new RuntimeException("Error from Schema upload")); - try { - schemaRegistryControllerService.deleteSchemaRequests("" + schemaReqId); - } catch (KlawException e) { - assertThat(e.getMessage()).contains("Error from Schema upload"); - } + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_DELETE_SCHEMAS)) + .thenReturn(false); + + KlawException ex = + assertThrows( + KlawException.class, + () -> schemaRegistryControllerService.deleteSchemaRequests("" + schemaReqId)); + assertThat(ex.getMessage()).contains("Error from Schema upload"); } @Test @@ -223,7 +220,7 @@ public void execSchemaRequestsSuccess() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SCHEMAS)) .thenReturn(false); ApiResponse resultResp = schemaRegistryControllerService.execSchemaRequests("" + schemaReqId); @@ -252,7 +249,7 @@ public void execSchemaRequestsFailure1() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SCHEMAS)) .thenReturn(false); ApiResponse resultResp = schemaRegistryControllerService.execSchemaRequests("" + schemaReqId); @@ -286,7 +283,7 @@ public void execSchemaRequestsFailure2() { when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_SCHEMAS)) .thenReturn(false); try { @@ -310,7 +307,7 @@ public void uploadSchemaSuccess() throws KlawException { when(commonUtilsService.getTenantId(anyString())).thenReturn(101); mockGetEnvironment(); when(manageDatabase.getEnv(eq(101), eq(1))).thenReturn(Optional.of(createEnv(1))); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(false); when(handleDbRequests.requestForSchema(any())).thenReturn(ApiResultStatus.SUCCESS.value); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) @@ -331,7 +328,7 @@ public void uploadSchemaFailure() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(false); when(handleDbRequests.requestForSchema(any())) .thenThrow(new RuntimeException("Error from schema upload")); @@ -351,7 +348,7 @@ public void uploadSchemaFailure() throws KlawException { @Order(9) public void promoteSchemaNotAuthorized() throws Exception { // Make user unauthorized - when(commonUtilsService.isNotAuthorizedUser(any(), eq(PermissionType.REQUEST_CREATE_SCHEMAS))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(true); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "1")); @@ -368,6 +365,8 @@ public void promoteSchemaCanNotFindSourceEnvironmentSchema() throws Exception { when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(createTopic())); when(commonUtilsService.getTeamId(any())).thenReturn(101); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "1")); assertThat(returnedValue.getMessage()) @@ -384,6 +383,8 @@ public void promoteSchemaSuccess() throws Exception { .thenReturn(buildValidationResponse(true)); mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "1")); @@ -403,6 +404,8 @@ public void promoteSchemaEnsureCorrectSchemaSelectedV1Success() throws Exception mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "1")); @@ -425,6 +428,8 @@ public void promoteSchemaEnsureCorrectSchemaSelectedV2Success() throws Exception .thenReturn(buildValidationResponse(true)); mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "2")); @@ -447,6 +452,8 @@ public void promoteSchemaEnsureCorrectSchemaSelectedV3Success() throws Exception .thenReturn(buildValidationResponse(true)); mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "3")); @@ -470,6 +477,8 @@ public void promoteSchemaEnsureCorrectSchemaSelectedV4Success() throws Exception .thenReturn(buildValidationResponse(true)); mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "4")); @@ -492,6 +501,8 @@ public void promoteSchemaWithInCompatibleSchemaReturnFailure() throws Exception .thenReturn(buildValidationResponse(false)); mockSchemaCreation(); when(manageDatabase.getEnv(eq(101), eq(8))).thenReturn(Optional.of(createEnv(8))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) + .thenReturn(false); ApiResponse returnedValue = schemaRegistryControllerService.promoteSchema(buildPromoteSchemaRequest(false, "4")); @@ -514,7 +525,7 @@ public void uploadSchemaIncompatibleSchemaError() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(false); mockGetEnvironment(); when(manageDatabase.getEnv(eq(101), eq(1))).thenReturn(Optional.of(createEnv(1))); @@ -619,7 +630,7 @@ public void uploadSchema_NoValidationOnSave() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(false); when(handleDbRequests.requestForSchema(any())).thenReturn(ApiResultStatus.SUCCESS.value); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) @@ -650,7 +661,7 @@ public void uploadSchema_ValidationPropertyNotSet() throws KlawException { when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.REQUEST_CREATE_SCHEMAS)) .thenReturn(false); mockGetEnvironment(); when(manageDatabase.getEnv(eq(101), eq(1))).thenReturn(Optional.of(createEnv(1))); @@ -689,6 +700,9 @@ public void getListofSchemaRequestsIn_NEWEST_FIRST_ORDER() { when(handleDbRequests.getAllUsersInfoForTeam(anyInt(), anyInt())).thenReturn(List.of(userInfo)); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(this.env); when(manageDatabase.getTeamNameFromTeamId(anyInt(), anyInt())).thenReturn("teamname"); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + .thenReturn(false); List ordered_response = schemaRegistryControllerService.getSchemaRequests( @@ -736,6 +750,9 @@ public void getListofSchemaRequestsIn_OLDEST_FIRST_ORDER() { when(handleDbRequests.getAllUsersInfoForTeam(anyInt(), anyInt())).thenReturn(List.of(userInfo)); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(this.env); when(manageDatabase.getTeamNameFromTeamId(anyInt(), anyInt())).thenReturn("teamname"); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.APPROVE_ALL_REQUESTS_TEAMS)) + .thenReturn(false); List ordered_response = schemaRegistryControllerService.getSchemaRequests( @@ -969,6 +986,6 @@ private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(101); when(userInfo.getRole()).thenReturn("USER"); - when(mailService.getUserName(any())).thenReturn("kwusera"); + when(mailService.getUserName(userDetails)).thenReturn("kwusera"); } } diff --git a/core/src/test/java/io/aiven/klaw/service/SchemaRegistrySyncControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/SchemaRegistrySyncControllerServiceTest.java index 169747d9e..c2a277dbe 100644 --- a/core/src/test/java/io/aiven/klaw/service/SchemaRegistrySyncControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/SchemaRegistrySyncControllerServiceTest.java @@ -51,12 +51,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -98,15 +94,8 @@ public void setUp() throws Exception { schemaRegistrySyncControllerService, "commonUtilsService", commonUtilsService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -124,7 +113,7 @@ public void getSchemasOfEnvironmentNotInSyncSourceCluster() throws Exception { kwClustersMap.put(1, utilMethods.getKwClusters()); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -159,7 +148,7 @@ public void getSchemasOfEnvironmentInSyncAndNotInSyncSourceCluster() throws Exce kwClustersMap.put(1, utilMethods.getKwClusters()); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -220,7 +209,7 @@ public void getSchemasOfEnvironmentSourceMetadata() throws Exception { List topics = utilMethods.generateTopics(14); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -252,7 +241,7 @@ public void getSchemasOfEnvironmentNoSchemasSourceMetadata() throws Exception { List topics = utilMethods.generateTopics(14); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -287,7 +276,7 @@ public void updateDbFromCluster() throws Exception { when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(manageDatabase.getClusters(any(), anyInt())).thenReturn(kwClustersMap); @@ -330,7 +319,7 @@ public void updateClusterFromDb() throws Exception { when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_SCHEMAS)) .thenReturn(false); when(manageDatabase.getClusters(any(), anyInt())).thenReturn(kwClustersMap); @@ -388,7 +377,7 @@ public void getSchemaOfTopicFromSourceCluster() throws Exception { when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(manageDatabase.getClusters(any(), anyInt())).thenReturn(kwClustersMap); when(clusterApiService.getAvroSchema(anyString(), any(), anyString(), anyString(), anyInt())) @@ -416,7 +405,7 @@ public void getSchemaOfTopicFromSourceMetadata() throws Exception { when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_SCHEMAS)) .thenReturn(false); MessageSchema schema = utilMethods.getMSchemas().get(0); schema.setTopicname(topicName); @@ -453,7 +442,7 @@ public void deleteOrphanedSchemaMetaDataFromDb(List schemasToBeDeleted) when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(manageDatabase.getClusters(any(), anyInt())).thenReturn(kwClustersMap); @@ -492,7 +481,7 @@ public void getSchemaOfTopicFromSourceMetadataWithSchemasToBeDeleted() throws Ex kwClustersMap.put(1, utilMethods.getKwClusters()); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -537,7 +526,7 @@ public void getSchemasOfEnvironmentFromMetadataWithTopicDeletedAndSchemaStillAva kwClustersMap.put(1, utilMethods.getKwClusters()); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(3))).thenReturn("Team1"); @@ -589,7 +578,7 @@ public void getSchemasOfEnvironmentFromMetadataWithSchemaDeletedFromCluster() th clusterResp.setSchemaInfoOfTopicList(new ArrayList<>()); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(3))).thenReturn("Team1"); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); @@ -642,7 +631,7 @@ public void getSchemasOfEnvironmentFromMetadataExceptonContactingCluster() throw SchemasInfoOfClusterResponse clusterResp = new SchemasInfoOfClusterResponse(); clusterResp.setSchemaInfoOfTopicList(new ArrayList<>()); when(handleDbRequests.getEnvDetails(anyString(), anyInt())).thenReturn(env); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_SCHEMAS)) .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(manageDatabase.getClusters(any(), anyInt())).thenReturn(kwClustersMap); diff --git a/core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java b/core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java index 42d8b0167..8dec5c755 100644 --- a/core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/ServerConfigServiceTest.java @@ -38,12 +38,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.core.env.Environment; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -70,15 +66,15 @@ public class ServerConfigServiceTest { public void setUp() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); this.env = context.getEnvironment(); - loginMock(); serverConfigService = new ServerConfigService(env, commonUtilsService, mailService, managedb); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @Order(1) public void getAllPropsNotAuthorized() { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); serverConfigService.getAllProperties(); Collection collection = serverConfigService.getAllProps(); assertThat(collection).isEmpty(); // filtering for spring. and klaw. @@ -87,21 +83,13 @@ public void getAllPropsNotAuthorized() { @Test @Order(2) public void getAllProps() { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) .thenReturn(false); serverConfigService.getAllProperties(); Collection collection = serverConfigService.getAllProps(); assertThat(collection).isEmpty(); // filtering for spring. and klaw. } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - @Test @Order(3) public void givenValidTenantModelAllResources_returnSuccess() @@ -129,6 +117,9 @@ public void givenValidTenantModelAllResources_returnSuccess() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -167,6 +158,9 @@ public void givenValidTenantModelTopicsOnly_returnSuccess() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -212,6 +206,9 @@ public void givenKafkaTopicThatDoesNotExist_returnFailure() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -246,6 +243,9 @@ public void givenSchemaThatDoesNotExist_returnFailure() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -261,6 +261,9 @@ public void givenSchemaThatDoesNotExist_returnFailure() public void givenInvalidJson_returnFailure() throws KlawException { stubValidateTests(); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, "{}"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -289,6 +292,9 @@ public void givenValidTenantModelKafkaConnectOnly_returnSuccess() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); @@ -304,6 +310,8 @@ public void givenRequestForConfig_returnCorrectConfig() stubValidateTests(); when(managedb.getKwPropertiesMap(101)).thenReturn(buildFullDbObject()); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); // Execute List response = serverConfigService.getAllEditableProps(); @@ -350,6 +358,8 @@ public void givenRequestForConfigWithNoneSet_returnCorrectConfig() dbObject.put(KLAW_TENANT_CONFIG, map); when(managedb.getKwPropertiesMap(101)).thenReturn(dbObject); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); // Execute List response = serverConfigService.getAllEditableProps(); @@ -373,6 +383,9 @@ public void givenValidTenantModelTopicsInvalidEnvsClustersOnly_returnFailure() config.setTenantModel(prop); KwPropertiesModel request = createKwPropertiesModel(KLAW_TENANT_CONFIG, mapper.writeValueAsString(config)); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.UPDATE_SERVERCONFIG)) + .thenReturn(false); + // Execute ApiResponse response = serverConfigService.updateKwCustomProperty(request); diff --git a/core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java index 6e202b2dd..2144f335b 100644 --- a/core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/TopicControllerServiceTest.java @@ -61,13 +61,9 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -122,15 +118,8 @@ public void setUp() throws Exception { rolesPermissionsControllerService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -144,8 +133,6 @@ public void createTopicsSuccessAdvancedTopicConfigs() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -167,8 +154,6 @@ public void createTopicsSuccessDefaultValues() throws KlawException, KlawNotAuth when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -192,8 +177,6 @@ public void createTopicsFailureInvalidPartitions() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -213,8 +196,6 @@ public void createTopicsFailureInvalidClusterTenantIds() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvListsIncorrect1()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -236,8 +217,6 @@ public void createTopicsFailureInvalidTopicDescriptionLength() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvListsIncorrect1()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -262,8 +241,6 @@ public void createTopicsFailureInvalidTopicDescriptionLength() public void createTopicDeleteRequestFailureTopicAlreadyExists() { String topicName = "testtopic1"; String envId = "1"; - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(handleDbRequests.getTopicRequests(anyString(), anyString(), anyString(), anyInt())) .thenReturn(getListTopicRequests()); @@ -285,8 +262,6 @@ public void createTopicDeleteRequestFailureNotOwnerTeamOfTopic() { String topicName = "testtopic1"; String envId = "1"; stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(handleDbRequests.getTopicRequests(anyString(), anyString(), anyString(), anyInt())) .thenReturn(Collections.emptyList()); @@ -312,8 +287,6 @@ public void createTopicDeleteRequestFailureTopicWithSubscriptions() { String envId = "1"; stubUserInfo(); when(commonUtilsService.getTeamId(anyString())).thenReturn(1); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(handleDbRequests.getTopicRequests(anyString(), anyString(), anyString(), anyInt())) .thenReturn(Collections.emptyList()); @@ -339,8 +312,6 @@ public void createTopicDeleteRequestFailureTopicNotInCluster() { String envId = "2"; stubUserInfo(); when(userInfo.getTeamId()).thenReturn(1); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(handleDbRequests.getTopicRequests(anyString(), anyString(), anyString(), anyInt())) .thenReturn(Collections.emptyList()); @@ -366,8 +337,6 @@ public void createTopicDeleteRequestSuccessDefaultValues() { String envId = "1"; stubUserInfo(); when(commonUtilsService.getTeamId(anyString())).thenReturn(1); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); when(handleDbRequests.getTopicRequests(anyString(), anyString(), anyString(), anyInt())) .thenReturn(Collections.emptyList()); @@ -666,8 +635,6 @@ public void deleteTopicRequests() throws KlawException { when(handleDbRequests.deleteTopicRequest(anyInt(), anyString(), anyInt())) .thenReturn(ApiResultStatus.SUCCESS.value); when(mailService.getUserName(any())).thenReturn("uiuser1"); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); ApiResponse resultResp = topicControllerService.deleteTopicRequests("1001"); assertThat(resultResp.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); } @@ -681,6 +648,8 @@ public void approveTopicRequests() throws KlawException { ApiResponse apiResponse = ApiResponse.SUCCESS; stubUserInfo(); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(handleDbRequests.getTopicRequestsForTopic(anyInt(), anyInt())).thenReturn(topicRequest); when(handleDbRequests.updateTopicRequest(any(), anyString())) .thenReturn( @@ -718,6 +687,8 @@ public void approveTopicClaimRequests() throws KlawException { CRUDResponse.builder().resultStatus(ApiResultStatus.SUCCESS.value).build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(getTopic(topicName))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(clusterApiService.approveTopicRequests( anyString(), anyString(), @@ -756,6 +727,8 @@ public void approveTopicUpdateRequests() throws KlawException { CRUDResponse.builder().resultStatus(ApiResultStatus.SUCCESS.value).build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(getTopic(topicName))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(clusterApiService.approveTopicRequests( anyString(), anyString(), @@ -788,6 +761,8 @@ public void approveTopicRequestsFailureResponseFromCluster() throws KlawExceptio when(handleDbRequests.updateTopicRequest(any(), anyString())) .thenReturn( CRUDResponse.builder().resultStatus(ApiResultStatus.SUCCESS.value).build()); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(clusterApiService.approveTopicRequests( anyString(), anyString(), @@ -815,6 +790,8 @@ public void approveTopicRequestsFailureNotAllowed() throws KlawException { stubUserInfo(); when(handleDbRequests.getTopicRequestsForTopic(anyInt(), anyInt())).thenReturn(topicRequest); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); ApiResponse apiResponse1 = topicControllerService.approveTopicRequests("" + topicId); assertThat(apiResponse1.getMessage()) @@ -1050,7 +1027,7 @@ public void declineTopicRequests() throws KlawException { stubUserInfo(); when(handleDbRequests.getTopicRequestsForTopic(anyInt(), anyInt())).thenReturn(topicRequest); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) .thenReturn(false); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); @@ -1071,7 +1048,7 @@ public void declineTopicRequestsFailureRequestDoesNotExist() throws KlawExceptio stubUserInfo(); when(handleDbRequests.getTopicRequestsForTopic(anyInt(), anyInt())).thenReturn(topicRequest); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) .thenReturn(false); when(handleDbRequests.declineTopicRequest(any(), anyString())) .thenReturn(ApiResultStatus.SUCCESS.value); @@ -1136,8 +1113,6 @@ public void updateTopicsSuccessAdvancedTopicConfigs() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -1159,8 +1134,6 @@ public void updateTopicsSuccessDefaultValues() throws KlawException, KlawNotAuth when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -1184,8 +1157,6 @@ public void updateTopicsFailureInvalidPartitions() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -1205,8 +1176,6 @@ public void updateTopicsFailureInvalidClusterTenantIds() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvListsIncorrect1()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -1327,8 +1296,6 @@ public void getClaimRequests_WhereTopicIsDeleted() { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); List topicRequests = generateRequests(9); topicRequests.addAll(generateRequests(1, 7, RequestOperationType.CLAIM)); when(handleDbRequests.getAllTopicRequests( @@ -1375,8 +1342,6 @@ public void getClaimRequests_WhereTopicIsNotDeleted() { envListIds.add("DEV"); stubUserInfo(); when(commonUtilsService.getTenantId(any())).thenReturn(101); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); List topicRequests = generateRequests(9); topicRequests.addAll(generateRequests(1, 7, RequestOperationType.CLAIM)); when(handleDbRequests.getAllTopicRequests( @@ -1440,6 +1405,8 @@ public void approveTopicClaimRequests_withAssocSchema_success() throws KlawExcep .thenReturn(new ResponseEntity<>(apiResponse, HttpStatus.OK)); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(handleDbRequests.addToSynctopics(any())) .thenReturn( CRUDResponse.builder().resultStatus(ApiResultStatus.SUCCESS.value).build()); @@ -1472,6 +1439,8 @@ public void approveTopicClaimRequests_withAssocSchema_failure() throws KlawExcep CRUDResponse.builder().resultStatus(ApiResultStatus.SUCCESS.value).build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(getTopic(topicName))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) + .thenReturn(false); when(clusterApiService.approveTopicRequests( anyString(), anyString(), @@ -1512,8 +1481,6 @@ public void editTopicRequestFailureRequestNotOwned() when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(utilMethods.getEnvLists()); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -1773,10 +1740,9 @@ public void approvePromoteTopicRequests() throws KlawException { TopicRequest topicRequest = getTopicRequest(TOPIC_1); topicRequest.setRequestOperationType(RequestOperationType.CREATE.value); - when(commonUtilsService.isNotAuthorizedUser("userDetails", PermissionType.APPROVE_TOPICS)) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS)) .thenReturn(false); - when(commonUtilsService.isNotAuthorizedUser( - "userDetails", PermissionType.APPROVE_TOPICS_CREATE)) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.APPROVE_TOPICS_CREATE)) .thenReturn(true); when(handleDbRequests.getTopicRequestsForTopic(anyInt(), anyInt())).thenReturn(topicRequest); when(manageDatabase.getKwPropertyValue(KLAW_OPTIONAL_PERMISSION_NEW_TOPIC_CREATION_KEY, 0)) diff --git a/core/src/test/java/io/aiven/klaw/service/TopicSyncControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/TopicSyncControllerServiceTest.java index 916b51973..88b29b027 100644 --- a/core/src/test/java/io/aiven/klaw/service/TopicSyncControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/TopicSyncControllerServiceTest.java @@ -55,12 +55,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -124,7 +120,8 @@ public void setUp() throws Exception { topicSyncControllerService, "clusterApiService", clusterApiService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } private void environmentSetUp() { @@ -184,14 +181,6 @@ private void validatedEnvironmentSetUp(String repFactor, String maxPartitions) { when(commonUtilsService.getTenantId(anyString())).thenReturn(101); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - @Test @Order(1) public void updateSyncTopicsSuccess() throws KlawException { @@ -199,7 +188,7 @@ public void updateSyncTopicsSuccess() throws KlawException { when(manageDatabase.getTenantConfig()).thenReturn(tenantConfig); when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) .thenReturn(false); when(commonUtilsService.getEnvsFromUserId(anyString())) .thenReturn(new HashSet<>(Collections.singletonList("1"))); @@ -221,7 +210,7 @@ public void updateSyncTopicsNoUpdate() throws KlawException { when(manageDatabase.getTenantConfig()).thenReturn(tenantConfig); when(tenantConfig.get(anyInt())).thenReturn(tenantConfigModel); when(tenantConfigModel.getBaseSyncEnvironment()).thenReturn("1"); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) .thenReturn(false); when(manageDatabase.getTeamsAndAllowedEnvs(anyInt(), anyInt())) .thenReturn(Collections.singletonList("1")); @@ -262,6 +251,8 @@ public void getSyncTopics() throws Exception { when(kwClusters.getClusterName()).thenReturn("cluster"); when(kwClusters.getClusterId()).thenReturn(1); when(kwClusters.getKafkaFlavor()).thenReturn(""); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList topicRequests = topicSyncControllerService.getSyncTopics( @@ -297,6 +288,9 @@ public void approveTopicRequestAllTopicsWhereOneTopicIsAlreadyCreated() throws K .resultStatus(ApiResultStatus.SUCCESS.value) .entities(List.of(new Topic())) .build()); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_TOPICS)) + .thenReturn(false); + // execute ApiResponse retval = topicSyncControllerService.updateSyncBackTopics( @@ -347,6 +341,8 @@ public void approveTopicRequestAllTopicsCreateAll() throws KlawException { .build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(createTopic(1, TOPIC_NAME_1, env.getId()))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_TOPICS)) + .thenReturn(false); // execute ApiResponse retval = @@ -401,6 +397,8 @@ public void approveTopicRequestSelectedWhereOneTopicIsAlreadyCreated() throws Kl .build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(createTopic(1, TOPIC_NAME_1, env.getId()))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_TOPICS)) + .thenReturn(false); ApiResponse retval = topicSyncControllerService.updateSyncBackTopics( @@ -452,6 +450,8 @@ public void approveTopicRequestSelectedCreateAll() throws KlawException { .build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(createTopic(1, TOPIC_NAME_1, env.getId()))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_TOPICS)) + .thenReturn(false); ApiResponse retval = topicSyncControllerService.updateSyncBackTopics( @@ -505,6 +505,8 @@ public void approveTopicRequestSelectedUnexpectedExceptionFromClusterApi() throw .build()); when(commonUtilsService.getTopicsForTopicName(anyString(), anyInt())) .thenReturn(List.of(createTopic(1, TOPIC_NAME_1, env.getId()))); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_BACK_TOPICS)) + .thenReturn(false); ApiResponse retval = topicSyncControllerService.updateSyncBackTopics( @@ -551,6 +553,8 @@ public void getSyncList_noValidationSet_base() throws Exception { // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -587,6 +591,8 @@ public void getReconSyncList_noValidationSet_base() throws Exception { // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getReconTopics( @@ -619,6 +625,8 @@ public void getSyncList_noValidationSet_TwoNotSynchronized() throws Exception { // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -656,6 +664,8 @@ public void getReconSyncList_noValidationSet_FiveNotSynched() throws Exception { // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getReconTopics( @@ -692,6 +702,8 @@ public void getSyncList_noValidationSet_ThreeDeletedFromCluster_allTopics() thro // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -729,6 +741,8 @@ public void getReconSyncList_noValidationSet_FourDeletedFromCluster() throws Exc // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getReconTopics( @@ -765,6 +779,8 @@ public void getSyncList_noValidationSet_ThreeDeletedFromCluster() throws Excepti // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -833,6 +849,8 @@ public void getSyncList_ValidationOn( // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); Integer tenantId = 101; SyncTopicsList syncTopics = @@ -911,6 +929,8 @@ public void getReconSyncList_ValidationOn( // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getReconTopics( @@ -988,6 +1008,8 @@ public void getSyncList_ValidationOn_AllTopics( // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -1067,6 +1089,8 @@ public void getSyncList_FailedValidationOn_ReplicationAndPartitions( // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -1116,6 +1140,8 @@ public void getSyncList_FailedValidationOn_ReplicationAndPartitionsAreNull() thr // from the DB when(handleDbRequests.getSyncTopics(eq("1"), eq(null), eq(101))).thenReturn(topics); when(manageDatabase.getTeamNameFromTeamId(eq(101), eq(10))).thenReturn("Team1"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.SYNC_TOPICS)) + .thenReturn(false); SyncTopicsList syncTopics = topicSyncControllerService.getSyncTopics( @@ -1202,7 +1228,7 @@ private List getAvailableTeams() { private void stubUserInfo() { when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(userInfo.getTeamId()).thenReturn(101); - when(mailService.getUserName(any())).thenReturn(USERNAME); + when(mailService.getUserName(userDetails)).thenReturn(USERNAME); when(commonUtilsService.getTenantId(eq(USERNAME))).thenReturn(TENANT_ID); when(handleDbRequests.getAllTeams(eq(101))).thenReturn(getAvailableTeams()); /// added diff --git a/core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java index e164161d5..325d2d2bc 100644 --- a/core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/UiConfigControllerServiceTest.java @@ -25,10 +25,6 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -81,15 +77,7 @@ public void setUp() throws Exception { ReflectionTestUtils.setField( envsClustersTenantsControllerService, "commonUtilsService", commonUtilsService); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); - } - - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -99,7 +87,7 @@ public void getEnvs1() { stubUserInfo(); when(commonUtilsService.getEnvProperty(anyInt(), anyString())).thenReturn("1"); when(manageDatabase.getKafkaEnvList(anyInt())).thenReturn(getAllEnvs()); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(manageDatabase.getTenantMap()).thenReturn(tenantMap); when(tenantMap.get(anyInt())).thenReturn("1"); @@ -117,7 +105,7 @@ public void getEnvs1() { @Order(4) public void getSchemaRegEnvs() { stubUserInfo(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_ENVS)) .thenReturn(false); when(handleDbRequests.getAllSchemaRegEnvs(1)).thenReturn(getAllSchemaEnvs()); diff --git a/core/src/test/java/io/aiven/klaw/service/UsersTeamsControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/UsersTeamsControllerServiceTest.java index 487a20e96..1b2705310 100644 --- a/core/src/test/java/io/aiven/klaw/service/UsersTeamsControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/UsersTeamsControllerServiceTest.java @@ -75,11 +75,7 @@ import org.junit.platform.commons.util.StringUtils; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.provisioning.InMemoryUserDetailsManager; @@ -138,7 +134,8 @@ public void setUp() { usersTeamsControllerService, "encryptorSecretKey", ENCRYPTOR_SECRET_KEY); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); userInfo = utilMethods.getUserInfoMockDao(); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -178,19 +175,19 @@ public void updateProfileFailureDbUpdate() { @Test public void updateUserNotAuthorized() throws KlawException { UserInfoModel userInfoModel = utilMethods.getUserInfoMock(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); ApiResponse apiResponse = usersTeamsControllerService.updateUser(userInfoModel); assertThat(apiResponse.getMessage()).isEqualTo(ApiResultStatus.NOT_AUTHORIZED.value); } @Test public void updateUserNotAuthorizedToUpdateSuperAdmin() throws KlawException { + final String userName = "testUser"; UserInfoModel userInfoModel = utilMethods.getUserInfoMock(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userName, PermissionType.ADD_EDIT_DELETE_USERS)) .thenReturn(false); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(101); - when(mailService.getUserName(any())).thenReturn("testuser"); + when(mailService.getUserName(userDetails)).thenReturn(userName); when(manageDatabase.getRolesPermissionsPerTenant(anyInt())) .thenReturn(utilMethods.getRolesPermsMapForSuperuser()); ApiResponse apiResponse = usersTeamsControllerService.updateUser(userInfoModel); @@ -643,11 +640,12 @@ public void deleteTeamFailureDbException() { @Test public void deleteUserFailureHasRequests() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + String userName = "testuser"; + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) .thenReturn(false); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); - when(mailService.getUserName(any())).thenReturn("testuser"); + when(mailService.getUserName(userDetails)).thenReturn(userName); when(manageDatabase.getRolesPermissionsPerTenant(anyInt())).thenReturn(new HashMap<>()); when(handleDbRequests.existsComponentsCountForUser("testuser", TEST_TENANT_ID)) .thenReturn(true); @@ -659,7 +657,10 @@ public void deleteUserFailureHasRequests() throws KlawException { @Test public void deleteUserFailureisAdmin() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); + when(commonUtilsService.isNotAuthorizedUser( + userDetails, PermissionType.FULL_ACCESS_USERS_TEAMS_ROLES)) .thenReturn(false); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); @@ -673,7 +674,7 @@ public void deleteUserFailureisAdmin() throws KlawException { @Test public void deleteUserSuccessNormalUser() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) .thenReturn(false); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); @@ -687,8 +688,8 @@ public void deleteUserSuccessNormalUser() throws KlawException { @Test public void deleteUserFailureNoSuperUserPermission() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))) - .thenReturn(false, true); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); when(mailService.getUserName(any())).thenReturn("testuser"); @@ -700,7 +701,6 @@ public void deleteUserFailureNoSuperUserPermission() throws KlawException { @Test public void deleteUserFailureNoDeletionPermission() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); when(mailService.getUserName(any())).thenReturn("testuser"); @@ -805,8 +805,6 @@ public void addNewTeamFailureWithExistingTeamName() throws KlawException { public void addNewTeamFailureWithUnAuthorizedUser() throws KlawException { TeamModel teamModel = utilMethods.getTeamModelMock(); - when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); - ApiResponse apiResponse = usersTeamsControllerService.addNewTeam(teamModel, true); assertThat(apiResponse).isSameAs(ApiResponse.NOT_AUTHORIZED); } @@ -832,8 +830,6 @@ public void updateTeamSuccessWhenNoEnvList() throws KlawException { @Test public void updateTeamWhenUnAuthorizedUser() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_TEAMS)) - .thenReturn(true); TeamModel teamModel = utilMethods.getTeamModelMock(); ApiResponse apiResponse = usersTeamsControllerService.updateTeam(teamModel); @@ -1366,6 +1362,8 @@ public void getNewUserRequestsSuccess(int count) throws KlawNotAuthorizedExcepti when(mailService.getUserName(userDetails)).thenReturn(TEST_AUTHENTICATED_USER_UNAME); when(commonUtilsService.getTenantId(TEST_AUTHENTICATED_USER_UNAME)) .thenReturn(authenticatedUserTenantId); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); when(handleDbRequests.getAllRegisterUsersInformation()).thenReturn(regUserList); when(manageDatabase.getTenantMap()).thenReturn(tenantMapMock); @@ -1397,6 +1395,8 @@ public static Stream getNewUserRequestsSuccess() { @Test public void getNewUserRequestsWithNoRequestsInDBNullPointerException() { + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); when(mailService.getUserName(userDetails)).thenReturn(TEST_AUTHENTICATED_USER_UNAME); when(commonUtilsService.getTenantId(TEST_AUTHENTICATED_USER_UNAME)).thenReturn(TEST_TENANT_ID); when(handleDbRequests.getAllRegisterUsersInformation()).thenReturn(null); @@ -1410,9 +1410,6 @@ public void getNewUserRequestsWithNoRequestsInDBNullPointerException() { @Test public void getNewUserRequestsWithUnAuthorizedUser() { - when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) - .thenReturn(true); - assertThatExceptionOfType(KlawNotAuthorizedException.class) .isThrownBy(() -> usersTeamsControllerService.getNewUserRequests()) .withMessage("You are not authorized to view this information."); @@ -1513,9 +1510,6 @@ public void approveNewUserRequestsFailureWithLDAPAuth() { @Test public void approveNewUserRequestsFailureWithUnAuthorizedUser() throws KlawException { - when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) - .thenReturn(true); - ApiResponse response = usersTeamsControllerService.approveNewUserRequests( testNewRegUser.getUsername(), true, Integer.MIN_VALUE, null); @@ -1641,8 +1635,6 @@ public void declineNewUserRequestsDBFailure() { @Test public void declineNewUserRequestsAuthenticationFailure() throws KlawException { when(mailService.getUserName(userDetails)).thenReturn(TEST_AUTHENTICATED_USER_UNAME); - when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) - .thenReturn(true); ApiResponse response = usersTeamsControllerService.declineNewUserRequests(TEST_NEW_USER_UNAME); @@ -1682,14 +1674,6 @@ public void getRegistrationInfoFromIdNoRegistrationInfo() { assertThat(response).isNull(); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - public UserDetails userDetails(String username, String password) { return new UserDetails() { @@ -1824,6 +1808,8 @@ private void addTwoDefaultTeamsVerifyCapturedTeams( private void addNewTeamSetupTest(String userName, String existingTeamName) { when(mailService.getUserName(any())).thenReturn(userName); when(commonUtilsService.getTenantId(anyString())).thenReturn(TEST_TENANT_ID); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_TEAMS)) + .thenReturn(false); when(manageDatabase.getTeamNamesForTenant(TEST_TENANT_ID)) .thenReturn(List.of(existingTeamName)); } diff --git a/core/src/test/java/io/aiven/klaw/service/UtilControllerServiceTest.java b/core/src/test/java/io/aiven/klaw/service/UtilControllerServiceTest.java index 343959ba1..06bd0c7f3 100644 --- a/core/src/test/java/io/aiven/klaw/service/UtilControllerServiceTest.java +++ b/core/src/test/java/io/aiven/klaw/service/UtilControllerServiceTest.java @@ -11,6 +11,7 @@ import io.aiven.klaw.helpers.db.rdbms.HandleDbRequestsJdbc; import io.aiven.klaw.model.ApiResponse; import io.aiven.klaw.model.enums.ApiResultStatus; +import io.aiven.klaw.model.enums.PermissionType; import io.aiven.klaw.model.requests.ResetEntityCache; import java.util.Collection; import org.junit.jupiter.api.BeforeEach; @@ -19,11 +20,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; @@ -49,7 +46,8 @@ void setUp() { ReflectionTestUtils.setField(utilControllerService, "mailService", mailService); userInfo = utilMethods.getUserInfoMockDao(); when(manageDatabase.getHandleDbRequests()).thenReturn(handleDbRequests); - loginMock(); + when(commonUtilsService.getPrincipal()).thenReturn(userDetails); + when(commonUtilsService.isNotAuthorizedUser(any(), any(PermissionType.class))).thenReturn(true); } @Test @@ -57,6 +55,8 @@ public void resetCache() { ResetEntityCache resetEntityCache = utilMethods.getResetEntityCache(); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(mailService.getUserName(any())).thenReturn("anonymousUser"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); ApiResponse apiResponse = utilControllerService.resetCache(resetEntityCache); assertThat(apiResponse.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); } @@ -66,18 +66,12 @@ public void resetCacheNotAuthorized() { ResetEntityCache resetEntityCache = utilMethods.getResetEntityCache(); when(handleDbRequests.getUsersInfo(anyString())).thenReturn(userInfo); when(mailService.getUserName(any())).thenReturn("testuser"); + when(commonUtilsService.isNotAuthorizedUser(userDetails, PermissionType.ADD_EDIT_DELETE_USERS)) + .thenReturn(false); ApiResponse apiResponse = utilControllerService.resetCache(resetEntityCache); assertThat(apiResponse.getMessage()).isEqualTo(ApiResultStatus.SUCCESS.value); } - private void loginMock() { - Authentication authentication = Mockito.mock(Authentication.class); - SecurityContext securityContext = Mockito.mock(SecurityContext.class); - when(securityContext.getAuthentication()).thenReturn(authentication); - when(authentication.getPrincipal()).thenReturn(userDetails); - SecurityContextHolder.setContext(securityContext); - } - public UserDetails userDetails(String username, String password) { return new UserDetails() { diff --git a/pom.xml b/pom.xml index 7989ca796..fba83ac13 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ 3.26.3 3.1.0 1.17.0 - 33.3.0-jre + 33.3.1-jre 5.3.1 0.8.12 0.12.6