Compare commits

...
615 Commits
Author SHA1 Message Date
alexandDaria Marutkina 2f120d6a4f Cb 5819 administration tables redesign (#3033)
* CB-5819 add user panel

* CB-5819 redesign teams

* CB-5819 remove extra styles

* CB-5819 review fixes

* CB-5819 revert group title

* CB-5819 remove code duplication

* CB-5819 fix import

* CB-5819 move user table loader

* CB-5819 keep loader mounted

* CB-5819 truncate titles

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-29 20:43:36 +01:00
Ainur d3be30f55b CB-5623 fix npe (#3030) 2024-10-29 16:12:10 +00:00
alexandDaria Marutkina 2c7df05c45 CB-3446 add d3 imports (#3025)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-29 10:05:46 +03:00
Ainur 11167d5802 CB-5683 change password for disabled user fix (#3032) 2024-10-28 15:24:38 +00:00
sergeyteleshevandDaria Marutkina 4cfb27b33b CB-5645 [EE\AWS] Change the instruction in the Version update tab (#3017)
* CB-5645 adds core-links and GithubLinks

* CB-5645 adds BaseUpdate instruction to EE, TE, AWS

* CB-5645 pr fixes

* CB-5645 REVERT IT (need for tests)

* Revert "CB-5645 REVERT IT (need for tests)"

This reverts commit 6c53b907c7.

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-25 13:17:30 +03:00
sergeyteleshevandEvgenia 0126b204c0 CB-5566 fixes checkboxes for tables (#3026)
Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-24 18:34:41 +03:00
alexandDaria Marutkina 6dbcfe408e CB-5745 explicitly set word break on field description (#3027)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-24 14:31:02 +02:00
Serge Rider de2d9f029f CB-5732 Navigator filters fix for optional nodes (#3024) 2024-10-24 12:33:34 +02:00
Elizabeth 2f895f6dab dbeaver/pro#3419 Don't load additional info on typing with auto activation of completion (#3022) 2024-10-24 12:10:08 +02:00
sergeyteleshevandDaria Marutkina c7af629d8a CB-5712 adds loaders for administration menu items (#3011)
* CB-5712 adds loaders for administration menu items

* CB-5712 pr fixes

* CB-5712 pr fix for preloading serverConfigResource in constructor

* CB-5712 removes preload from AuthProviderResource

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-24 11:04:23 +03:00
sergeyteleshevandmr-anton-t 1782ce45a7 CB-5793 removes extra space for table cells (#3013)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-24 11:04:00 +03:00
51e0218682 CB-5575 pass column key along with row (#3004)
* CB-5575 pass column key along with row

* CB-5575 change arg

---------

Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-24 11:03:30 +03:00
Ainur e08353f13f CB-5792 add header for static content (#3018) 2024-10-23 15:46:26 +00:00
AinurandDenisSinelnikov 383952c60e CB-5838 check all row identifiers fix (#3014)
Co-authored-by: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com>
2024-10-23 15:45:13 +00:00
alexandDaria Marutkina 5282175b7c CB-5701 allow to choose provider by keyboard (#3008)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-22 13:21:49 +03:00
alexandDaria Marutkina b4db34ea48 CB-5706 do not increase height (#3002)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-21 13:25:10 +03:00
Evgenia 9672e5b3b4 Merge pull request #3015 from dbeaver/EvgeniaBzzz-patch-1
Update README.md - CB RN 24.2.3
2024-10-21 12:27:20 +03:00
Evgenia 48a7a4f806 Update README.md - RN 24.3.2 2024-10-21 12:16:04 +03:00
Anastasiya cbceee6ec3 dbeaver/tech-docs#654 update gql comments, remove outdated info (#3012) 2024-10-18 18:38:56 +02:00
sergeyteleshev ffe0a18828 Cb 5757 unit tests for core utils and core blocks (#2961)
* CB-5757 adds unit tests for getDomainFromUrl helper

* CB-5757 adds unit tests for getTextFileReadingProcess helper

* CB-5757 adds unit tests for TextTools helper

* CB-5757 adds unit tests for downloadFromURL helper

* CB-5757 adds unit tests for Deferred and PromiseExecutor

* CB-5757 adds unit tests for core-blocks hooks

* CB-5757 fixes the tests
2024-10-18 08:34:19 +03:00
alex 115cfb3bde Cb 5753 u tests (#2964)
* CB-5753 add localization service test, fix grammar

* CB-5753 add test for the getDomainFromUrl

* CB-5753 add test for the client activity service

* CB-5753 add NodeManagerUtils tests

* CB-5753 add more cases

* CB-5753 pass args correctly
2024-10-18 08:33:39 +03:00
Serge Rider e62538b583 Merge remote-tracking branch 'origin/devel' into devel 2024-10-18 04:49:04 +02:00
sergeyteleshev 5255e9949d CB-5820 fixes frontend build script (#3006)
* CB-5820 fixes frontend build script

* CB-5820 fixes test for windows

* CB-5820 cleanup

* CB-5820 reverts back tests for package
2024-10-17 18:56:24 +03:00
Alexey 8e4faa5935 dbeaver/dbeaver-vscode#42 disable artifacts (#3007) 2024-10-17 14:52:18 +02:00
serge-rider 39ad2994b2 Manifests fix 2024-10-17 10:17:55 +02:00
Serge Rider 00788615e1 Merge remote-tracking branch 'origin/devel' into devel 2024-10-17 07:07:34 +02:00
ac937698bd dbeaver/pro#3393 Add "UDBT" feature (#3000)
Co-authored-by: Serge Rider <serge@jkiss.org>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-10-16 10:33:25 +02:00
Alexey be88091950 dbeaver/dbeaver-devops#1525 update ci workflows (#2998)
* dbeaver/dbeaver-devops#1525 update ci workflows

* dbeaver/dbeaver-devops#1525 fix frontend lint

* dbeaver/dbeaver-devops#1525 move checkstyle config from dbeaver repo

* dbeaver/dbeaver-devops#1525 use own maven setup action

* dbeaver/dbeaver-devops#1525 reuse workflows

* dbeaver/dbeaver-devops#1525 fix concurrency

* dbeaver/dbeaver-devops#1525 fix concurrency
2024-10-16 10:28:44 +02:00
Serge Rider 9dcaec0c09 Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-10-16 07:01:46 +02:00
f677f48890 CB-5710 return anonymous user info (#2972)
* CB-5710 return anonymous user info

* CB-5710 support anonymous user

* CB-5710 anonymous access disabled active user fix

* CB-5710 simplify logic

* CB-5710 fix error messages

* CB-5710 review fixes

* CB-5710 add computed

* CB-5710 change getters to methods

* CB-5710 fixes after review

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: alex <48489896+devnaumov@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Serge Rider <serge@jkiss.org>
2024-10-16 07:01:37 +02:00
Serge Rider a44cadbb8a Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-10-16 06:46:59 +02:00
5c992dc8ee CB-5811 applies new design styles for selects, textareas with disabled or readonly prop (#2999)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-16 06:46:55 +02:00
Serge Rider 05f85db7e6 dbeaver/pro#3468 24.2.4 version bump 2024-10-15 20:37:32 +02:00
DenisSinelnikov 94ea41c2c9 CB-5234. Refactor after review, move logic for PRO products (#2990) 2024-10-15 10:00:58 +00:00
Ainur d49342ce48 CB-5713 fix action links (#2991) 2024-10-15 09:25:47 +00:00
Alexander Skoblikov 21fe547dcd CB-5424 QM cleanup job (#2987) 2024-10-15 09:25:12 +00:00
67c54d29eb CB-5205 fix: connection view switching (#2984)
* CB-5205 fix: connection view switching

* CB-5205 fix: tabs synchronization

* CB-5205 fix: connection sync

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-15 11:57:53 +03:00
alexandEvgenia 7427543b7f CB-5760 add title to driver manager form (#2995)
* CB-5760 add title to driver manager form

* CB-5760 move hotkeys hook to core-blocks

---------

Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-14 20:32:37 +03:00
sergeyteleshevandmr-anton-t 439c806020 CB-5810 fixes cell edit styles (#2996)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-14 16:51:16 +03:00
a4bb23b21e CB-5749 fix: metadata table loading (#2960)
* CB-5749 fix: metadata table loading

* CB-5749 fix: offset pagination range expand function

* CB-5205 fix: connection view switching

* Revert "CB-5205 fix: connection view switching"

This reverts commit e06c039fdd.

* CB-5749 fix: prevent page offset overflow

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-14 12:46:52 +03:00
sergeyteleshev fd711b055c CB-5806 The AWS switch does not work in the settings (#2994) 2024-10-12 00:23:22 +08:00
Ainur c6626f4364 CB-5802 fix build (#2993) 2024-10-11 11:58:42 +00:00
Ainur d44c9f3863 CB-5671 update db2-i driver (#2986) 2024-10-11 10:52:06 +00:00
Ainur ea055fde49 CB-5693 update protobuf version (#2958) 2024-10-11 10:49:59 +00:00
Alexey 3d8dc7d3d2 CB-5578 dm ability to remove custom certificate (#2975) 2024-10-11 09:35:49 +00:00
sergeyteleshevandmr-anton-t eb41e6156a Cb 5728 update frontend dependencies (#2970)
* CB-5728 updates dependencies without react-data-grid

* CB-5728 updates react-data-grid library

* CB-5728 updates dependencies after react-data-grid updation

* CB-5728 fixes align in cells for react-data-grid

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-11 11:54:13 +03:00
c7fa466509 CB-5707 Change font size in dialogs (#2973)
* CB-5707 increases text size to confirmation dialog title

* CB-5707 fixes headerTitle with composes styles

* CB-5707 fixes dialogBodyContent with composes styles

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-11 11:52:55 +03:00
Serge Rider f475c71311 Dbeaver/pro#3420 Use long for serialization of configs 2024-10-11 06:20:32 +02:00
Serge Rider 6220df4845 dbeaver/pro#3420 Gson refactoring (#2965) 2024-10-11 06:04:55 +02:00
sergeyteleshevandkseniaguzeeva 2e5b71e9dd CB-5563 [TE] Change credentials - 'save credentials' is not marked for auth even if it is saved (#2981)
* CB-5563 adds saveCredentials to config when loading DriverInfo during driver authorization

* CB-5640 fixes save creds checkbox state for SSL

* Revert "CB-5640 fixes save creds checkbox state for SSL"

This reverts commit e25fc3b5d4.

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-10-10 18:38:54 +03:00
sergeyteleshevandEvgenia 1a5192815c CB-5640-update-fileds-ui-for-dark-and-light-themes (#2985)
* CB-5640 adds colors to inputs according to design (disabled, readonly)

* CB-5640 merges disable logic into readonly

* CB-5640 adds aria-disabled prop and styles to input

* CB-5640 adds more styles for input

* CB-5640 pr fixes

* CB-5640 reverts logic

* CB-5640 fixes styles

* CB-5640 fixes styles

* CB-5640 merges disable logic into readonly for all of the inputs all over the app

* CB-5640 reverts form-controls styles

* CB-5640 reverts form-controls styles

* CB-5640 makes disabled design according to the figma

* CB-5640 makes checkbox dissapear

* CB-5640 cleanup

---------

Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-10 17:20:51 +03:00
Anastasiya 3a85f1a4be Update SECURITY.md (#2989)
Add current version
2024-10-10 14:04:33 +02:00
alexandEvgenia Bezborodova 2e5b092ce7 CB-5454 add deprecated message (#2976)
* CB-5454 add deprecated message

* CB-5454 add info icon to connection dialog message

* CB-5454 remove add button

* CB-5454 remove template

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-10 13:46:18 +03:00
DenisSinelnikovandDaria Marutkina 5c92d43c96 CB-5773. Fixed bad performance for databases/table e.t.c if too many tables included (#2977)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-10 10:29:57 +02:00
Alexander Skoblikovandkseniaguzeeva 8b54e3177e CB-5717 npe fix (#2968)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-10-09 10:18:48 +00:00
sergeyteleshevandEvgenia Bezborodova a4c36247fa CB-5767 Easy-config - server configuration fields respond to Enter key press (#2980)
* CB-5767 makes config wizzard go next item when confirming serverConfig form

* CB-5767 removes extra handleEnter for button click enter

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-09 13:08:42 +03:00
AinurandEvgenia Bezborodova 2698e713a7 CB-5653 accessible connections events fix (#2971)
---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-09 10:07:39 +00:00
alex a48097ec25 CB-5746 clean -> clear (#2978) 2024-10-08 18:51:15 +03:00
Alexander Skoblikovandmr-anton-t 8c30761caa dbeaver/dbeaver-vscode#19 map custom folder as project in vc code product (#2963)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-10-08 12:22:13 +02:00
Serge Rider 9103b28e72 dbeaver/dbeaver-vscode#36 API server build (#2967)
* dbeaver/dbeaver-vscode#36 API server build

* dbeaver/dbeaver-vscode#36 API server build
2024-10-08 12:21:22 +02:00
Alexey e45f077bfa Revert "CB-5578 DM: Ability to remove custom certificate (#2899)" (#2974)
This reverts commit fb1b2b21ed.
2024-10-08 13:11:22 +03:00
fb1b2b21ed CB-5578 DM: Ability to remove custom certificate (#2899)
* CB-5578 handles url for redirect after custom domain is being deleted

* CB-5578 reverts isValidUrl

* CB-5578 pr fixes

* CB-5578 fixes for QA

* CB-5578 fixes for redirect on server url in custom certificate deletion

* CB-5578 fix import

* CB-5578 creates isValidServer file

* CB-5578 allow any protocol server url but redirect on https only

* CB-5578 fix error message in details popup

* СB-removes unneeded tranlsation

* CB-5578 pr fixes

* CB-5578 dm fix for deletion of custom certificate

* CB-5578 fix get https url helper

* CB-5578 cleanup

* CB-5578 adds status message for custom certificate deletion

* CB-5578 sends server url without protocol while custom certificate deletion

* CB-5578 pr fixes

* CB-5578 adds loader to the deletion of custom certificate

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-08 13:05:34 +03:00
2a1adc1374 CB-5052 [2562 FR] Highlight the row where any field is currently selected (#2952)
* CB-5052-2562 adds background for selected row

* CB-5052-2562 fixes background for selected row

* CB-5052-2562 moves style var

* CB-5052 pr fixes

* CB-5052 fixes color for selection

* CB-5052 fixes color for selection 2

* CB-5052 adds themes and fixes actions styles for focused cursor in table

* CB-5052 reverts theme for data grid. plus replaces selected row style

* CB-5052 cleanup

* CB-5052 cleanup

* CB-5052 makes selected tab blue

* CB-5052 reverts refresh button colors

* CB-5052 fixes unneeded border left

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-08 12:56:40 +03:00
alexandDaria Marutkina c46e9343ac CB-5746 rename buttons (#2959)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-08 11:44:39 +02:00
Alexander Skoblikov 16cd103585 CB-5615 dynamic cookie lifetime (#2956)
* CB-5615 dynamic cookie lifetime
2024-10-07 16:20:48 +00:00
Alexander Skoblikov 0850b2d94f CB-5390 use remote file system for storage (#2945)
* CB-5390 wip

* CB-5390 wip

* CB-5390 review fixes

* CB-5390 fix conflicts
2024-10-07 18:15:45 +02:00
Daria Marutkina 2c2a1dfed6 Merge pull request #2966 from dbeaver/dariamarutkina-patch-2
CB_2422 chore: update README
2024-10-07 10:59:48 +02:00
Daria Marutkina 37abea3f44 CB_2422 chore: update README 2024-10-07 10:56:48 +02:00
serge-rider 0e32052b24 dbeaver/pro#3398 Version 24.2.3 bump 2024-10-01 19:17:52 +02:00
AinurandEvgenia Bezborodova e1887714ab CB-5737 global project path fix (#2955)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-10-01 16:52:43 +00:00
serge-rider f5ac3cfe2a dbeaver/pro#1441 Redundant parameter remove 2024-10-01 17:48:24 +02:00
434a988919 dbeaver/pro#1441 Universal Database Tunnel POC (#2941)
* dbeaver/pro#1441 Universal Database Tunnel POC

* dbeaver/pro#1441 Resolve data source on the server side

* dbeaver/pro#1441 Use service binding for registering web sockets

* dbeaver/pro#1441 Fix compile

* dbeaver/pro#1441 Construct WebSocket endpoint from service endpoint

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: serge-rider <serge@dbeaver.com>
2024-10-01 17:42:28 +02:00
AinurandDaria Marutkina 3fbc227734 CB-5559 include root uri in redirect urls (#2950)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-10-01 12:53:12 +00:00
AlexeyandEvgenia Bezborodova bb9a62da63 CB-5295 set enable flag on create user (#2940)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-30 22:45:30 +03:00
Alexander Skoblikov 34c6e6c9be fix vs-code compilation (#2953) 2024-09-30 16:58:39 +00:00
Alexander Skoblikov b35e3f83ed fix test (#2951) 2024-09-30 15:42:16 +00:00
a42c7dc8de CB-5589. Remove script and sqllite database config (#2919)
* CB-5589. Remove script and sqllite database config

* CB-5589. Remove script and sqllite database config

* CB-5589 remove sample database

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-30 15:16:48 +00:00
eb33e0e895 CB-5570 do not load data sources in web session init (#2887)
* CB-5570 do not load data sources in web session init

* CB-5570 extract methods about web connection info from web session

* CB-5570 remove accessible connections from web session

* CB-5570 add javadoc

* CB-5570 Merge conflicts resolve

* CB-5570 return emply list for template connections in te

* chore: reorganize localization for connections

---------

Co-authored-by: serge-rider <serge@dbeaver.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-30 15:15:35 +00:00
alexandDaria Marutkina c3c15bf7cc CB-5719 always treat form as changed in easy config (#2946)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-30 16:33:11 +03:00
serge-rider 6604b0887c dbeaver/dbeaver-vscode#16 Platform shutdown fix 2024-09-30 14:54:36 +02:00
Alexander Skoblikovandmr-anton-t 735024b57b dbeaver/dbeaver-vscode#16 fix SQL processor, server port cli arg (#2933)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-30 14:23:01 +02:00
AnastasiyaandEvgenia Bezborodova 3118eac266 CB-5644 change automatically created provider description (#2937)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-30 10:32:08 +02:00
alexandEvgenia Bezborodova 38445f3843 CB-5636 fix resource lag (#2942)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-30 11:14:18 +03:00
sergeyteleshev 01d08fc3ce CB-5709 user create button in settings preloads required reso… (#2936)
* CB-5709 hotfix: user create button in settings preloads required resources

* CB-5709 inverts logic

* CB-5709 fixes tab for TE

* CB-5709 fix for origin info form
2024-09-30 11:13:06 +03:00
sergeyteleshevandEvgenia Bezborodova 9bc6bd022e CB-5625 Show only enabled identity providers in configuration section (#2927)
* CB-5625 makes create auth providers list include only enabled auth providers in checkbox

* Revert "CB-5625 makes create auth providers list include only enabled auth providers in checkbox"

This reverts commit 4b2ac9935f.

* CB-5625 adds disabled providers logic to identity providers

* CB-5625 refactors form loaded task

* CB-5625 adds link for redirect to the server configuration settings

* СB-5625 cleanup

* CB-5625 moves message to the top of the auth providers page

* CB-5625 pr fixes

* CB-5625 cleanup

* CB-5578 pr fixes

* CB-5625 adds tip for create identity provider table

* CB-5625 reverts tip message

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-27 13:21:11 +03:00
AlexeyandEvgenia Bezborodova cf764f5807 CB-4192 fix: users loading (#2939)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-27 12:04:39 +03:00
AlexeyandEvgenia Bezborodova 0bf6783d00 CB-5446 chore: keyboard navigation improvements (#2935)
* chore: keyboard navigation improvements

* CB-5446 chore: use theme color for outline

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-26 19:46:23 +03:00
0e3da49b23 CB-5652 hide data source properties if user does not have edit permis… (#2932)
* CB-5652 hide data source properties if user does not have edit permissions

* CB-5652 return only name property for data source

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-09-26 16:14:02 +00:00
serge-rider f84bd6040f Merge remote-tracking branch 'origin/devel' into devel 2024-09-26 12:42:46 +02:00
serge-rider 6339bee0dc Remove legacy code 2024-09-26 12:40:21 +02:00
8f54e759dd CB-4541 feat: tree filter (#2908)
* CB-4541 feat: tree filter

* CB-4541 feat: tree empty placeholders

* CB-4541 fix: settings overflow scroll effect

* CB-4541 fix: settings groups size

* CB-4541 fix: sync groups when filtering

* CB-4541 chore: performance optimization

* chore: review fixes

* chore: replace inline styles

* chore: replace inline styles

* chore: hide extra settings from UI

* chore: hide groups view from settings

* fix: add override options to devtools

* fix: trim filter in settings search

* chore: localization

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-25 19:46:13 +03:00
Alexey 5f53e0ffa2 fix: windows wildcard path (#2931) 2024-09-25 16:37:30 +03:00
fe020f8f7d CB-4652 migrate server configuration form (#2916)
* CB-4652 migrate server configuration form

* CB-4652 review fixes

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-25 11:46:21 +03:00
Serge Riderandkseniaguzeeva 4b9e1c8b94 dbeaver/pro#3345 vfs refactoring (#2928)
* dbeaver/pro#3345 Navigator model refactoring

* dbeaver/pro#3345 Navigator model refactoring

* dbeaver/pro#3345 Get rid of org.eclipse.core.resources

* dbeaver/pro#3345 SQL dialect model refactoring

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-09-24 16:37:09 +02:00
alexandEvgenia Bezborodova dc5592d052 CB-5162 fix filter at the top (#2925)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-24 11:46:20 +03:00
sergeyteleshevandmr-anton-t 1746d91072 CB-4661 remove includes concept from resources api (#2910)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-23 18:22:05 +03:00
Evgenia Bezborodova d230275768 Merge pull request #2930 from dbeaver/EvgeniaBzzz-patch-1
Update README_24-2-1.md
2024-09-23 12:47:44 +03:00
Evgenia Bezborodova 3b3bb147b7 Update README_24-2-1.md 2024-09-23 12:41:39 +03:00
Alexey 6ad148850d refactor: migrate to pure esm CB-5684 (#2929)
* refactor: migrate to pure esm

* chore: revert `useDefineForClassFields` tsconf

* chore: remove patch.js
2024-09-21 07:06:37 +03:00
Alexey a4130804bf chore: vscode dev env dbeaver/dbeaver-vscode#13 (#2918)
* chore: vscode dev env dbeaver/dbeaver-vscode#15

* chore: update target

* chore: update launch configurations

* chore: revert extensions recommendations
2024-09-20 11:48:40 +03:00
mayerro 37d06ecebd dbeaver/dbeaver-devops#1401 removed commit message validator action 2024-09-19 17:39:35 +02:00
b869bddded CB-5045 move configs to model package (#2705)
* CB-5045 move configs to model package

* CB-5045 jetty 12 fix

* CB-5045 fix conflicts

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-09-19 10:48:30 +00:00
Alexander Skoblikovandmr-anton-t efb42d33a7 Dbeaver/dbeaver vscode#3 remove redundunt plugins (#2891)
* CB-5530 wip

* dbeaver-vscode#3 cleanup servlets

* dbeaver-vscode#3 endpoint fixes

* dbeaver-vscode#3 resolve conflicts

* dbeaver-vscode#3 fix conflict

* dbeaver-vscode# jetty 12 conflict fixes

* dbeaver-vscode#3 servlets filter

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-19 09:14:23 +00:00
Serge Rider 90acaaf00e dbeaver/pro#3336 RCP model refactoring. Remove VFS from base model (#2913)
* dbeaver/pro#3336 RCP model refactoring. Remove VFS from base model

* dbeaver/pro#3336 Simplify DBNNodeWithResource

* dbeaver/pro#3336 Web node info fix

* dbeaver/pro#3336 Code style

* dbeaver/pro#3336 Fix node project get
2024-09-19 08:28:15 +02:00
Anastasiya 46309e9505 Update README.md link (#2923) 2024-09-18 13:58:39 +00:00
serge-rider aebb2d47ef Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-09-18 15:41:09 +02:00
serge-rider 12e0107617 24.2.2 version bump 2024-09-18 15:40:15 +02:00
3c5aa6b7e8 CB-5658 CB-5659 fix: pagination resolving (#2922)
* CB-5658 CB-5659 fix: pagination resolving

* CB-5658 fix resources pages

* CB-5667 fix: node rename behavior

* CB-5658 chore: refactor repeated code

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-18 16:17:59 +03:00
Vladimir 4df7e01d19 Merge pull request #2915 from dbeaver/readme-img-update
dbeaver/tech-docs#607 updated images in README.md
2024-09-18 08:38:59 +02:00
daelynum 801a55cd38 Merge branch 'devel' into readme-img-update
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-09-18 08:28:18 +02:00
Serge Rider 252ff71f03 24.2.1 version bump 2024-09-17 20:46:54 +02:00
sergeyteleshevandDaria Marutkina 2d1bde22a2 Cb 5562 Fix bad this.setState for the new form API (#2903)
* CB-5478 adds useAdministrationUserFormState with flexible id field

* CB-5478 simplifies logic fork form state hooks

* CB-5562 refactors form state and form parts

* CB-5562 fixes disabled param for formState

* CB-5562 comments cleanup

* CB-5562 fixes getting of exceptions

* CB-5562 baseform bad set state fix

* CB-5562 removes load and configure method for forms

* CB-5562 reverts some state.exception changes

* CB-5562 removes bad set state from user form

* CB-5562 cleanup

* CB-5562 cleanup

* CB-5562 removes bad set state from user form

* CB-5562 fixes bad set state for user profile

* CB-5562 pr fixes

* CB-5562 pr fixes

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-17 20:14:34 +03:00
4f0db5b854 CB-4896 migrate to jetty 12 (#2847)
* CB-4896 migrate to jetty 12

* CB-4896 fix root uri

* CB-4896 fix proxy handler paths

* CB-4896 resolve conflicts

* CB-4896 fix hidden gql errors

* CB-4896 redirect welcome mode (redirect from '/' to index.html)

* CB-4896 fix url 'blinking'

---------

Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-17 16:50:04 +00:00
5b527872bd CB-4095. Added env variables for configurations parameters (#2905)
* CB-4095. Added env variables for configurations parameters

* CB-4095. Refactor after review

* CB-4095. Refactor after review, added sub group for envs

* CB-4095. Remove unusable env variable

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-09-17 16:30:19 +00:00
alexandEvgenia Bezborodova 30e74ce09f CB-5450 purge cache if quota error happens (#2917)
* CB-5450 purge cache if quota error happens

* CB-5450 cache only images from the same origin

* CB-5450 change window to self

* CB-5450 revert purgeOnQuotaError

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-17 16:44:44 +03:00
Mikhailov Grigorii 3ca9904631 Merge pull request #2920 from dbeaver/dbeaver/dbeaver-devops#1483-fix-critical-cve-docker-upgrade
dbeaver/dbeaver-devops#1483 Added docker apt-get upgrade
2024-09-17 14:27:55 +02:00
Greg Miller ea2246af31 dbeaver/dbeaver-devops#1483 Remove sed before apt-get 2024-09-17 14:09:01 +02:00
Greg Miller 12e1fb57d7 dbeaver/dbeaver-devops#1483 Added docker apt-get upgrade 2024-09-17 14:04:02 +02:00
03d0f26530 CB-5391 remove controller from the plugin-connections-administration (#2876)
* CB-5391 remove controller from the plugin-connections-administration

* CB-5391 remove use controller

* CB-5391 review fixes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Alexey <wrouds@gmail.com>
2024-09-16 18:17:47 +03:00
AlexeyandEvgenia Bezborodova 9e657d2280 CB-5511 fix: pagination (#2906)
* CB-5511 fix: pagination

* CB-5511 chore: remove unused code

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-16 17:18:27 +03:00
daelynum 461e251753 dbeaver/tech-docs#607 updated images in README.md 2024-09-16 14:29:02 +02:00
daelynum e54bfb3154 Merge branch 'devel' into readme-img-update
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-09-16 14:10:55 +02:00
sergeyteleshevandmr-anton-t 6e575d3e7e CB-5478 Add an ability to new forms to edit formState id (#2885)
* CB-5478 adds useAdministrationUserFormState with flexible id field

* CB-5478 simplifies logic fork form state hooks

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-16 14:22:28 +03:00
Anastasiya 24ff77de47 Merge branch 'devel' into readme-img-update 2024-09-13 18:14:37 +03:00
daelynum 5ce49faea0 dbeaver/tech-docs#607 updated images in README.md 2024-09-13 17:09:37 +02:00
d2b6734dd3 Chinese localization (#2869)
* Add or improve Chinese translations

* Add or improve Chinese translations

* chore: Update Chinese translations

* chore: correct some translation

* fix: add mapping for all new zh files

---------

Co-authored-by: 李飞 <lif@tongfun.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-09-13 14:08:33 +00:00
Anastasiya e62943c548 dbeaver/pro#3333 add contributions info to README.md (#2912)
* dbeaver/pro#3333 add contributions info to README.md

* dbeaver/pro#3333 add info about localization

* dbeaver/pro#3333 fix sentence

* dbeaver/pro#3333 update file

* dbeaver/pro#3333 Update README.md
2024-09-13 15:27:10 +02:00
Alexander Skoblikovandkseniaguzeeva ceefea48c5 CB-5587 override default jetty session handler to add ability to use … (#2880)
* CB-5587 override default jetty session handler to add ability to use dynamic setSecure flag

* CB-5587 handle null server url

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-09-12 12:48:16 +00:00
638e5bc97b CB-5274. Added new link for download metadata file (#2900)
* CB-5274. Added new link for download metadata file

* CB-5274. Refactor after review

* CB-5274 add entityIdLink field

* CB-5274. Rename property

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-09-11 16:10:26 +00:00
Alexey 31cbac1c9c CB-5641 fix: skip version check error (#2907) 2024-09-11 15:37:37 +02:00
alexandkseniaguzeeva bb7a5c384c CB-5583 prefetch notification icons (#2878)
* CB-5583 prefetch notification icons

* CB-5583 prefetch small icons

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-09-11 15:50:32 +03:00
AnastasiyaandDaria Marutkina 611d06b2f8 CB-5412 update SQL Server driver to 12.8.0 (#2886)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-11 09:35:39 +00:00
Serge Rider e0d2d367dc dbeaver/pro#3077 refactor rcp (#2902)
* dbeaver/pro#3077 Refactor RCP resources

* dbeaver/pro#3077 Refactor RCP resources

* dbeaver/pro#3077 Refactor RCP resources

* dbeaver/pro#3077 Deps fix + replace IResource with NIO path
2024-09-09 17:14:40 +02:00
Georgii b2967257e2 dbeaver-infra#126 add bundle-less test classes to iml generation & docs improvements & debug config (#2901) 2024-09-09 10:43:29 +02:00
Alexander SkoblikovandDaria Marutkina 6af5a32a9d CB-5617 disable array editing (#2895)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-05 10:03:22 +00:00
Alexeyandmr-anton-t 8467a592e3 CB-5334 chore: update deps (#2883)
* CB-5334 chore: update deps

* CB-5334 chore: update deps again

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-09-04 19:33:51 +03:00
DenisSinelnikovandDaria Marutkina 0374ddb929 CB-5599. Restricted editing firestore arrays (#2889)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-09-04 15:44:06 +00:00
Alexander Skoblikov 7b5c10b9e2 CB-5602 add flag to force process event (#2888) 2024-09-03 16:09:56 +00:00
Daria Marutkina af31c5cf60 Merge pull request #2884 from dbeaver/dariamarutkina-patch-1
CB_2420 chore: update README
2024-09-02 12:35:09 +02:00
Daria Marutkina 805ae26c3c CB_2420 chore: update README 2024-09-02 12:09:16 +02:00
Alexey f565864124 CB-5228 fix: access token name (#2684)
* CB-5228 fix: access token name

* fix: remove lint triggers
2024-08-30 15:37:12 +03:00
alex a69e760c06 CB-5572 preload lisense status on product tab activate (#2874)
* CB-5572 preload lisense status on product tab activate

* CB-5572 await load
2024-08-28 14:25:41 +03:00
serge-rider cb972cb299 24.2.1 version bump 2024-08-26 19:42:23 +02:00
sergeyteleshevandAleksei Potsetsuev 74aa8c7980 CB-5503 Login form - incorrect password is cleared from the form after pressing Enter (#2853)
* CB-5503 fix: Prevent form submission from erasing password input value

* feat: Add form submission handling to AuthDialog

* Revert "feat: Add form submission handling to AuthDialog"

This reverts commit de19e67c8d.

* Revert "CB-5503 fix: Prevent form submission from erasing password input value"

This reverts commit a5a74ae558.

* CB-5503 adds useValidationStyles for the form inputs

* Revert "CB-5503 adds useValidationStyles for the form inputs"

This reverts commit 7702fdc280.

* CB-5503 removes resets for useForm submit event

* fix: form submitting process

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-08-26 18:37:08 +02:00
443cbfcde5 CB-5549. Added ability to configure server property for Root URI (#2868)
* CB-5549. Added ability to configure server property for Root URI

* CB-5549. Added new SQL

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-08-26 13:39:59 +00:00
Arioko 678ec32c44 Environment variable called "CLOUDBEAVER_ROOT_URI" in cloudbeaver.conf (#2812)
Inclusion of the ability to configure the server property "rootURI" with an environment variable called "CLOUDBEAVER_ROOT_URI" to simplify changing its value in dockenized environments.
2024-08-26 12:28:22 +00:00
Alexander Skoblikov 54544b6334 CB-5561 execute data migration if runtime config contains env variables (#2873) 2024-08-26 12:19:32 +00:00
ab077070c0 CB-5431 Easy config steps are available via url without a license (#2850)
* CB-5431 fixes redirects on unavailable pages during easy config

* CB-5431 cleanup

* Revert "CB-5431 cleanup"

This reverts commit 126e47b7e5.

* Revert "CB-5431 fixes redirects on unavailable pages during easy config"

This reverts commit 0719adc0ab.

* chore: Add ConfigurationWizardScreenService to core-administration manifest

* fix: Handle non-existing pages during route change in AdministrationScreenService

* CB-5431 pr fix

* CB-5431 cleanup

* feat: Remove unused import in AdministrationScreenService

* Fix issue with loading server configuration on non-admin screens

* chore: code style

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-08-26 12:59:14 +03:00
AinurandEvgenia Bezborodova dfd5838f38 CB-3968 prettify error (#2862)
* CB-3968 prettify error

* CB-3968 return only rm error message

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-26 09:21:52 +00:00
00c1cc81ac CB-4708 add localization to some data viewer tokens (#2388)
* CB-4708 add localization to some data viewer tokens

* Fix conflicts

* CB-4708 remove extra code

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-26 11:32:22 +03:00
serge-rider 1ef728ab85 Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-08-24 18:18:17 +02:00
serge-rider fe56f61db3 Java version config (use single property) 2024-08-24 18:14:42 +02:00
d186859cb5 CB-5177 fix: allow change unsaved credentials (#2857)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-23 16:19:57 +03:00
AinurandAlexander Skoblikov a51ab7d145 CB-5550 fix npe (#2867)
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-08-23 10:53:25 +00:00
AlexeyandDaria Marutkina bdaf5dc3b4 Fix/cb-5383/sync-grid-focus (#2863)
* CB-5383 fix: sync focus in grid

* CB-5383 fix: don't reset focus on index/column

* CB-5383 fix: typo

* CB-5383 fix: focus sync lag

* refactor: rename users delete fn

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-23 12:37:13 +03:00
alex 4a4f959da8 CB-5548 add overflow to team options container (#2870) 2024-08-22 17:06:29 +02:00
Alexander Skoblikovandmr-anton-t f82660657d CB-5291 ldap integration improvements (#2844)
* CB-5291 wip

* CB-5291 ldap custom user id attribute and user filter

* CB-5291 checkstyle

* CB-5291 npe fix

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-08-22 13:29:27 +00:00
Alexey d650ec104b chore: use esbuild (#2859)
* chore: use esbuild

* chore: update ts lib
2024-08-22 15:10:31 +03:00
7ca8cfe998 CB-5048 ignore undo and redo on codemirror level (#2854)
* CB-5048 ignore undo and redo on codemirror level

* CB-5048 feat: improve query history

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-22 15:07:45 +03:00
Alexeyandalex fd4a503f8b CB-5504 fix: hide tabs for not executable sql editors (#2858)
Co-authored-by: alex <48489896+devnaumov@users.noreply.github.com>
2024-08-22 15:07:10 +03:00
Alexander SkoblikovandDaria Marutkina 5287ec9859 CB-5509 - http only cookie (#2860)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-22 09:24:11 +02:00
alex 542171ad1e CB-5261 add disabled prop to GroupClose component (#2839)
* CB-5261 add disabled prop to GroupClose component

* CB-5261 allow pointer events on disabled fieldset
2024-08-21 15:26:20 +02:00
AinurandDaria Marutkina 10b3a53c4a CB-5436 remove filter feature for tables and views (#2849)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-21 11:02:01 +00:00
alexandkseniaguzeeva 16de895ed4 CB-5252 extend return types (#2843)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-08-20 11:34:41 +02:00
serge-rider cab257d141 Merge remote-tracking branch 'origin/devel' into devel 2024-08-19 15:48:50 +02:00
serge-rider b48e173515 24.2.0 version fix 2024-08-19 15:48:20 +02:00
Daria Marutkina 5617d49597 Merge pull request #2852 from dbeaver/dariamarutkina-patch-3
CB_2415 chore: update README
2024-08-19 11:27:40 +02:00
Daria Marutkina 7fcfe9b5c8 CB_2415 chore: update README 2024-08-19 11:22:18 +02:00
serge-rider 351a323d9c 24.2.0 version config fix 2024-08-16 11:50:57 +02:00
serge-rider 1de2502835 24.2.0 version bump 2024-08-15 12:19:36 +02:00
Serge Rider b07510afc3 24.2.0 version bump 2024-08-14 18:32:22 +03:00
Alexander Skoblikov dd5a39e78a CB-5509 secure session cookie (#2840) 2024-08-14 17:47:01 +03:00
AinurandEvgenia Bezborodova f15c6b5ec9 CB-5386 fix npe (#2837)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-14 17:12:12 +03:00
sergeyteleshevandEvgenia Bezborodova 378f60aa94 feat: Add isNotNullDefined check for valuePlaceholder in PropertyItem.tsx (#2836)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-14 16:51:18 +03:00
Alexey f982b4b552 CB-5512 feat: Refactor QuotasService to use optional chaining (#2841)
The QuotasService has been refactored to use optional chaining when accessing the serverResourceQuotasResource data. This improves the code readability and reduces the need for null checks.
2024-08-14 16:32:29 +03:00
95046f076f CB-5451 adjust regex (#2824)
* CB-5451 adjust regex

* CB-5451 do not validate when deleting rm resource

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com>
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
2024-08-13 15:55:05 +00:00
92546849f8 CB-5123. Added backend part, added new parameter licenseStatus to ser… (#2831)
* CB-5123. Added backend part, added new parameter licenseStatus to server config gql

* CB-5123 feat: display license status information

* CB-5123 fix: after review

* CB-5123. Added version

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-13 11:16:56 +00:00
Ainurandkseniaguzeeva 2d45b29a07 CB-5025 update cloudbeaver features fix for ai (#2823)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-08-12 11:14:52 +00:00
AinurandEvgenia Bezborodova de00a60aad CB-4511 clear secure props if save password is disabled (#2835)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-12 11:14:27 +00:00
d118287b0e Cb 5378 dm ability to use custom ssl certificate (#2808)
* CB-5378 add getDomainFromUrl util function

* CB-5378 add uplodable prop to textarea

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-08-12 11:12:18 +00:00
sergeyteleshevandmr-anton-t 8d14e42797 CB-4068 adds driver libraries resource (#2826)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-08-09 14:30:32 +03:00
Alexander SkoblikovandEvgenia Bezborodova 36c089ed06 CB-5375 auto migration to postgres DB for default CB EE configuration (#2809)
* CB-5375 auto migration to postgres DB for default CB EE configuration

* CB-5375 fix test

* CB-5375 move legacy db

* CB-5474 async qm data migration

* CB-5375 comment unused field

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-08 22:12:50 +03:00
sergeyteleshevandDaria Marutkina 62393937fc CB-5364 adds context menu for data-viewer (#2810)
* CB-5364 adds context menu for data-viewer

* chore: reverts changes

* CB-5364 feat: adds context menu for object viewer

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-08 16:46:13 +03:00
alex 8e0e0c9193 CB-5474 remove special behaviour for long names (#2834) 2024-08-08 13:33:07 +03:00
sergeyteleshevandDaria Marutkina de85721c8f chore: Update exception message in SpreadsheetBootstrap (#2832)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-07 19:17:15 +03:00
AlexeyandEvgenia Bezborodova f059daf693 CB-4990 feat: add authentication timeout (#2829)
* CB-4990 feat: add authentication timeout

* CB-4990 fix: review

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-07 19:16:57 +03:00
DenisSinelnikovandEvgenia Bezborodova 5d071e5dfd CB-5255. Fixed cb error when you tried delete node twice, return error from database (#2828)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-07 17:12:11 +02:00
AlexeyandEvgenia Bezborodova afb4ea205c CB-5393 fix: modal submenu (#2830)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-07 16:20:36 +03:00
sergeyteleshevandAleksei Potsetsuev 74486b35b4 CB-5340 adds unit tests for basic hooks (#2755)
* CB-5340 adds unit tests for basic hooks

* CB-5340 test: trigger github actions

* CB-5340 fixes unit tests

* CB-5340 fixes unit tests

* CB-5340 fixes unit tests

* CB-5340 adds jest moduled imports for unit tests

* CB-5340 adds jest moduled imports for unit tests

* CB-5340 revert some changes

* CB-5340 cleanup

* CB-5340 replaces global jest to moduled

* CB-5340 uncomment tests and skip it

* CB-5340 cleanup

* chore: enable jest globals

* CB-5340 fix unit tests

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-08-07 12:42:43 +03:00
Alexeyandmr-anton-t babb29f05a CB-5333 chore: update npm dependencies (#2827)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-08-07 12:30:30 +03:00
alexandDaria Marutkina 12b5b2b941 CB-5437 use flex component instead of container (#2818)
* CB-5437 use flex component instead of container

* CB-5437 use data attributes to apply styles

* CB-5437 simplify logic

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-07 12:06:50 +03:00
6ca587a5b0 CB-5447 npe fix (#2819)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Ainur <59531286+yagudin10@users.noreply.github.com>
2024-08-06 13:24:44 +00:00
sergeyteleshevandEvgenia Bezborodova 23b70441b8 CB-4618 Profile, changing password - after a successful change red borders appear (#2820)
* CB-4618 removes red border after form submission

* Revert "CB-4618 removes red border after form submission"

This reverts commit 703da4eea9.

* CB-4618 removes red border after form submission in useForm hook

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-08-06 15:53:52 +03:00
sergeyteleshevandDaria Marutkina ffee7a1f2f CB-5414 Import table - wrong description for canceled import (#2821)
* feat: adds correct cancellation message to DataImportService

* Update Russian translation for the data import process fail cancel message

* CB-5414 do not set message on cancelled task during import into table

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-06 12:39:31 +03:00
alexandDaria Marutkina 62d1f05188 CB-5215 move form component (#2815)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-08-05 19:31:23 +03:00
Daria Marutkina ea00ce653e Merge pull request #2825 from dbeaver/dariamarutkina-patch-2
CB_2414 chore: update README
2024-08-05 12:47:01 +02:00
Daria Marutkina b7da47a816 CB_2414 chore: update README 2024-08-05 12:44:48 +02:00
Serge Rider b2dfa0a1bb Copyright update 2024-08-05 11:23:00 +03:00
Serge Rider 6486612c0e Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-08-05 06:54:07 +03:00
Alexander Skoblikov c349697fa1 clear test's logs (#2822) 2024-08-02 14:46:16 +02:00
Serge Rider ab7e17900c 24.1.5 version bump 2024-07-31 16:45:10 +03:00
Serge Rider 04e8610b12 dbeaver/pro#3129 model.sql.jdbc module added (#2806) 2024-07-31 16:25:25 +03:00
alexandDaria Marutkina c4f9764e02 CB-3789 make switch color brighter in dark theme (#2799)
* CB-3789 make switch color brighter in dark theme

* CB-3789 fix dense colors

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-30 15:43:40 +02:00
sergeyteleshevandEvgenia Bezborodova 45683f1a48 CB-3733 Close data editor tabs with the middle mouse button (#2805)
* feat: Add closeOnMouseWheelClick prop to Tab components

* fix: close tab on middle mouse button if tab can be closed

* fix: closes tabs for Safari also

* CB-3733 removes closeOnMouseWheelClick prop

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-29 11:23:55 +03:00
00aa2eb3e4 CB-5300 save deployment url after finishing easy config (#2776)
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-07-25 15:31:24 +00:00
sergeyteleshevandDaria Marutkina 701e681fbd CB-5081 makes search icon always visible for local databases list (#2800)
* CB-5081 makes search icon always visible for local databases list

* CB-5081 renames search icon props

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-25 16:39:19 +03:00
DenisSinelnikovandDaria Marutkina 5be8582bfd CB-5415. Added full name header for RP (#2795)
* CB-5415. Added full name header for RP

* CB-5415. Refactor after review

* CB-5415. Refactor after review

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-25 11:22:31 +00:00
081b0eaead Cb 4653 aws settings form migration (#2785)
* CB-4653 demo fixes

* CB-4653 chore: log message

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-25 07:48:03 +03:00
AnastasiyaandEvgenia Bezborodova fa0cd1ea78 CB-5394 change descriptions for administrator rights (#2794)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-24 17:15:53 +03:00
sergeyteleshev 949722cd5a CB-4537 fixes textarea size for firefox browser in ErrorDialogDetails component (#2801) 2024-07-24 17:15:18 +03:00
sergeyteleshevandDaria Marutkina 0171240ac8 CB-5329 refactors isControlPresented to be more readable (#2798)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-24 14:27:27 +03:00
e4345ffc63 Cb 5178 redesign administration menu (#2775)
* CB-5357 resolves auth dialog on successful login (removes no license notification bug on login)

* CB-5178 fix settings names

* CB-5178 adds to the drawer items the new order

* CB-5178 removes license build and build time info from new "About" menu setting

* CB-5178 renames: plugin product -> plugin-product-information

* CB-5178 adds products info settings tab and page template

* CB-5178 adds product-info tabs

* CB-5178 revert changes from another branch

* CB-5178 fixes disappearing for sub tabs

* CB-5178 removes license redirect memory leaks + redirects correctly

* CB-5178 updates tabs state if license has new available version

* CB-5178 updates locale for new tabs

* CB-5178 moves product and product-info-administration to separate packages

* CB-5178 cleanup

* CB-5178 uses TabsContainer for Product Information Administration tabs

* CB-5178 cleanup

* CB-5178 cleanup

* CB-5178 cleanup

* CB-5178 replace icon

* CB-5178 removes extra icons

* CB-5178 fix: navigation sync with URL

* CB-5178 fix: plugin name

* CB-5178 fix: new version detection

* CB-5178 chore: add comment about style duplication

* Revert "CB-5178 removes extra icons"

This reverts commit 659b5720d5.

* CB-5178 adds about labels

* CB-5178 fixes disabled tabs for invalid license

* Revert "CB-5178 fixes disabled tabs for invalid license"

This reverts commit 2584a73219.

* CB-5178 disables administration items if license is expired (fix)

* CB-5178 disable product info tabs if no license required

* Revert "CB-5178 disable product info tabs if no license required"

This reverts commit e3d6c85313.

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-23 19:24:45 +03:00
sergeyteleshevandEvgenia Bezborodova 7959357668 CB-4823 Result set - no vertical and horizontal scrolls appear for long errors (#2797)
* CB-4823 fixes table error overflow and icon position

* CB-4823 CB-4823 fixes scroll for collapsed error icon

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-23 18:26:26 +03:00
AlexeyandAleksandr Skoblikov 6b91a0e9e6 CB-5288 fix: connection secrets cache (#2748)
Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-07-23 09:36:20 +00:00
AlexeyandDaria Marutkina f834169414 chore: localization (#2406)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-23 12:13:23 +03:00
3a10080956 CB-5134. Added flag for node features (#2770)
* CB-5134. Added flag for node features

* CB-5134 check canFilter feature

* CB-5134. Added filter for connections when connected

* CB-5134. Fix filter for schemas

* CB-5314. Fix diagram view

* CB-5314. Fix diagram view

* CB-5314. Fix diagram view

* CB-5134. Refactor after review

* CB-5134 fix: typescript error

* CB-5134 fix: typescript error

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-07-22 12:32:49 +00:00
2c541b2c98 CB-5075. Fix cancel import message after download file (#2786)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-07-22 12:24:53 +00:00
Anastasiya b967cde145 24.1.4 version bump (#2793) 2024-07-22 12:59:12 +03:00
Daria Marutkina e49086203c Merge pull request #2792 from dbeaver/dariamarutkina-patch-1
CB_2413 chore: update README
2024-07-22 11:21:31 +02:00
Daria Marutkina cf276f6a13 CB_2403 chore: update README 2024-07-22 11:18:15 +02:00
serge-rider 93ddddc913 Merge remote-tracking branch 'origin/devel' into devel 2024-07-18 09:05:11 +02:00
serge-rider 1895f3ab2e 24.1.4 version bump 2024-07-18 09:03:21 +02:00
mayer 5b436463b9 dbeaver/dbeaver-devops#823-web-path-created-in-fronted-step (#2426) 2024-07-17 15:52:56 +02:00
Alexey 75fdc2bcec Fix/cb-3823/typescript-error (#2784)
* CB-5134 fix: typescript error

* CB-5134 fix: typescript error
2024-07-16 19:23:50 +02:00
b48684b65d CB-3823 refactor: introduce service provider (#2774)
* CB-3823 refactor: introduce service provider

* CB-3823 fix: tests

* CB-5361 api for db tools

* CB-3823 feat: table group

* CB-3823 feat: connection tools resource

* CB-3823 refactor: database result action

* CB-3823 feat: session manager

* CB-3823 fix: data viewer error tracking

* CB-5361 add tools for rm admin

* CB-3823 fix: review

* CB-5361 fixes after review

* CB-5361 add comment

* CB-5361 fix permissions

* CB-3823 fix: service provider

* CB-3823 fix: useController services fallback

---------

Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-16 17:38:00 +02:00
Alexey f5149c6324 CB-5337 fix: checkbox color (#2781) 2024-07-16 18:25:28 +03:00
AlexeyandEvgenia Bezborodova 87cd84881d CB-5318 fix: language sync (#2782)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-16 18:25:17 +03:00
Alexey 16e2920937 CB-5380 fix: grid loading (#2779) 2024-07-16 16:31:42 +03:00
alexandEvgenia Bezborodova d0f82d95a6 CB-5121 use different regex for long proposals mode (#2778)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-15 15:26:21 +03:00
sergeyteleshevandDaria Marutkina fb9cd47bed CB-5357 Expiring license notification is not shown after login (#2767)
* CB-5357 resolves auth dialog on successful login (removes no license notification bug on login)

* CB-5357 fix: do not show 2 notifications

* CB-5357 reverts authPromise logic

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-14 17:42:24 +03:00
Alexander Skoblikov 364cb6e516 use driver version as in cb (#2766) 2024-07-13 07:02:00 +02:00
9e74f18be3 CB-5338 simplify data grid styling logic (#2762)
* CB-5338 simplify data grid styling logic

* CB-5338 do not inherit color scheme from react data grid

* CB-5338 remove DataGridContainer

* CB-5338 sync focus status

* CB-5338 review fixes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-12 16:00:43 +03:00
DenisSinelnikov d94a6f9588 Merge pull request #2759 from dbeaver/CB-5344-big-query-cloud-host-and-port-become-empty-after-connection-editing
CB-5344 set value fix for nullable main property
2024-07-12 13:10:28 +04:00
Evgenia Bezborodova 6afd8698fe Merge branch 'devel' into CB-5344-big-query-cloud-host-and-port-become-empty-after-connection-editing 2024-07-11 12:55:27 +03:00
alexandDaria Marutkina c8436f93e1 CB-4860 change save icon (#2773)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-07-10 19:05:54 +03:00
Serge RiderandMashaKorax 8cd8f83e5f dbeaver/pro#2998 Fix app certificate storage reuse. SSL constants refactoring (#2753)
Co-authored-by: MashaKorax <84867187+MashaKorax@users.noreply.github.com>
2024-07-10 12:35:57 +02:00
alexandEvgenia Bezborodova 190a9db695 CB-5084 use columnIndex instead of plain (#2769)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-10 12:15:29 +03:00
sergeyteleshev aa52372422 CB-5332 updates frontend dependencies (#2772) 2024-07-10 12:15:07 +03:00
Alexey f88eb8610c chore: remove unused npm command (#2771) 2024-07-09 16:45:49 +03:00
Ainurandkseniaguzeeva 021516ae7f CB-3487 filter applicable drivers fix (#2758)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-07-08 16:06:15 +02:00
Daria Marutkina a40993f77d CB_2412 chore: update README (#2768) 2024-07-08 11:42:20 +02:00
Alexey 1298f7e294 fix: prettier (#2765) 2024-07-05 16:26:31 +03:00
Alexey 3ea4443f48 CB-5341 chore: auto refresh localization (#2761) 2024-07-04 16:30:10 +03:00
Alexey 1be6ddaf1c CB-5342 fix: database data source tasks result (#2756)
* CB-5342 fix: database data source tasks result

* CB-5342 fix: database data source tasks tracking

* CB-5342 fix: add stop auto refresh button
2024-07-04 11:08:39 +03:00
Serge Rider 0d53211b88 24.1.3 version bump 2024-07-04 06:45:10 +02:00
Serge Rider 115efeb613 24.1.3 version bump 2024-07-04 06:43:33 +02:00
Serge Rider 220c72487f dbeaver/pro#3022 Close NIO directory streams (#2760) 2024-07-04 05:41:48 +02:00
Ainur 17dcd9464c CB-5344 set value fix for nullable main property 2024-07-03 14:05:50 +02:00
e259606422 CB-4885 feat: components registry (#2745)
* CB-4885 feat: components registry

* CB-4885 fix: table data loading behaviour

* CB-4885 chore: remove unused comments

* CB-4885 fix: dispose tables correctly

* CB-4885 fix: cache invalidation

* CB-4885 fix: nav tree state persistence

* CB-4885 fix: database disconnect detection

* CB-4885 fix: auto refresh on error

* CB-4885 fix: auto refresh behaviour

* CB-4885 fix: auto refresh behaviour

* CB-4885 fix: top menu bar styles

* CB-4885 fix: auto refresh error handling

* CB-4885 chore: add comment about implementation

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-07-02 20:00:39 +02:00
Alexander Skoblikovandmr-anton-t 042da7cc7c CB-5323 less priority for .product.runtime.conf (#2754)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-07-02 20:00:02 +02:00
Alexander SkoblikovandEvgenia Bezborodova 1e2eee87d3 CB-5138 force use default properties for default database (#2751)
* CB-5138 force use default properties for default database

* CB-5138 review fix

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-02 16:04:42 +00:00
faafcee1a4 CB-4961 Control files downloading ability (#2744)
* CB-4961 adds "disable download" setting to data viewer

* CB-4691 removes unneeded alias for new disable download setting

* CB-4691 pr fixes

* CB-4961 reverts image value presentation canSave logic

* CB-4961 disables download from image context menu

* CB-4691 fixes unit tests

* CB-4691 change new setting to existing one

* CB-4691 renames disable download -> disable export

* CB-4691 pr fixes

* CB-4691 updates tests for new export setting

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-02 16:48:37 +03:00
Elizabethandkseniaguzeeva 6efbd6904a dbeaver/pro#2651 Add all resource properties updating (#2747)
* dbeaver/pro#2651 Add all resource properties updating

* dbeaver/pro#2651 Fix code style

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-07-02 15:04:58 +02:00
Georgii 8f740b732b dbeaver/dbeaver-infra#98 build imls for optional plugins (#2752) 2024-07-02 15:02:30 +02:00
sergeyteleshevandEvgenia Bezborodova 7e4411c0a9 CB-5153 Change description for 'Save credentials' mark on connection auth pop-up + unify (#2746)
* CB-5153 adds more UX friendly texts for connection "save credentials" checkbox

* CB-5153 fix build

* CB-5153 changes admins "Preferences" name to "Global Preferences"

* CB-5153 pr fixes

* CB-5153 adds logic to ssh/ssl login auth connection popup share cred checkboxes

* CB-5153 fixes translations with grammarly

* CB-5153 fixes tooltip texts for all languages

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-02 14:46:28 +03:00
Alexander Skoblikov b6ac0b93e7 CB-5322 limit latest logins by time (#2750)
* CB-5322 limit latest logins by time

* CB-5322 display correct block time

* CB-5322 naming
2024-07-02 10:54:47 +02:00
b2c6306d21 CB-5114 add gql api for bigquery trace info (#2732)
* CB-5114 add gql api for bigquery trace info

* CB-5114 add has dynamic trace to gql

* CB-5114 has dynamic trace prop fix

* CB-5114 fixes after review

* CB-5113 add result trace details panel

* CB-5113 connect plugin

* CB-4882 review fixes

* CB-4882 update references

* CB-4882 use suspense instead of loader

* CB-4882 use metadata to keep promise

* CB-4882 add overflow to container

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-01 13:21:21 +00:00
49875e4dc1 CB-5197 create main connection fields dynamically (#2693)
* CB-5238 add main properties for connections

* CB-5197 render main properties

* CB-5197 render main properties

* CB-5238 set default values to main properties

* CB-5197 fix(ci/cd): respect base and target branches

* CB-5238 fixes after review

* CB-5197 review fixes

* CB-5197 switch to new model

* CB-5238 fixes after review

* CB-5197 remove custom configuration type

* CB-5238 remove custom config type from gql schema

* CB-5197 do not check configuration type for creds

* CB-5197 make argument optional

* CB-5238 fix creating connection with url

* CB-5238 rename param

* CB-5238 rename param

* CB-5197 rename field

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-07-01 12:45:57 +00:00
4433018ed2 Cb 5124 add a notification about the upcoming expiration of the license add to status (#2733)
* CB-5124. Add license status to /status api

* CB-5124. Add license status to /status api

* CB-5124 adds reminder for soon expiring license

* CB-5124. Refactor after review

* CB-5153 adds core-website package

* CB-5124 updates TS references

* CB-5124 refactors website links service

* CB-5124 pr fixes

* CB-5124 update TS references

* CB-5124 removes WebSiteLinks from coreWebsiteManifest

---------

Co-authored-by: sergeyteleshev <iamsergeyteleshev@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-28 17:14:33 +00:00
0755561250 CB-5165. Add parameter to api - autocommit (#2737)
* CB-5165. Add parameter to api - autocommit

* CB-5165. Refactor after review

* CB-5165 add auto commit checkbox

* CB-5165 add gap between elements

* CB-5165. Refactor after review

* CB-5165. Refactor after review

* CB-5165. Refactor after review

* CB-5165. Refactor after review

* CB-5165 change category name

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-28 16:26:34 +00:00
sergeyteleshevandEvgenia Bezborodova ea87a48619 CB-5299 fixes border for value panel icon in different browsers (#2740)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-27 17:43:13 +03:00
c2330e9c6a CB-5038 update clickhouse driver (#2731)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-06-27 09:33:42 +00:00
Alexander SkoblikovandEvgenia Bezborodova 09de0c328a CB-4889 CB database env variables (#2739)
* CB-4889 CB database env variables

* CB-4889 fix runtime conf priority

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-26 16:15:09 +00:00
serge-rider dab4a0d033 Merge remote-tracking branch 'origin/devel' into devel 2024-06-26 16:02:37 +02:00
serge-rider 05507db706 24.1.2 version bump 2024-06-26 16:01:46 +02:00
sergeyteleshevandAlexey 6e4f16e824 Cb 5293 unit tests for hooks in core blocks (#2724)
* CB-5293 adds unit tests for useState delay hook

* CB-5293 removes unused helper hook

* СB-5277 adds tests for useClipboard hook

---------

Co-authored-by: Alexey <wrouds@gmail.com>
2024-06-26 16:38:07 +03:00
alexandAlexey 56a2e8c13d Cb 5277 test components (#2721)
* CB-5277 add tests for core blocks components

* CB-5277 add tests for link and status message

* CB-5277 add Cell test

---------

Co-authored-by: Alexey <wrouds@gmail.com>
2024-06-26 16:37:38 +03:00
serge-rider d8b6655da5 24.1.2 version bump 2024-06-26 14:07:27 +02:00
sergeyteleshevandEvgenia Bezborodova 4842cba903 CB-5181 Display User Notification Pop-up When Copy/Paste Functionality is Disabled by Administrator (#2730)
* CB-5181 adds copy event handler for data viewer (cells, value panel)

* CB-5181 makes edit/copy settings independent from each other

* CB-5181 adds disable copy case for read state JsonLine (pre)

* CB-5181 changes message text for popup

* CB-5181 changes message text for popup 2

* СB-5181 fixes rus locale for copy message

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-25 18:17:40 +03:00
Alexey 4078b6aa16 CB-5250 refactor: move task manager to core manifest (#2726)
* refactor: move task manager to core manifest

* chore: update dependencies
2024-06-25 18:15:32 +03:00
Georgii 241f2393be dbeaver/dbeaver-infra#91 add source links and fix small issues (#2727)
* dbeaver/dbeaver-infra#91 add source links and fix small issues

* dbeaver/dbeaver-infra#91 add a way to add required fragmens manually + fix scripts
2024-06-25 12:58:30 +02:00
Evgenia Bezborodova 5851c8f2c4 CB_2411: update README (#2729) 2024-06-24 17:30:48 +02:00
AlexeyandEvgenia Bezborodova c70c932e9c CB-5279 fix: return counter button for non result set data format (#2719)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-24 12:38:23 +03:00
alex b155c98c02 CB-5292 add separate group for advanced properties (#2725) 2024-06-24 12:37:52 +03:00
serge-rider 1d0fac3eb0 Legacy constants refactoring 2024-06-24 11:28:48 +02:00
GeorgiiandSerge Rider 124fa7f691 dbeaver/infra#74 update cloudbeaver launch args (#2682)
* dbeaver/infra#74 update cloudbeaver launch args

* dbeaver/dbeaver-infra#74 add generator scripts and move rcp-gen.properties to product repos

* dbeaver/dbeaver-infra#74 add copyright config to generator CE

* dbeaver/dbeaver-infra#74 move to .ide/idea instead

* dbeaver/dbeaver-infra#74 formatting

* dbeaver/dbeaver-infra#74 update vscode configs and rename rcp-gen.properties to osgi-app.properties

* dbeaver/dbeaver-infra#74 generate workspace per osgi-app.properties file

* dbeaver/dbeaver-infra#74 remove workspace from naming

---------

Co-authored-by: Serge Rider <serge@jkiss.org>
2024-06-21 10:55:32 +02:00
Alexander Skoblikov af5cbedf22 CB-5289 load logs config in log service (#2722) 2024-06-21 09:36:13 +02:00
Ainur b46dd9b8a8 CB-5270 gql tests refactoring (#2713) 2024-06-20 09:59:57 +02:00
Alexey cdd3a356ac CB-5278 fix: don't dispose execution context (#2718) 2024-06-18 18:43:05 +02:00
Alexey 9a471bed70 Refactor cb-4018 data context api (#2708)
* CB-4018 refactor: data context api

* CB-4018 refactor: data context api

* CB-4018 refactor: form parts api

* CB-4018 fix: pr review

* CB-4018 fix: track mobx dependencies in useDataContextLink

* CB-4018 fix: unsubscribe behaviour

* CB-3510 feat: data editing actions based on view (#2710)

* CB-3510 feat: data editing actions based on view

* CB-3510 fix: pr review

* CB-3510 fix: table bottom bar styles

* CB-4018 refactor: respect presentation in data viewer

* CB-4018 fix: remove gap in data viewer toolbar

* CB-4018 fix: isolate contexts in data viewer
2024-06-18 18:19:04 +03:00
Alexey e779a23f0e CB-5213 chore: update react-data-grid (#2716) 2024-06-18 09:30:24 +03:00
240dab7c0f Added French translation files (fr.ts) to respective directories (#2670)
* Added French translation file for core-administration (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-administration/src/locales/ directory. This file contains the French translations for various administration-related strings used in the application. The translations include menu entries, configuration wizard titles, and success messages.

* Added French translation file for core-authentication (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-authentication/src/locales/ directory. This file contains the French translations for various authentication-related strings used in the application. The translations include settings group labels, options for disabling anonymous access, and password policy requirements such as minimum length, case sensitivity, digits, and special characters.

* Added French translation file for core-blocks (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-blocks/src/locales/ directory. This file contains the French translations for various core-blocks related strings used in the application. The translations include properties table labels, filter options, add/reset/remove property actions, placeholder texts, error messages, and validation messages.

* Added French translation file for core-browser-settings (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-browser-settings/src/locales/ directory. This file contains the French translations for various browser settings related strings used in the application. The translations include settings for cookies and general browser settings.

* Added French translation file for core-connections (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-connections/src/locales/ directory. This file contains the French translations for various connection-related strings used in the application. The translations include settings for connections, connection templates, error messages, authentication details, network handler configurations, and various tooltips and placeholder texts related to database connections and SSH tunnels.

* Added French translation file for core-localization (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-localization/src/locales/ directory. This file contains the French translations for various UI-related strings used in the application. The translations include messages for renaming, themes, navigation steps, loading states, error handling, clipboard operations, authentication, settings, file operations, and more.

* Added French translation file for core-navigation-tree (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-navigation-tree/src/locales/ directory. This file contains the French translation for the navigation tree settings group string used in the application.

* Added French translation file for core-projects (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-projects/src/locales/ directory. This file contains the French translation for the message indicating that a project is not found.

* Added French translation file for core-resource-manager (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-resource-manager/src/locales/ directory. This file contains the French translation for the resource manager settings group string used in the application.

* Added French translation file for core-settings-localization (fr.ts)

I have created the fr.ts file in the cloudbeaver/webapp/packages/core-settings-localization/src/locales/ directory. This file contains the French translations for the localization settings, including the labels and descriptions for language settings in the application.

* Added French translation file for core-settings-user (fr.ts)

I have created the fr.ts file in the cloudbeaver/webapp/packages/core-settings-user/src/locales/ directory. This file currently does not contain any translations, but it has been set up for future French translations for user settings in the application.

* Added French translation file for core-settings (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-settings/src/locales/ directory. This file contains the French translations for the interface and root settings groups used in the application.

* Added French translation file for core-theming (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-theming/src/locales/ directory. This file contains the French translations for the theming settings, including the labels and descriptions for the application color theme.

* Added French translation file for core-ui (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-ui/src/locales/ directory. This file contains the French translations for various UI-related messages used in the application, including messages for empty states, form save errors, and tab switching errors during form validation.

* Added French translation file for core-version-update (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-version-update/src/locales/ directory. This file contains the French translations for various version update-related messages used in the application, including messages about version status, refresh actions, and update instructions.

* Added French translation file for core-version (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-version/src/locales/ directory. This file contains the French translations for various version-related strings used in the application, including version information, release dates, tags, and error messages for loading version information.

* Added French translation file for core-view (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/core-view/src/locales/ directory. This file contains the French translations for various view-related strings used in the application, including layout settings, zoom actions, and labels for creating and editing items and folders.

* Added French translation file for plugin-administration (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-administration/src/locales/ directory. This file contains the French translations for various administration-related messages used in the application, including server configuration, welcome messages, security settings, and navigation options.

* Added French translation file for plugin-authentication-administration (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-authentication-administration/src/locales/ directory. This file contains the French translations for various authentication and administration-related messages used in the application, including user connections, access management, identity providers, and team management.

* Added French translation file for plugin-authentication (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-authentication/src/locales/ directory. This file contains the French translations for various authentication-related messages used in the application, including login, logout, user credentials, error messages, and identity provider configurations.

* Added French translation file for plugin-browser (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-browser/src/locales/ directory. This file contains the French translations for various update-related messages used in the application, including installation of the application, installation of updates, and restart messages with progress information.

* Added French translation file for plugin-connection-custom (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-connection-custom/src/locales/ directory. This file contains the French translations for various custom connection-related messages used in the application, including parameters, URL, main settings, driver properties, and connection actions like testing and creating connections.

* Added French translation file for plugin-connection-search (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-connection-search/src/locales/ directory. This file contains the French translation for the label used in the plugin-connection-search, specifically the message "Find Local Database" which is translated to "Trouver une base de données locale".

* Added French translation file for plugin-connection-template (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-connection-template/src/locales/ directory. This file contains the French translations for various strings used in the connection template plugin. The translations include labels and messages related to new connections, database connection dialogs, and connection templates. This addition will help French-speaking users interact with the connection template plugin more easily.

* Added French translation file for plugin-connections-administration (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-connections-administration/src/locales/ directory. This file contains the French translations for various connection-related strings used in the application. The translations include menu items for editing connections, confirmation messages for reconnection, and descriptions of the templates used by administrators to create reusable connection parameters.

* Added French translation file for plugin-connections (fr.ts)

I have added the fr.ts file to the cloudbeaver/webapp/packages/plugin-connections/src/locales/ directory. This file contains the French translations for various connection-related strings used in the application. The translations include messages for editing connections, connection status updates, and SSL settings.

* Added French translation file for plugin-data-export (fr.ts)

Added French translations for various data export-related strings in the plugin-data-export module. This includes translations for dialogs, notifications, and settings related to data export functionality.

* Added French translation file for plugin-data-import (fr.ts)

- Added French translations for the data import plugin.
- Included translations for various stages and messages related to data import process.

* Add French translation file for plugin-data-spreadsheet-new (fr.ts)

Added French translations for plugin-data-spreadsheet-new. This includes translations for various table and data grid related functionalities such as table editing, sorting, filtering, and error messages.

* Added French translation file for plugin-data-viewer (fr.ts)

This commit includes the French translation for the plugin-data-viewer module.

* Add French translation for Data Viewer plugin (fr.ts)

Added French translations for the Data Viewer plugin.

* Added French translation to plugin-datasource-context-switch (fr.ts)

Added French translations for the context switch plugin messages.

* Added French translation to plugin-datasource-transaction-manager (fr.ts)

Added French translations for the transaction manager plugin messages.

* Added French translation to plugin-gis-viewer (fr.ts)

Added French translations for the GIS viewer plugin messages.

* Added French translation to plugin-help (fr.ts)

Added French translations for the help plugin messages.

* Added French translation to plugin-log-viewer (fr.ts)

Added French translations for the log viewer plugin messages.

* Added French translation to plugin-navigation-tree-filters (fr.ts)

Added French translations for the navigation tree filters plugin messages.

* Added French translation to plugin-navigation-tree-rm (fr.ts)

Added French translations for the navigation tree remove plugin messages.

* Added French translation to plugin-navigation-tree (fr.ts)

Added French translations for the navigation tree plugin messages.

* Added French translation to plugin-object-viewer (fr.ts)

Added French translations for the object viewer plugin messages.

* Added French translation to plugin-product (fr.ts)

Added French translations for the product plugin messages.

* Added French translation to plugin-projects (fr.ts)

Added French translations for the projects plugin messages.

* Added French translation to plugin-resource-manager-administration (fr.ts)

Added French translations for the resource manager administration plugin messages.

* Added French translation to plugin-resource-manager-scripts (fr.ts)

Added French translations for the resource manager scripts plugin messages.

* Added French translation to plugin-resource-manager (fr.ts)

Added French translations for the resource manager plugin messages.

* Added French translation to plugin-root (fr.ts)

Added French translations for the root plugin messages.

* Added French translation to plugin-session-expiration (fr.ts)

Added an empty template for French translations for the session expiration plugin messages.

* Added French translation to plugin-settings-administration (fr.ts)

Added French translations for the settings administration plugin messages.

* Added French translation to plugin-settings-panel (fr.ts)

Added French translations for the settings panel plugin messages.

* Added French translation to plugin-sql-editor-navigation-tab-script (fr.ts)

Added French translations for the SQL editor navigation tab script plugin messages.

* Added French translation to plugin-sql-editor-navigation-tab (fr.ts)

Added French translations for the SQL editor navigation tab plugin messages.

* Added French translation to plugin-sql-editor-new (fr.ts)

Added French translations for the new SQL editor plugin messages.

* Added French translation to plugin-sql-editor-screen (fr.ts)

Added French translations for the SQL editor screen plugin messages.

* Added French translation to plugin-sql-editor (fr.ts)

Added French translations for the SQL editor plugin messages.

* Added French translation to plugin-sql-generator (fr.ts)

Added fr.ts to cloudbeaver/webapp/packages/plugin-sql-generator/src/locales

* Added French translation to plugin-task-manager (fr.ts)

Added French translations for the task manager plugin messages.

* Added French translation to plugin-tools-panel (fr.ts)

Added French translations for the tools panel plugin messages.

* Added French translation to plugin-user-profile-settings (fr.ts)

Added French translations for the user profile settings plugin messages.

* Added French translation to plugin-user-profile (fr.ts)

Added French translations for the user profile plugin messages.

* Added French translation to plugin-version-update-administration (fr.ts)

Added French translations for the version update administration plugin messages.

* Added French translation to product-default (fr.ts)

Added French translations for the default product plugin messages.

* CB-5266 registers french localization all over the app

* CB-5266 adds core-app localization from other PR

* CB-5266 shorter translate for log-viewer french action enable label

---------

Co-authored-by: sergeyteleshev <iamsergeyteleshev@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-14 17:52:23 +03:00
Alexey 422e6283df CB-5276 fix: auth fallback (#2712) 2024-06-14 17:30:57 +03:00
0b98569c9e CB-5129. Implemented add and delete logic for user team api (#2695)
* CB-5129. Implemented add and delete logic for user team api

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Alexander Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-06-14 13:59:17 +00:00
Serge Riderandmr-anton-t 340c6e850c CB-2070 DBException refactoring (#2703)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-14 13:41:57 +00:00
AnastasiyaandDaria Marutkina bdfb637633 CB-4870 add tooltip for Disable Table presentation setting; add Germa… (#2704)
* CB-4870 add tooltip for Disable Table presentation setting; add German localization

* CB-4870 Update ru localization

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-06-14 12:36:10 +03:00
Anastasiya df4b88c7e4 dbeaver/dbeaver#17169 Update FireBird driver to version 5.0.4 (#2707) 2024-06-13 19:13:16 +02:00
Alexander SkoblikovandElizabeth e7f6cbd2fc dbeaver/pro#2116 send user deleted event for headless session (#2659)
Co-authored-by: Elizabeth <e1izabeth.k@outlook.com>
2024-06-13 16:50:37 +02:00
Alexander SkoblikovandMashaKorax a84f822124 dbeaver/pro#1803 send permissions update to headless session (#2698)
Co-authored-by: MashaKorax <84867187+MashaKorax@users.noreply.github.com>
2024-06-13 16:00:49 +02:00
Alexey c5399de7af fix: remove extra files (#2701) 2024-06-13 12:34:32 +03:00
a65dff32d6 Cb 4760 add to value panel more clear abstractions and separation of the logic (#2688)
* CB-4760 refactors value panel boolean presentation

* CB-4760 refactors value panel image presentation

* CB-4760 refactors value panel text presentation (part 1)

* CB-4760 refactors value panel text presentation (part 2)

* CB-4760 moves ValuePanel presentation layer to ValuePanel folder

* CB-4760 fixes type in file name

* CB-4760 modifies isBlob truncated logic

* CB-4760 booleanValuePresentation uses actions helper

* CB-4760 reverts value panel helpers location

* CB-4760 reverts getResultSetActions

* CB-4760 add preprocessBooleanValue helper instead of hook

* CB-4760 reverts truncated message isTruncated logic

* CB-4760 cleanup

* CB-4760 cleanup

* CB-4760 test commit for save file history

* CB-4760 test commit for save file history [2]

* CB-4760 test commit for save file history [3]

* CB-4760 moves back ValuePanelPresentation directory to src folder to save git history

* CB-4760 pr fixes

* CB-4760 adds placeholder for non selected elements in boolean value presentation (value panel)

* CB-4760 fixes placeholder translation for non selected elements in boolean value presentation (value panel)

* CB-4760 fix: app restart process

* CB-4760 fix: app restart process

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-06-13 08:04:22 +03:00
alexandmr-anton-t 1c9b4f1ece CB-4706 remove duplicated styles (#2689)
* CB-4705 remove duplicated styles

* CB-4706 pass ref

* CB-4706 review fixes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-13 08:03:39 +03:00
Serge Rider b13b58b589 dbeaver/dbeaver#23203 Optional monitor for nav API (#2687)
* dbeaver/dbeaver#23203 Optional monitor for nav API

* #23203 Local cache progress monitor
2024-06-12 08:56:35 +02:00
alexandmr-anton-t 3d56701dc6 CB-4705 make data viewer model loaders more flexible (#2690)
* CB-4705 make data viewer model loaders more flexible

* CB-4705 review fixes

* CB-4705 remove unused import

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-11 16:51:57 +03:00
AnastasiyaandDaria Marutkina 078c11c657 CB-5268 fix tooltip; add localization (#2699)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-06-11 15:45:25 +03:00
Alexander Skoblikov baffbfd838 CB-5263 fix null projectId in gql (#2697) 2024-06-11 10:06:48 +02:00
serge-rider 0134b79ee0 24.1.1 version bump 2024-06-10 17:44:50 +02:00
serge-rider 791da679fe 24.1.1 version bump 2024-06-10 17:42:07 +02:00
sergeyteleshevandAlexey dc0e3075fa Cb 5198 unit tests (#2674)
* CB-5198 adds errorOf unit test

* CB-5198 adds unit tests for metadata map

* CB-5198 open centered popup covered with unit tests

* CB-5198 removed unused utils helper

* CB-5198 adds unit tests for utf8 to base64 helper

* СB-5198 adds unit tests fro TempMap

* СB-5198 adds unit tests for GlobalConstants

* CB-5198 removes unused helper

* CB-5198 fix: unit tests for global consts

* СB-5198 adds unit tests for ILoadableState

* СB-5198 adds unit tests for CancellablePromise and cancellableTimeout

* CB-5198 unit tests cleanup

* CB-5198 unit tests cleanup

* CB-5198 updates TS references

* CB-5198 adds PR fixes

* CB-5186 cleanup

* CB-5198 adds correct window object mock for global consts tests

* Revert "CB-5198 updates TS references"

This reverts commit 9388477a79.

* CB-5198 fixes PR comments

* CB-5198 fixes PR comments

* CB-4760 fix: metadatamap return non observed values correctly

---------

Co-authored-by: Alexey <wrouds@gmail.com>
2024-06-10 16:52:08 +03:00
f04c2b1452 Cb 5188 support page outdating for object properties table (#2686)
* CB-5188 marks page outdated on onDisconnect event for DBObjectPageResource

* CB-5188 removes properties table error on logout

* Revert "CB-5188 removes properties table error on logout"

This reverts commit aa4d64cc83.

* Revert "CB-5188 marks page outdated on onDisconnect event for DBObjectPageResource"

This reverts commit cdab1b76c9.

* CB-5188 makes cached map resource

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-06-07 16:36:40 +03:00
ce6cfd3e3c CB-5196 Update GraphQL usage (#2671)
Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-07 11:03:52 +00:00
Alexander Skoblikovandkseniaguzeeva 776b6d5c6d CB-5253 store only changed common runtime properties (#2692)
* CB-5253 store only changed common runtime properties

* CB-5253 remove null properties

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-06-07 10:55:11 +00:00
Anastasiya 9a729cb47f Add info about contributors in our readme file (#2691) 2024-06-06 17:24:45 +02:00
c3ae4acdfb Cb 5164 deps update (#2675)
* CB-5164 update sup deps

* CB-5164 update typescript and mobx

* CB-5164 update react

* CB-5164 fix: specify only major versions

* CB-5164 fix class format

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-05 13:29:38 +03:00
4cb171ed19 CB-5180 rename .m -> .module (#2679)
Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-06-04 20:31:45 +03:00
Daria Marutkina b3952e7247 Merge pull request #2685 from dbeaver/cb_readme_duplication
Fix release notes duplication
2024-06-04 14:10:46 +02:00
LonwoLonwo d83822d4ad Fix release notes duplication 2024-06-04 12:59:17 +02:00
Alexey 5579970447 fix: dev mode (#2683) 2024-06-03 16:07:26 +03:00
Daria Marutkina c216a77f23 Merge pull request #2681 from dbeaver/dariamarutkina-patch-2
CB_2410 chore: update README
2024-06-03 13:01:20 +02:00
Anastasiya e7ff007151 Update README.md
fix driver version
2024-06-03 11:29:54 +02:00
Daria Marutkina b62b144ced CB_2410 chore: update README 2024-06-03 11:21:41 +02:00
Alexey 8eaabce90b CB-5228 feat: fast frontend unit tests (#2677)
* fix: try to fix make docker container.sh

* fix: specify correct docker build scripts folder

* fix: validate branch to valid docker tag name

* feat: combined workflows

* feat: add readable names for github actions

* feat: add docker pull command comment

* fix: comment publishing comment with docker instructions

* feat: improve build & test performance

* feat: add option to skip cache

* fix: flush cache

* fix: flush cache

* feat: merge tests and build steps

* fix: github action outputs keys

* feat: add lint job

* feat: change file to trigger lint

* fix: omit webapp path

* fix: trigger lint

* fix: continue  on linting errors

* feat: add publishing container to github docker registry

* feat: add lint status

* chore: re-trigger-lint

* feat: add java checkstyle

* fix: java linting

* fix: github token

* fix: update jave checkstyle action

* chore: simplify frontend lint action

* chore: remove changed java files

* feat: revert lint trigger frontend

* feat: add docker credentials helper

* fix: remove credentials warning

* fix: tests and clean command

* CB-5228 feat: run frontend tests for every build

* fix: clean tasks

* feat: update cli tools
2024-05-31 21:34:57 +03:00
Alexey 6077a52181 fix: docker container build (#2676) 2024-05-30 17:13:01 +03:00
Alexey 7b728311c0 fix: backend build action (#2673)
* fix: backend build action

* chore: update github actions version
2024-05-30 15:24:03 +02:00
Alexey baad9d6f98 chore: add build github actions (#2672)
* chore: add build github actions

* chore: remove docker push

* chore: update cache maven
2024-05-29 19:24:39 +02:00
Ainur d7658d4f93 CB-5161 generate workspace id property on dc side (#2653) 2024-05-27 17:49:21 +00:00
Alexeyandkseniaguzeeva 4e1a593321 CB-5139 domain manager improvements (#2645)
* CB-5139 feat: domain manager improvements

* CB-5139 feat: deployment address verification

* CB-5139 refactor: use computed isDisabled in FormState

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-27 17:45:21 +02:00
Ainurandkseniaguzeeva 57a517111b CB-5158 do not send event to initiator for generating domain (#2655)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-27 15:02:25 +00:00
Alexander SkoblikovandDaria Marutkina c893e476e8 CB-4949 merge runtime and root config in original properties (#2667)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-27 15:01:24 +00:00
sergeyteleshevandDaria Marutkina 0151edf002 CB-4584 fix: loads object properties tabs after relogin correctly + added loader (#2649)
* CB-4584 fix: loads object properties tabs after relogin correctly + added loader

* CB-4584 adds force suspense for Object property table

* CB-4584 trigger object property page outdate on connection being disconnected

* Revert "CB-4584 trigger object property page outdate on connection being disconnected"

This reverts commit 93b844f592.

* CB-4584 fix: object property table reloads pages after connection being disconnected

* Revert "CB-4584 fix: object property table reloads pages after connection being disconnected"

This reverts commit 46f28dc045.

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-27 16:47:57 +03:00
AlexeyandEvgenia Bezborodova f9962b90f9 CB-4820 fix: grid focus sync (#2665)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-27 16:46:25 +03:00
Alexey b1e62d93e4 CB-4090 fix: keep results for editing (#2664) 2024-05-27 16:08:39 +03:00
sergeyteleshevandkseniaguzeeva ea1f3460eb CB-4812 change tooltip text for share creds checkbox in connection creation (#2663)
* CB-4812 change tooltip text for share creds checkbox in connection creation

* СB-4812 fix: makes correct ru text for shared credentials

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-27 12:52:40 +03:00
alex c6127b0ac5 CB-4977 return undefined if parse query call returns zeros (#2662) 2024-05-27 11:49:56 +03:00
1133112a66 CB-5004 Do not spam server while typing query in Sql Editor (#2615)
* CB-5004 adds debounce for sql editor script set and auto complete

* CB-5004 adds correct debounce time for parse script + parses script before its execution

* CB-5004 disable script buttons only for empty sql editor or script being executing

* CB-5004 fix: executes script parsing before get sub query

* CB-5004 reverts getHintProposals throttling

* CB-5004 fix: force launch sql editor script actions and removes delay from format script button

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-05-27 11:49:08 +03:00
serge-rider 965d96c386 Web session read fix (use copy to avoid ConcurrentModificationException) 2024-05-27 09:57:35 +02:00
Alexander Skoblikov 407259b8b2 Revert "CB-5061. remove mandatory parameters for database form (#2650)" (#2661)
This reverts commit 15e5574ed6.
2024-05-24 13:59:29 +00:00
Ainurandkseniaguzeeva c60d513e66 dbeaver/dbeaver-infra#30 add singleton tasks to sm (#2652)
* dbeaver/dbeaver-infra#30 add singleton tasks to sm

* dbeaver/dbeaver-infra#30 move tasks to ee

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-24 15:30:32 +02:00
AlexeyandEvgenia Bezborodova 674627ebea CB-4090 fix: catch throttle errors (#2651)
* CB-4090 fix: catch throttle errors

* CB-4090 fix: catch throttle errors

* CB-4090 fix: detect closed contexts

* CB-4090 fix: close results properly

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-24 15:52:50 +03:00
Alexey 22634c7c19 CB-4812 feat: add app restart hook (#2660) 2024-05-24 19:17:35 +08:00
DenisSinelnikovandDaria Marutkina 15e5574ed6 CB-5061. remove mandatory parameters for database form (#2650)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-24 08:17:15 +00:00
Alexey 95f1a4e6ad CB-4812 chore: update vscode workspace (#2657) 2024-05-24 15:17:52 +08:00
serge-rider 2abe057299 24.1.0 version bump 2024-05-23 19:05:01 +02:00
serge-rider b9b02828dd 24.1.0 version bump 2024-05-23 19:04:23 +02:00
Alexey 691cceb784 CB-4812 fix: infinite loading in error boundary (#2656) 2024-05-23 23:42:12 +08:00
alexandEvgenia Bezborodova 0957684bce CB-4868 extend editor highlight (#2647)
* CB-4868 extend editor highlight

* CB-4868 update colors

* CB-4868 fix variable

* CB-4868 increase contrast ratio

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-23 16:49:43 +03:00
mayerro f9b8e85239 dbeaver/dbeaver-devops#1218 change base image ver to latest lts 2024-05-23 13:07:31 +02:00
alexandEvgenia Bezborodova 1e599fdd88 CB-5160 adjust set to null behaviour (#2648)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-22 10:09:23 +03:00
sergeyteleshev e05dafd710 CB-4853 updates docker containerId view in update instruction for CE (#2646)
* CB-4853 updates docker containerId view in update instruction for CE

* CB-4853 adds const "{your container id}" in the update instruction
2024-05-22 10:08:50 +03:00
sergeyteleshevandDaria Marutkina fac08c1b93 CB-5092 Top navigation bar is not visible (#2616)
* CB-5092 fix: combobox opens on small screens without eating off a bottom space of the window

* CB-5092 does arrow click in separate function

* CB-5092 fix: selectors and nodes context menu do not break layout for small screens

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-22 10:08:26 +03:00
Alexander SkoblikovandDaria Marutkina 77ae1a59d2 CB-4956 restore web session if it expired at login (#2618)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-21 16:52:21 +02:00
alexandDaria Marutkina e3a859fee7 Cb 5133 tree expand focus (#2605)
* CB-5133 make tree expand focusable

* CB-5133 make tree expand clickable

* CB-5133 add label for the expand button

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-21 11:10:47 +03:00
Alexander SkoblikovandEvgenia Bezborodova 72ce16b2e8 CB-931 ldap identity provider (#2609)
* CB-931 ldap identity provider

* CB-931 add bruteforce protection to ldap

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-20 15:05:09 +00:00
Serge Riderandmayerro 7cd22a84c2 dbeaver/dbeaver devops#1201 base java image (#2642)
* dbeaver/dbeaver-devops#1201 Base Java image

* dbeaver/dbeaver-devops#1201 Fix scripts

* dbeaver/dbeaver-devops#1201 hilevel default env var

---------

Co-authored-by: mayerro <roman.kunitskiy@gmail.com>
2024-05-20 16:44:25 +02:00
Alexey eaf19cf1d2 fix: dev mode hot module replacement (#2643) 2024-05-20 22:17:55 +08:00
Evgenia Bezborodova 0dddeb70b2 Merge pull request #2641 from dbeaver/EvgeniaBzzz-patch-1
Update CB README 24-0-5.md
2024-05-20 12:25:43 +03:00
Evgenia Bezborodova d701cb4fbe Update CB README 24-0-5.md 2024-05-20 12:25:15 +03:00
serge-rider 53efa4ef40 Tests fix (windows crlf) 2024-05-19 16:53:54 +02:00
Serge Rider 554c983283 CB-5167 Cleanup and move 2024-05-18 19:58:52 +02:00
Alexey 02d70e1029 Merge pull request #2622 from dbeaver:fix/cb-4978/ignore-images-for-preload
CB-4978 fix: ignore images for preload
2024-05-17 23:46:20 +08:00
Aleksei Potsetsuev 176864c5a5 CB-4978 fix: ignore images for preload 2024-05-17 23:44:22 +08:00
Alexander Skoblikov 14858f13f3 revert field renaming (#2620) 2024-05-17 10:44:14 +00:00
AlexeyandEvgenia Bezborodova 0b27db0b38 CB-5140 fix: loader overlay (#2613)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-17 13:29:23 +03:00
Alexeyandmr-anton-t 10582d1333 CB-5149 fix: app loading (#2617)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-05-17 13:24:58 +03:00
Ainur d606ca0c77 CB-5127 make instance id more readable and add port (#2614) 2024-05-17 08:37:30 +00:00
494101d659 dbeaver/dbeaver-infra#2 (CB-5110) add job for certificate renewal (#2597)
* dbeaver/dbeaver-infra#2 add job for certificate renewal

* CB-5110 feat: deployment domain expiration time info

* CB-5110 feat: display unsuccessful renewal attempt message

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-16 12:53:37 +02:00
Alexander Skoblikovandnaumov 6416486513 Cb 4460 shared query history for the team (#2598)
* CB-5067 team supervisor

* CB-4460 extended team members info api

* CB-5118 support supervisor role

* CB-4460 api fix

* CB-4460 change role name

* CB-4460 gql fix

* CB-4460 fix unexpected team role modification

* CB-4460 fix unexpected team role modification

* CB-4460 fix unexpected team role modification

* CB-4460 fix anonymous preferences

* CB-4460 adjust compare fn


---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
2024-05-14 17:30:26 +00:00
AinurandDenisSinelnikov 6061ec340c CB-5127 web application instance id fix (#2603)
Co-authored-by: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com>
2024-05-14 19:29:09 +02:00
b40646e69b Cb 4931 auth dialog focus (#2602)
* CB-4931 focus first child of the auth form

* CB-4931 focus dialog from inner component

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-14 19:27:09 +02:00
serge-rider 003a89be57 24.0.5 version bump 2024-05-14 18:37:03 +02:00
DenisSinelnikov bbd296f197 CB-5007. Fixed import to mongo (#2612)
* CB-5007. Fixed import to mongo

* CB-5007. Fixed checkstyle
2024-05-14 16:18:08 +00:00
AlexeyandEvgenia Bezborodova 39bfc54ca5 CB-4698 fix: limit grid inline editor (#2608)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-14 19:03:52 +03:00
bac47d20ce CB-5070 refactor: forms design (#2607)
* CB-5070 refactor: forms design

* Merge remote-tracking branch 'origin/devel' into refactor/cb-5070/forms-design

* CB-5070 fix: html semantics

* CB-5070 fix: table header styles

* CB-5070 fix: table header styles

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-14 19:03:11 +03:00
alexandDaria Marutkina 5fce0a544b CB-5085 make errors focusable (#2585)
* CB-5085 make errors focusable

* CB-5085 add lazy import

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-14 16:36:24 +03:00
833dae58ce CB-5060 add beta features config param (#2599)
* CB-5109 add beta features config param

* CB-5109 rename param

* CB-5060 feat: disable beta features

* CB-5109 add param to config file

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-14 09:31:24 +00:00
Alexander SkoblikovandEvgenia Bezborodova 12bc21257d CB-5128 do not store jetty sessions cache in files (#2600)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-14 09:42:42 +02:00
d280171b97 CB-4978 feat: handle app update (#2579)
* CB-4978 feat: handle app update

* CB-4978 fix: app loading status info

* feat: async module loading and preload api

* chore: disable SW in dev env

* CB-4978 feat: improve precaching

* CB-4978 fix: split style chunks in two file

* CB-4978 fix: App rebinding

* CB-4978 fix: styles specificity

* CB-4978 fix: app loading

* CB-4978 fix: styles specificity

* CB-4978 fix: flickering bad positioned loader

* CB-4978 fix: styles specificity

* CB-4978 fix: table presentation scrolls

* CB-4978 chore: add extra error logging

* CB-4978 chore: add extra error logging

* CB-4978 fix: toolbar scrolling

* CB-4978 fix: log viewer empty message

* CB-4978 fix: cell styles

* CB-4978 fix: tabs styles

* CB-4978 fix: tests

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-05-14 09:16:46 +03:00
alexandDaria Marutkina c8ec5716b8 CB-4931 make export and import dialog focusable (#2584)
* CB-4931 make export and import dialog focusable

* CB-4931 always focus the dialog

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-10 16:51:08 +03:00
serge-rider 7045575d95 dbeaver/pro#2800 Code style 2024-05-10 14:57:48 +02:00
AlexeyandDaria Marutkina bdea460218 CB-4837 fix: show in value panel menu button (#2596)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-05-09 13:19:08 +03:00
674c522d55 Cb 5076 remove reshadow leftovers (#2582)
* CB-3960 removes unused SlideBox styles

* CB-3960 makes menu panel reshadowless

* CB-3960 makes menu bar small item reshadowless

* CB-3960 removes reshadow from loaders

* CB-5076 some reshadow

* CB-5076 makes auto refresh reshadowless

* CB-5076 removes reshadow from result set grouping presentation

* CB-5076 makes data grid reshadowless

* CB-5076 makes object viewer table reshadowless

* CB-5076 makes value panel GIS presentation reshadowless

* CB-5076 removes reshadow's all dependencies

* CB-5076 removes ComponentStyles from tsx files

* CB-5076 fixes shortcut dialog titles paddings

* CB-5076 federated auth providers has more space for providers list container

* CB-5076 removes unneeded global from base scss

* CB-5076 import base styles as regular styles (not moduled)

* CB-5076 fix: styles

* CB-5076 chore: add packageManager

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-05-09 13:17:13 +03:00
Alexander Skoblikov d0933b2b17 CB-5050 query translator unit tests (#2590)
* CB-5050 query translator unit tests

* CB-5050 mysql UUID column

* CB-5050 update mysql dialect tests
2024-05-08 19:03:11 +00:00
alexandEvgenia Bezborodova 56143132d6 CB-5077 adjust contrast ratio (#2583)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-05-08 13:56:02 +03:00
Alexander Skoblikov 639f42fa1c CB-4922 bump duck db driver version (#2594) 2024-05-08 09:32:17 +00:00
Alexander Skoblikov c0bbe7fdc5 remove gson map usage (#2593) 2024-05-07 13:29:01 +00:00
Daria Marutkina 64103bc369 Merge pull request #2592 from dbeaver/dariamarutkina-patch-1
CB_2404 chore: update README
2024-05-07 09:49:58 +02:00
Daria Marutkina 87e7f774e9 CB_2404 chore: update README 2024-05-07 09:49:46 +02:00
Ainurandkseniaguzeeva 00cb84c71d CB-5029 close all sessions with event (#2577)
* CB-5029 close all sessions with event

* CB-5029 fixes after review

* CB-5029 remove mac address from instance

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-30 10:38:29 +00:00
sergeyteleshevandmr-anton-t c8457c2004 Cb 3960 migrate core blocks components to css modules (#2578)
* CB-3960 removes unused SlideBox styles

* CB-3960 makes menu panel reshadowless

* CB-3960 makes menu bar small item reshadowless

* CB-3960 removes reshadow from loaders

* fix: loader styles are the same as was

* fix: CB-3960 fix hidden actions in table footer

* fix: menu trigger

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-04-29 21:22:57 +03:00
1f3ae6a508 CB-5020 feat: wait till domain available (#2567)
* CB-5020 feat: wait till domain available

* CB-5020 fix: group styles

* CB-5020 add header to status endpoint

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
2024-04-29 16:26:02 +03:00
DenisSinelnikovandkseniaguzeeva a95f8d021f CB-4513. Added event for execute task success (#2575)
* CB-4513. Added event for execute task success


---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-29 09:43:30 +00:00
alexandEvgenia Bezborodova 6fd824e6a8 CB-4980 cancel file upload (#2573)
* CB-4980 cancel file upload

* CB-4980 use CanceledError instead of message mutation

* CB-4980 review fixes

* CB-4980 do not init cancel on close inside snackbar

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-29 12:16:26 +03:00
serge-rider 836acf879f Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-04-28 12:31:33 +02:00
serge-rider b44840730a GQL schema fix 2024-04-28 12:31:14 +02:00
alexandkseniaguzeeva 1bffe8a28a CB-4982 disable transaction manager for viewer (#2576)
* CB-4982 disable transaction manager for viewer

* CB-4982 change naming

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-26 16:49:32 +03:00
sergeyteleshev 885e423048 fix: adds webpack-dev-middleware resolution for package.json + updates yarn.lock (#2580) 2024-04-26 15:42:27 +03:00
Alexeyandmr-anton-t 8f87ec6618 Fix/cb-5019/components unification (#2560)
* CB-4629 fix: group close button

* CB-4629 fix: value presentation

* CB-4629 fix: tab focusing

* CB-5019 refactor: unify filter components

* CB-5019 fix: group title header styles

* CB-5019 fix: remove duplicated close button for creation forms

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-04-26 06:34:52 +03:00
alexandmr-anton-t 01ea4794ea CB-5033 remove reshadow from log viewer and other packages (#2561)
* CB-5033 remove reshadow from log viewer and other packages

* CB-5033 remove unused code

* CB-5033 migrate small data viewer components to css modules

* CB-5033 review fixes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-04-25 20:25:15 +03:00
alexandEvgenia Bezborodova 7aaee5047e CB-4873 allow set blob data to null (#2574)
* CB-4873 allow set blob data to null

* CB-4873 truncated cells can be set to null

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-25 20:24:50 +03:00
b701d21d89 Cb 4268 force logout (#2549)
* CB-4703. Hide private ssl key, added new parameter to features

* CB-4631. Fix Build

* CB-4703. Hide private ssl key, added new parameter to features

* CB-4631. Fix Build

* CB-4631. Added logic

* CB-4728. Refactor after review

* CB-4268: adds too many session checkbox for local and federated authentication

* CB-4268 ux improve for force session dialog. do not close main popup if confirm dialog rejected

* CB-4268 cleanup

* CB-4268 adds too-many-sessions-plugin to close error of the external window while logging in

* CB-4268 cleanup

* CB-4268 cleanup

* CB-4268 auth dialog: removes unneeded state

* CB-4268. Add logic to force logout for federated users

* CB-4268. Added redirect for Federated users

* CB-4268. Update script

* CB-4268 split force session dialog checkbox for each tab its own instance

* CB-4268 set exceptions for each auth tab individually

* CB-4268 show error for all auth tabs

* CB-4268. Update script, refactor event for user

* CB-4268. Fixed force logout for sso

* CB-4268. Fixed class cast exception

* CB-4268. Refactor after review

* Revert "CB-4268 show error for all auth tabs"

This reverts commit 996bdfebdb.

* Revert "CB-4268 set exceptions for each auth tab individually"

This reverts commit dbeca03a31.

* Revert "CB-4268 split force session dialog checkbox for each tab its own instance"

This reverts commit cf79208d41.

* CB-4268 show error for all auth dialog tabs

* CB-4268 resets error state on auth dialog tab change

* CB-4268 fix: reset error state only on tab change

* CB-4268 auth login function cleanup

* CB-4268. Refactor after review, cleanup code

* CB-4268 removes too-many-sessions plugin

* CB-4268 removes unneeded translations

* CB-4268 fix: show login button only for non federated auth tabs

* CB-4268 refactor: reset error on switching auth mode

* CB-4268 stop resetting error with flag for auth dialog

* CB-4268 stop resetting error with flag for auth dialog (reset error default true)

* CB-4268 rename to ssoError.html

* CB-4268. Rename parameter for html

* CB-4268. Revert

* CB-4854. Refactor after review

* CB-4854. Refactor after review

* CB-4268 adds tooltip for force logout checkbox

* CB-4268 changes force sessions popup title to shorter version

---------

Co-authored-by: sergeyteleshev <iamsergeyteleshev@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-25 13:20:24 +00:00
sergeyteleshev 426650076a CB-4947 increases webpack-dev-middle version (#2572) 2024-04-25 13:37:29 +03:00
alexandDaria Marutkina 035d2fe156 CB-5034 translate aria label in MenuActionElement (#2565)
* CB-5034 translate aria label in MenuActionElement

* CB-5034 translate additional tokens

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-25 13:15:41 +03:00
Alexey d70470b853 CB-5010 fix: ensure session opened (#2566) 2024-04-25 13:14:56 +03:00
AinurandDaria Marutkina 368c9e2179 CB-4796 update drivers for trino, oracle and sqlite (#2568)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-25 09:47:24 +00:00
Alexander Skoblikovandkseniaguzeeva 6ad136f2fa CB-4282 filter redundant '/' in event (#2571)
* CB-4282 filter redundant '/' in event

* CB-4282 update copyright

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-24 17:33:11 +02:00
DenisSinelnikovandDaria Marutkina 00f56e8c58 CB-4854. Change success message (#2569)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-24 17:32:41 +02:00
serge-rider ccefc5cb9b 24.0.4 version bump 2024-04-24 15:06:01 +02:00
Georgii 2a612aea63 INF-52 improvements (#2564) 2024-04-24 12:25:33 +02:00
sergeyteleshev b1349c7a07 CB-5036 disables uploading files for readonly tables for cells (#2570)
* CB-5036 disables uploading files for readonly tables for cells

* CB-5036 cleanup
2024-04-24 12:06:18 +02:00
alexandDaria Marutkina 99b9f6f193 CB-4932 add alt text to the logo (#2559)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-23 09:00:56 +03:00
51ef899922 Cb 4270 row counter add cancel button for big tables (#2545)
* CB-4270 adds cancel option for load total count of rows in table

* CB-4270 adds ui for load total count of rows in table

* CB-4270 fix: task cancels in a true way

* CB-4270 cleanup

* CB-4270 cancel load total count on close table tab

* CB-4270 cancel load total count on close sql editor tab

* CB-4270 fix: cancel close only task if it is not already cancelled

* CB-4270 chore: tasks -> cancelLoadTotalCountTasks

* CB-4270 stops counting rows when tab closes

* CB-4270 reverts incorrect calls of cancelLoadTotalCount

* CB-4270 reverts ToolsActions unneeded props

* CB-4270 pr fixes

* СB-4270 cancel load total count for refresh action

* CB-4270 fix: place cancelLoadTotalCount to DatabaseDataSource

* CB-4270 fix: cancel load rows in refresh data in data source

* CB-4270 cancels load on close result set tab

* CB-4270 refactor: move cancelLoadTotalCount to resultsetdatasource

* CB-4270 cancel load total count execute only for resultsetdatasource

* CB-4270 adds constraint for TableFooterRowCount

* CB-4270 fix: do not load new value if cancelled rows loading

* CB-4270 cleanup

* Revert "CB-4270 cleanup"

This reverts commit f8bffa253a.

* CB-4270 pr fixes

* CB-4270 pr fixes

* CB-4270 deletes cross icon icon

* CB-4270 DataSources has correct tree of calls for cancel and dispose functions

* CB-4270 cleanup

* chore: add experimental cancellable promise implementation

* CB-4270 pr fixes: remove unneeded disposes + close results in close result tab flow

* CB-4270 removes closeResults abstraction leak in ResultSetDataSource extended classes

* CB-4270 removes unused context in data sources

* CB-4270 adds loader for CancelTotalCountAction on cancel task action

* CB-4270 cancel row count job fix

* CB-4270 cancel row counter with notification

* CB-4270 pr fixes

* CB-4270 pr fixes

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
2024-04-23 08:59:58 +03:00
Daria Marutkina acde2c5b8b Merge pull request #2563 from dbeaver/dariamarutkina-patch-2
CB_2403 chore: update README
2024-04-22 11:11:23 +02:00
Daria Marutkina 49247ade5d CB_2403 chore: update README 2024-04-22 11:11:11 +02:00
Alexey e355cdc953 fix: vscode update launch task (#2558) 2024-04-17 21:41:48 +08:00
Alexey 2198d5f69f fix: remove extra space for settings (#2557) 2024-04-17 21:36:47 +08:00
Alexey 1e373d9ff4 CB-5026 fix: root menu check (#2556) 2024-04-17 12:29:21 +03:00
Georgiiandserge-rider 8aeacfeb4e INF-36 [wip] allow downloading artifacts from p2 repositories (#2528)
Co-authored-by: serge-rider <serge@dbeaver.com>
2024-04-17 05:33:38 +02:00
3a304b1902 Cb 4631 backup database (#2536)
* CB-4631. Added logic for database backup h2

* CB-4631. Refactor after review, added information about postgres database to backuper

* CB-4631. Refactor after review, added information about postgres database to backuper

* CB-4703. Refactor after review

* CB-4631. Added flag to config for do backup

* CB-4631. Added flag to config for do backup

* CB-4631. renamed env parameters

* CB-4631. Revert schema version

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-16 20:08:39 +02:00
sergeyteleshev 916055eb6d fix: remove-uneeded-interface-prop (#2554) 2024-04-16 20:04:53 +02:00
91d83fdac8 CB-4767 generate domains using deployment manager (#2515)
* CB-4767 fix: group close styles

* CB-4767 chore: log only errors and warnings for webpack dev server

* CB-4767 chore: deprecate useController

* CB-4767 feat: an option to throw exceptions with useAutoLoad

* CB-4767 fix: rethrow exception from interrupted load of resource

* CB-4767 fix: replace useController with useResource

* CB-4767 feat: add schema validation for MetadataMap

* CB-4767 fix: wrap administration page with TabPanel

* CB-4767 feat: support for contents style in TabPanel

* CB-4767 feat: support for schema for useTabLocalState

* CB-4767 feat: support async form submitting

* CB-4767 feat: add skip localization

* CB-4767 fix: types

* CB-4767 feat: support administration tab state

* CB-4767 feat: form part getter API

* CB-4767 feat: async status read API

* CB-4770 clear all auth tokens when new domain is generated

* CB-4770 save common config api

* CB-4770 fixes after review

* CB-4770 fix sql query

* CB-4770 delete certificate on certbot and get workspace id

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
2024-04-16 17:33:39 +00:00
3e71a7a6ce Cb 4629 end user preferences (#2546)
* CB-4629 feat: enable user settings UI

* CB-4629 feat: localization

* CB-4629 feat: restore default settings

* CB-4629 feat: preferences menu

* CB-4629 chore: update ts references

* CB-4629 user preference store

* CB-4629 fix anonymous preferences

* CB-4629 nullable annotation

* CB-4629 refactor: context menu API

* CB-4629 fix: tools panel styles

* CB-4629 fix: remove outline for tab list

* CB-4629 fix: hide account tab in anonymous mode

* CB-4629 anonymous preferences

* CB-4629 read anonymous user parameters

* CB-4629 fix: zod validation and localization

* CB-4629 use websession preference store in completion context

* CB-4629 fix: revert tools styles

---------

Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-16 17:25:57 +00:00
Ainurandmr-anton-t 9051abe90b CB-4996 recreate rm controller for user session (#2551)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-04-16 11:44:55 +00:00
Alexander Skoblikovandmr-anton-t 9a46bb2a88 CB-4502 dpi sql execute support (#2542)
* CB-4502 wip

* CB-4502 DPI: read data from container and script execution support

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-04-15 15:29:57 +00:00
alexandEvgenia Bezborodova c7ed9f3b5b CB-4933 focus snackbar on open (#2543)
* CB-4933 focus snackbar on open

* CB-4933 make notifications accessible for tab navigation

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-15 18:28:40 +03:00
alexandkseniaguzeeva e45267c17c CB-4358 omit patch version (#2548)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-15 14:54:53 +03:00
AlexeyandDaria Marutkina 8f29b67ba6 CB-4841 fix: concurrent tree update (#2539)
* CB-4841 fix: concurrent tree update

* CB-4841 chore: tree re-render optimization

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-12 16:40:31 +03:00
Alexey 0550cb9982 CB-4699 fix: prevent cell copy in editing mode (#2547) 2024-04-12 16:39:19 +03:00
alexandEvgenia Bezborodova 530af6dfed CB-4967 check that connection is not loading new data (#2541)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-11 13:39:48 +03:00
2a610c3f50 Cb 4911 add license headers with git hooks (#2504)
* adds husky with license script

* fix: license can pass file not fitted to provided FILES_PATH pattern

* license: notify user for updated files with new license header

* moves husky to frontend directory

* adds check for unstaged files with license

* change pre commit to pre push

* test: remove license from value panel

* Revert "test: remove license from value panel"

This reverts commit b690b75c6b.

* adds postinstall

* test: remove license from value panel [2]

* Revert "test: remove license from value panel [2]"

This reverts commit ea86fd3c57.

* sets back precommit

* CB-4911 validate missed license

* CB-4911 fix linter

* CB-4911 check license line by line

* CB-4911 feat: use node for license check

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-04-10 14:08:20 +03:00
09dfae412c Replace bash process using java process instead of creating a sub process (#1452)
This enables docker to do a graceful shutdown of the container, because the java process gets notified that it should be terminated.

Co-authored-by: Anastasiya <45152336+LonwoLonwo@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-09 16:59:33 +00:00
serge-rider d605e09ef4 24.0.3 version bump 2024-04-09 17:52:03 +02:00
serge-rider 2dc97fb706 24.0.3 version bump 2024-04-09 17:51:34 +02:00
sergeyteleshevandEvgenia Bezborodova 9e3e4322a3 Cb 4178 te cloud storage improvements (#2532)
* CB-4178 chore: makes tree nodes names visible in react dev tools

* CB-4178 adds validation for loading files in cloud storage

* CB-4178 pr fixes

* CB-4178 pr fixes

* CB-4178 code cleanup

* CB-4178 selectFiles can return empty array

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-09 16:35:13 +03:00
alexandEvgenia Bezborodova 433eaacd24 CB-4960 remove data import button from query sources (#2529)
* CB-4960 remove data import button from query sources

* CB-4960 show import button only in container data source

* CB-4960 show import button on json tab

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-09 12:53:02 +03:00
Alexey fec9e856f6 fix: deprecated settings tests (#2538) 2024-04-09 17:49:34 +08:00
alexandDaria Marutkina 28714a628f CB-4966 remove unused detail from the timer icon (#2533)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-09 09:27:04 +03:00
Ainur fd82b24e5f CB-4917 remove applications from configuration controller and fix deserialization (#2531) 2024-04-08 09:18:54 +00:00
serge-rider d34d59ee6c Revert "CB-4603 Set global default user team ID"
This reverts commit b09a85d324.
2024-04-03 12:04:40 +02:00
serge-rider b09a85d324 CB-4603 Set global default user team ID 2024-04-03 10:36:19 +02:00
serge-rider 5ac7ece108 CB-4603 Set global default user team ID 2024-04-03 10:28:12 +02:00
serge-rider 449c31bf44 24.0.2 version bump 2024-04-02 20:24:10 +02:00
32b4e4ec19 CB-3330 add data import plugin (#2506)
* CB-3330 add data import plugin

* CB-3330 add mock api

* CB-3330 pass processor id

* CB-3330 remove extra code

* CB-3330 simplify logic, allow import only one file

* CB-3330. Implemented import data to table

* CB-3330 replace mocks with api

* CB-3330 add references

* CB-3330. Parsing request, added xml, xls

* CB-3330 support new settings

* CB-3330 use getter

* CB-3330 add svg icons

* CB-3330 pass arguments in handleImport fn

* CB-3330 remove extra fn wrapper

* CB-3330. Fix build

* CB-3330. Fix build

* CB-3330. Fix import

* CB-3330. Fixed import

* CB-3300 fix: frontend can build

* CB-3330. Refactor after review

* CB-3330. Refactor after review, delete temp file after import

* CB-3330. Refactor after review

* CB-3330. Refactor after review

* CB-3330. Added log message

* CB-3330. Added response for task

* CB-3330 fix icon and button shadow

* CB-3330. Refactor response value

* CB-3330. Refactor response value

* CB-3330. delete unused imports

* CB-3330 run additional task after file import

* CB-3330 always allow data import for admins

* CB-3330 import resource as module

---------

Co-authored-by: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com>
Co-authored-by: denis.sinelnikov <denis.sinelnikov@dbeaver.com>
Co-authored-by: sergeyteleshev <iamsergeyteleshev@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-02 16:51:27 +00:00
101d26158b CB-4603. Refactor searching by group, include default group for all s… (#2440)
* CB-4603. Refactor searching by group, include default group for all sql query with team

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-02 16:50:21 +00:00
Ainurandkseniaguzeeva 8b5aac0093 CB-4829 connection cache same ids fix (#2491)
* CB-4829 connection cache same ids fix

* CB-4829 find connection info with project id fix

* CB-4829 add project id to gql functions

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-04-02 16:47:48 +00:00
Serge RiderandDaria Marutkina 5fd847f209 CB-4924 Fix CVE-2022-45868. Remove web interface from H2 driver (#2526)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-02 17:23:37 +02:00
Alexander Skoblikov 2936b14aed CB-4500 preference to enable env variables resolving (#2522)
* CB-4500 preference to enable env variables resolving

* CB-4500 save systemVariablesResolvingEnabled to runtime config
2024-04-02 15:15:15 +00:00
sergeyteleshev 6dfbbecd59 CB-4943: fix: Value Panel has correct layout with new groups styles (#2524) 2024-04-02 15:52:58 +02:00
sergeyteleshevandDaria Marutkina 44b6f8a3ae Cb 4548 sql editor resultsets can be closed one by one only when execute sql statement has been used for several queries (#2503)
* CB-4548 fix: removes all result tabs on "close all" action

* CB-4548 adds "close all of the same query" action for sql result tabs

* Revert "CB-4548 adds "close all of the same query" action for sql result tabs"

This reverts commit 453664e41c.

* CB-4548 adds close all of the same group

* CB-4548 adds handleCloseTabGroup with SqlResultTabService

* CB-4548 sql editor bootstrap cleanup

* СB-4548 group tabs logic moved logic to sql-editor-plugin

* СB-4548 cleanup

* CB-4548 adds ACTION_TAB_CLOSE_SQL_RESULT_GROUP to the end of the tabs

* CB-4548 closes group tabs via tabs context close function (to save highlight tab logic)

* CB-4548 pr fixes

* CB-4548 code cleanup

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-04-02 11:55:42 +02:00
AlexeyandEvgenia Bezborodova 9f46e49e01 CB-4776 fix: input default value handling (#2518)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-04-02 11:44:17 +02:00
Alexander SkoblikovandDaria Marutkina 552163e6ee CB-4836 convert max idle time to seconds (#2514)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-29 15:31:42 +00:00
Alexey 517db739ae CB-4938 CB-4937 fix: metadata editor and shortcuts (#2520) 2024-03-29 17:38:18 +03:00
Ainur 8004db0f8b CB-4919 update results fix (#2509) 2024-03-28 17:00:45 +00:00
AinurandEvgenia Bezborodova 66f6ccb245 CB-4569 set default database when getting driver props (#2512)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-28 16:59:53 +00:00
77f531ddac Update trino driver to 438 (#2372)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Anastasiya <45152336+LonwoLonwo@users.noreply.github.com>
2024-03-28 16:58:42 +00:00
Cheng PanandDaria Marutkina 192da2c0d6 Support Apache Kyuubi as built-in datasource (#1336)
* Add Kyuubi driver JDBC driver 1.9.0
---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-28 16:58:06 +00:00
sergeyteleshevandEvgenia Bezborodova f3c6cf94d7 CB-4030 makes clear log viewer button sticky to the top-right corner (#2505)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-28 17:32:06 +03:00
eaa26dfe52 CB-4619 user scope settings (#2471)
* CB-4619 feat: update gql schema

* CB-4808 bulk update user parameters

* CB-4808 param type fix

* CB-4619 feat: updateUserPreferences API


* CB-4619 refactor: settings api

* CB-4619 refactor: move file

* CB-4619 refactor: settings api

* CB-4619 fix: pr review

* CB-4619 refactor: remove web-based product settings

* CB-4619 fix: after pr review

* CB-4619 refactor: move product conf to cloudbeaver conf

* CB-4619 fix: hide settings bar and log exception with changing session language

* CB-4619 fix: revert after merge

* CB-4808 new settings api

* CB-4808 update product.conf format

* CB-4808 update product.conf format

* CB-4619 feat: support server provided settings

* CB-4619 feat: prettify settings

* CB-4619 chore: map sql editor settings group

* CB-4808 add use short/long object name settings to CloudBeaver

* CB-4808 update default product.conf

* CB-4808 mode short/long settings to SQLModelPreferences

* CB-4808 review fix

* CB-4619 refactor: unit tests

* CB-4619 fix: prevent websocket opening spam

* CB-4619 fix: dependencies

* CB-4619 fix: remove extra theme loading

* CB-4619 fix: rename settings alias resolver file

* CB-4619 fix: after review

* CB-4619 fix conflicts

* CB-4619 rename server property

* CB-4619 remove shortname property

* CB-4619 fix legacy product conf reading

* CB-4619 merge root and runtime configurations

* CB-4619 chore: remove log viewer setting

* CB-4619 integer fields with env variables fix

* CB-4619 fix: property naming

* CB-4619 fix: parseJSONFlat null values

* CB-4619 fix: settings loading

* CB-4619 fix: save only actual settings

---------

Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-28 10:30:52 +00:00
AnastasiyaandDaria Marutkina b54dd5380d CB-4913 fix contact site link in the Product Information (#2507)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-27 14:44:49 +03:00
alexandDaria Marutkina f548406446 CB-4676 change delete button text to cancel (#2499)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-27 14:44:34 +03:00
ad37e89ecb CB-4686 add new client event for updating session info (#2462)
* CB-4810 add new client event for updating session info

* CB-4810 update request parameters on creating web session

* CB-4810 deprecate update session gql functions

* CB-4810 fix tests

* CB-4810 add params to session state event

* CB-4810 add params to gql schema

* CB-4686 feat: migrates touch session from REST to WebSockets

* CB-4686 fix: do not open websocket if session is expired

* Revert "CB-4686 fix: do not open websocket if session is expired"

This reverts commit 1f6ba77998.

* CB-4686 setData uses performUpdate for the SessionResource

* CB-4686 unsubscribes from the websocket when session expired event arrived

* Revert "CB-4686 unsubscribes from the websocket when session expired event arrived"

This reverts commit 7aeffffc67.

* CB-4810 rename client event

* CB-4686 pr fixes

* CB-4686 makes onDataOutdated execution manual

* CB-4686 fix: onDataOutdated.execute executes in the end of the performUpdate

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-27 10:45:09 +00:00
sergeyteleshevandmr-anton-t a6a01c2896 CB-4910-broken-layout-for-login-identity-providers-form (#2498)
* authorization-federated-auth-providers-has-correct-layout

* Revert "authorization-federated-auth-providers-has-correct-layout"

This reverts commit cfd97b045d.

* fix: configList layout with container

* CB-4910 centers buttons in configuration list

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-27 09:01:29 +03:00
Ainurandmr-anton-t cae7699a48 Cb 4280 refactor cb application configuration logic (#2242)
* CB-4280 prettify reading configuration file

* CB-4280 serialize db config, remove it from te

* CB-4280 extract configs from app classes

* CB-4280 resolve conflicts

* CB-4280 fixes after review

* CB-4280 fix copyrights

* CB-4280 add comments

* CB-4280 resolve conflicts

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-26 15:12:49 +00:00
Daria Marutkina d9150180f9 Merge pull request #2497 from dbeaver/dariamarutkina-patch-1
CB_2401 chore: update README
2024-03-25 17:31:30 +01:00
Daria Marutkina 95b7f35228 CB_2401 chore: update README 2024-03-25 17:31:18 +01:00
alexandmr-anton-t 1fd1ebeecf CB-4074 transform metadata editor footer to the new context menu (#2490)
* CB-4074 transform metadata editor footer to the new context menu

* CB-4074 use existing data context for nodes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-25 16:07:04 +01:00
Serge RiderandEvgenia Bezborodova 4daf1efe49 CB-4903 Clickhouse driver version update (#2494)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-25 14:03:05 +01:00
alexandmr-anton-t affbe444a0 CB-4707 move connection shield logic to separate component (#2478)
* CB-4707 move connection shield logic to separate component

* CB-4707 use lazy import

* CB-4707 revert interface

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 20:33:34 +03:00
sergeyteleshevands.teleshev e9163b8a2b cleans up the frontend ts references (#2493)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
2024-03-22 12:38:24 +03:00
alexandmr-anton-t b3f7d85687 CB-4884 migrate sql editor to css modules (#2487)
* CB-4884 migrate sql editor to css modules

* CB-4884 review fixes

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 07:37:05 +03:00
e033a63f5c CB-4657 removes reshadow from plugin-connections-administration (#2484)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 07:32:32 +03:00
d4a9c6595e CB-4656 removes reshadow from plugin-connections (#2481)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 07:32:08 +03:00
7f5fb194c5 CB-4655 removes reshadow from plugin-authentication-administration (#2485)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 07:31:45 +03:00
2d44a492fc CB-4686 removes reshadow from core-ui (#2489)
* CB-4686 removes reshadow from core-ui

* CB-4283 pr fixes

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-22 07:30:47 +03:00
ebb517318b CB-4471 removes reshadow from plugin-administration (#2479)
* CB-4471 removes reshadow from plugin-administration

* CB-4471 fill is has higher style priority

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-21 20:34:37 +03:00
23de1131b9 CB-4654 removes reshadow from plugin-authentication (#2480)
* CB-4654 removes reshadow from plugin-authentication

* CB-4654 ConfigurationList uses container component

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-21 20:32:06 +03:00
alexandmr-anton-t a5911223ef CB-4859 migrate some styles from driver properties table and metadata… (#2469)
* CB-4859 migrate some styles from driver properties table and metadata editor

* CB-4859 use useS instead of clsx

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-20 14:13:19 +03:00
Alexey 37e4c699fe chore: update vscode configs (#2483) 2024-03-20 13:34:25 +03:00
Alexander Skoblikovandkseniaguzeeva f7b9dd188f CB-4867 remote preference store (#2474)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-03-19 13:13:01 +00:00
alex d4543efb24 CB-1084 fix ts version (#2477) 2024-03-19 13:30:42 +01:00
ShadelessFox 06089af0d0 dbeaver/dbeaver#12430 Make session invalidation working for simple cases (#2463) 2024-03-19 09:19:55 +01:00
AlexeyandEvgenia Bezborodova eea26a5942 CB-4222 feat: read blob data for value panel (#2422)
* CB-4222 feat: read blob data for value panel

* CB-4222 chore: review

* CB-4222 fix: text value presentation for binary files

* CB-4222 fix: hide hex and base64 text presentation for non-binary data

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-19 10:38:57 +03:00
493d5a8161 CB-4469 tabs reshadow refactor (#2448)
* CB-4469 adds fundaments for refactor: baseTabStyles, baseTabActionStyles, verticalRotatedStyles + some implementations

* CB-4469 adds license for new styles

* CB-4469 tabs-box reshadowless

* CB-4469 updated references

* CB-4469 adds license + fix build

* CB-4469 adds license

* CB-4469 fix tab icon position

* CB-4469 object folders reshadowless

* CB-4469 makes vertical side tabs for sql editor and table reshadowless

* CB-4469 adds TabPanelListNew + ValuePanel tabs reshadowless

* CB-4469 adds reshadowless tabs in admin settings + object viewer tabs also

* СB-4479 fix: removed deprecated styles from some vertical tabs

* CB-4469 chore: removed unused borderTabStyles

* CB-4469 adds reshadowless tabs for side bars

* CB-4469 fix: reshadowless tabs has no redundant styles

* CB-4469 makes auth dialog reshadowless

* CB-4469 make reshadowless admin user settings

* CB-4469 makes TeamForm reshadowless

* CB-4469 makes UserForm reshadowless

* CB-4469 makes ConnectionForm reshadowless + removes deprecated styles from bunch of tabs

* CB-4469 makes reshadowless TextValuePresentation in ValuePanel

* CB-4469 makes reshadowless user info form

* CB-4469 removed redundant styles from user info form

* CB-4469 makes sql result tabs reshadowless

* CB-4469 makes export data tabs reshadowless

* CB-4469 makes create connection for templates reshadowless

* CB-4469 deletes deprecated tabs files

* CB-4469 update ts references

* CB-4469 adds missing licenses

* CB-4469 removes deprecated styles

* CB-4469 removes background for tabs in value panel

* CB-4469 removes done to do

* CB-4469 removes done to do

* CB-4469 removes css duplication from ValuePanelEditorTabs

* CB-4469 correct styles context for table viewer

* CB-4469 adds scontext outer of tabstate component

* CB-4469 navigation tabs bar tabsBox has outline: none

* CB-4469 fix: object viewer has correct background colors

* CB-4469 removed unneened comment

* CB-4469 chore: admin page context spreaded correctly in layout

* CB-4469 refactor cleanup

* CB-4469: adds tabList style for registry

* CB-4469 fix: correct tabs underline for create connection/template

* CB-4469 remove nested styles from useS() hooks in components

* CB-4469 removes redundant styles from ObjectFolders useS() hook

* CB-4469 fix: correct imports for core-ui tabs elements

* CB-4469 chore: TabMenu keeps old name

* CB-4469 refactor: isolate module styles from tab registry ones

* CB-4469 refactor: isolate module styles from tab registry ones [2]

* CB-4469 refactor: isolate module styles from tab registry ones [3]

* CB-4469 refactor: isolate module styles from tab registry ones [4]

* CB-4469 refactor: isolate module styles from tab registry ones [5]

* CB-4469 fix: users administration tabs has correct size

* CB-4469 marks tabsBox as deprecated component

* CB-4469 tabPanel refactor

* CB-4469 refactor: Tab styles decomposed to smaller extendable parts

* CB-4469 refactor: component directory - styles -> shared

* CB-4469 refactor: adds TabList styles for underline, vertical and vertical-rotated tabs

* CB-4469 refactor: adds to vertical rotated tabs module styles for icon and title

* CB-4469 refactor: rename baseTab to just tab

* CB-4469 refactor: adds TabList styles for SqlResultTabs registry

* CB-4469 chore: use fill component for createConntection

* CB-4469 fix: saves file history for SqlEditor and UsersAdministration

* CB-4469 fix: saves file history for SqlEditorTabs

* СB-4469 chore: code cleanup

* СB-4469 chore: code cleanup

* CB-4469: removed style dependency from tab component

* CB-4469 uses fill component instead of css styles in CreateConnection

* CB-4469 always show tabOuter class for autotests

* CB-4469 code cleanup

* CB-4469 fix: revert tab component to get back close icon for scripts/datasets in TE

* CB-4469 chore: rename administration files

* CB-4469 adds tab actions component

* CB-4469 refactor: removes tab actions style dep from Tab component

* CB-4469 removes duplication of menu logic in tabs

* CB-4469 adds predefined tab and tabList registries all over the app

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-18 16:44:02 +01:00
5bf4278c65 Cb 1084 transactions (#2449)
* CB-4806 transactions api

* CB-1084 add commit mode plugin

* CB-1084 rename plugin

* CB-4806 add is auto commit property to web context

* CB-1084 add gql queries

* CB-1084 add loaders

* CB-4806 transactions for update results

* CB-4806 fix text

* CB-1084 pass execution context via extensions

* CB-1084 handle errors

* CB-1084 get connection before the task execution

* CB-1084 grab connection from transaction context

* CB-1084 support execution context provider for the object viewer

* CB-1084 refresh context manually

* CB-1084 check options panel status

* CB-1084 move transaction logic to the ConnectionExecutionContext

* CB-4806 make project id required

* CB-1084 make actions naming more unique

* CB-1084 remove success flag

* CB-1084 add plugin to default product

* CB-1084 show confirm dialog

* CB-1084 always fire disconnect through executor

* CB-1084 adjust behaviour

* CB-1084 add more explicit check

* CB-1084 interrupt disconnect if commit fails

---------

Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-18 14:33:57 +00:00
ShadelessFox 947a6a1eab Merge pull request #2475 from dbeaver/dbeaver/pro#2552-delete-profile
Dbeaver/pro#2552 delete profile
2024-03-18 14:00:37 +01:00
AlexeyandDaria Marutkina 4c9a6d2257 CB-3884 fix: tree empty flickering (#2457)
* CB-3884 fix: tree empty flickering

* CB-3884 fix: blink empty folder message in tree

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-18 15:26:30 +03:00
Sergei Kovalchukandkseniaguzeeva e78155a5d3 Dbeaver/pro#2552 [TE] deleted profiles appear again after app launch (#2429)
* dbeaver/pro#2552 [TE] deleted profiles appear again after app launch

Api fixed for store entire list of profiles

* dbeaver/pro#2552 [TE] deleted profiles appear again after app launch

Remove un used import

* dbeaver/pro#2552 [TE] deleted profiles appear again after app launch

Fixed api

* dbeaver/pro#2552 [TE] deleted profiles appear again after app launch

---------

Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-03-18 12:21:53 +01:00
kseniaguzeeva 5c2b65dde6 Merge branch 'devel' into dbeaver/pro#2552-delete-profile 2024-03-18 06:20:35 +03:00
Ainurandmr-anton-t 071824188f CB-4568 drop unused internal tables (#2468)
* CB-4568 drop unused internal tables

* CB-4568 execute dialect specific queries only if file exists

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-17 13:25:31 +03:00
Alexander SkoblikovandDaria Marutkina e72b40f4ae CB-4528 Snowflake SSO auth (#2470)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-15 17:31:17 +00:00
alexandDaria Marutkina 25b895c7aa CB-3977 remove connection from resource on driver delete (#2428)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-15 13:31:09 +03:00
Alexander SkoblikovandEvgenia Bezborodova 826d0c6f60 CB-4819 update composite documents attribute values (#2452)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-14 10:19:05 +00:00
serge-rider 1f8ed6231a Copyrights and release date updates 2024-03-14 08:51:10 +01:00
serge-rider 2d58c01257 24.0.1 version bump 2024-03-13 16:27:26 +01:00
serge-rider a28f4eb1e7 24.0.1 version bump 2024-03-13 16:26:29 +01:00
alexandDaria Marutkina 08702465b9 Cb 3989 sub folder deletion (#2444)
* CB-3989 preload all folders to validate folder name

* CB-3989 preload project

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-13 11:35:00 +03:00
alexandDaria Marutkina 70dafdc895 CB-4761 remove rtl mode from menu (#2424)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-03-12 18:08:33 +01:00
Alexey a1f5aab1f7 chore: update vscode workspace (#2466) 2024-03-12 23:33:41 +08:00
Ainurandnaumov c5930852b9 CB-4696 truncate string value fix (#2456)
* CB-4696 truncate content string value fix

* CB-4696 extend isText check to show quota message

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
2024-03-12 15:55:19 +01:00
serge-rider b5f3b0effa Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-03-12 15:39:01 +01:00
serge-rider 7f7d05dc46 dbeaver/pro#2522 Use custom launcher for all products 2024-03-12 15:37:08 +01:00
Anastasiya 2cacb3e1fa CB-4842 change brute force exception message (#2465) 2024-03-12 13:48:09 +00:00
Anastasiya 8adb27f7b1 CB-4839 fix reverse-proxy logout URL label (#2461) 2024-03-12 13:47:46 +00:00
f8de956a69 CB-4765 adds to object viewer rename table handler (#2425)
* CB-4765 adds to object viewer rename table handler

* CB-4765 code cleanup

* CB-4765 handle node rename runs in mobx action

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-12 16:01:44 +03:00
ShadelessFox b736de0329 dbeaver/pro#2589 Project reference fix (#2460) 2024-03-12 11:36:15 +01:00
Sergei Kovalchuk 794c10237f Merge branch 'devel' into dbeaver/pro#2552-delete-profile 2024-03-07 15:50:40 +01:00
Alexeyandmr-anton-t e13368db00 CB-4818 refactor: update NPM dependencies (#2450)
* CB-4818 refactor: update NPM dependencies

* CB-4818 chore: update react-data-grid fork

* CB-4818 fix: tests

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-07 14:32:43 +03:00
Ainur c3a85b6103 CB-4824 return network handlers for some embedded drivers (#2453) 2024-03-07 10:08:08 +00:00
Ainur 4bae903d74 CB-4816 refresh disabled drivers after loading runtime config (#2455)
* CB-4816 refresh disabled drivers after loading runtime config

* CB-4816 refresh drivers config only when starting server
2024-03-07 09:29:02 +00:00
Anastasiya 56cd55e62f Fix typo in the echo command (#2458) 2024-03-07 10:16:15 +01:00
Sergei Kovalchuk 89b831bb9e dbeaver/pro#2552 [TE] deleted profiles appear again after app launch 2024-03-06 14:23:29 +01:00
9934ed9787 CB-4743 adds html sanitizer (#2420)
* CB-4743 adds html sanitizer

* CB-4743 adds license to sanitizeHtml

* CB-4743 do not use sanitize to purify the json line data

* CB-4743 fix: toSafeHtmlString test correct cases

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-05 22:14:35 +03:00
alexandmr-anton-t 23328e7ea4 CB-4601 use more specific prop name (#2443)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-03-05 22:13:59 +03:00
Serge Rider 6d4bb860ae Dbeaver/pro#2523 annotations (#2447)
* dbeaver/pro#2523 Model annotations

* dbeaver/pro#2523 Model annotations
2024-03-05 18:27:47 +01:00
Alexey ab01bc5384 CB-4801 fix: remove baseFeatures setting (#2446) 2024-03-05 16:34:33 +08:00
Daria Marutkina 8e75f7cfe2 Merge pull request #2445 from dbeaver/dariamarutkina-patch-1
CB_2400 chore: update README
2024-03-04 16:41:07 +01:00
Daria Marutkina ab58f8570d CB_2400 chore: update README 2024-03-04 16:40:54 +01:00
alexandEvgenia Bezborodova 2894b21960 CB-4779 mark rows and columns getters as computed values (#2430)
* CB-4779 mark rows and columns getters as computed values

* CB-4779 wrap keys in computed

* CB-4779 remove unused import

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-03-01 12:23:54 +01:00
DenisSinelnikovandDenisSinelnikov b5dceef605 CB-4792. Change attribute names for rp identity provider (#2435)
Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
2024-03-01 10:57:11 +00:00
62510fe18d Cb 4777 te log viewer access denied and anonymous access restricted errors after login (#2431)
* CB-4777 fix: removes an "anonymous access restricted" error from log viewer

* CB-4777 fix: isUserAvailable for userInfoService

* CB-4777 chore: code cleanup

* CB-4777 do not call rm api if not authorized in sm

* CB-4777 revert changes

* CB-4777 revert changes

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
2024-02-29 17:06:57 +00:00
Sergei Kovalchuk 5889c753e6 dbeaver/pro#2552 [TE] deleted profiles appear again after app launch
Fixed api
2024-02-29 11:50:38 +01:00
Sergei Kovalchuk b4ccae2a0a dbeaver/pro#2552 [TE] deleted profiles appear again after app launch
Remove un used import
2024-02-29 11:33:40 +01:00
Sergei Kovalchuk 82750e3ed5 dbeaver/pro#2552 [TE] deleted profiles appear again after app launch
Api fixed for store entire list of profiles
2024-02-29 11:31:39 +01:00
Alexander SkoblikovandDaria Marutkina 9fe091d352 CB-4773 show license validation error (#2423)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-28 17:40:13 +00:00
Alexey ac75405f21 chore: update browserlist
* chore: update browserlist
2024-02-28 09:56:32 +03:00
AlexeyandDaria Marutkina e4e8fb92ae CB-4681 fix: content downloading in value panel (#2417)
* CB-4681 fix: content downloading in value panel

* CB-4681 fix: review

* CB-4681 fix: review

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-27 23:53:06 +03:00
e27d5d1de6 CB-4731. Fixed duplicate configuration server (#2411)
* CB-4731. Fixed duplicate configuration server

* CB-4731. Refactor after review

* CB-4731. Refactor after review

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-27 15:33:52 +00:00
AlexeyandDaria Marutkina a5f53cb271 CB-4740 fix(plugin-codemirror6): value equal check (#2414)
* CB-4740 fix(plugin-codemirror6): value equal check

* CB-4740 fix(plugin-codemirror6): incoming value equal comparison

* CB-4740 fix(plugin-codemirror6): initial cursor position restoration

* CB-4740 fix: sql editor mode detection

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-27 17:35:12 +03:00
b7a4cfac72 CB-4634 result set panel saves presentation info into the context (#2412)
* CB-4634 result set panel saves presentation info into the context

* CB-4634 adds license to SqlResultSetPanel styles

* Revert "CB-4634 result set panel saves presentation info into the context"

This reverts commit 5bf0d22e4e.

* CB-4634 adds to result set tab cache for value/grouping actions so divider behave alright

* CB-4634 fix: throw an error if result group was not found

* CB-4634 adds zod validation to tab restore in SqlEditor

* CB-4634 adds license to zod.scheme

* CB-4634 adds SqlEditorTabState uses interface generated with Zod

* CB-4634 chore: shceme -> schema

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-27 13:23:12 +01:00
AnastasiyaandMashaKorax 9bc66479a1 dbeaver/pro#2510 upgrade PG driver to 42.7.2 (#2407)
Co-authored-by: MashaKorax <84867187+MashaKorax@users.noreply.github.com>
2024-02-26 17:48:08 +01:00
Alexander Skoblikovandmr-anton-t a4f50c22ae CB-4747 force auth anonymous session (#2416)
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-02-26 15:35:09 +00:00
alexandDaria Marutkina 5febf26b5a CB-4700 allow administrators to copy data (#2389)
* CB-4700 allow administrators to copy data

* CB-4700 allow editing for admin

* CB-4700 change desc message

* CB-4700 change if logic

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-26 16:38:37 +03:00
c0c4e1870a CB-4436 update session only in touchSession (#2377)
* CB-4436 update session only in touchSession

* CB-4346 adds session touch for user actions

* CB-4346 adds core-activity package

* CB-4346 fix: mobx version core-activity package

* CB-4346 ClientActivityService cleanup

* CB-4346 ClientActivityService cleanup [2]

* CB-4346 fix: client activity function contexts bind

* CB-4346 useClientActivity cleanup

* CB-4346 removed unneeded deps

* CB-4346 session warning dialog props renaming

* CB-4364 adds client activity service setsActivity method

* CB-4346 activity timers refactor

* CB-4346 adds min time for session expire setting

* CB-4346 adds update client activity each 300ms

* CB-4346 touchSession logic moved to SessionExpiredService

* СB-4346 session expire service uses session resource to touchSession

* CB-4346 code cleanup

* CB-4346 removed unused activity package from plugin session expiration

* CB-4346 SessionExpireService - removed cycle dependency

* CB-4346 code cleanup

* CB-4346 update session state if it is invalid

* CB-4346 removed arrow function from useClientActivity

* Revert "CB-4346 SessionExpireService - removed cycle dependency"

This reverts commit adba2d5eed.

* CB-4346 touchSession logic moved from SessionExpiredService to SessionResource because of cycle dependency

* CB-4346 chore: core-activity -> core-client-activity renaming

* CB-4346 chore: vars renaming

* CB-4346 refactor: removed force from sessionResource.touchSession()

* CB-4346 adds SessionTouchService

* CB-4346 chore: SESSION_EXPIRE_MIN_TIME const new name

* CB-4346 sessionTouchService license

* CB-4346 uses SessionTouchService as Dependency

* CB-4346 pr fixes

* CB-4346 adds core-localization to plugin-session-expiration

* CB-4346 adds core coreClientActivityManifest to unit tests

* CB-4346 updates ts references

* CB-4436 new update session gql api

* CB-4346 adds updateSession API call

* CB-4346 code cleanup sessionResource

* CB-4346 do not send state event for not authorized session

* CB-4346 chore: update session info with event

* CB-4346 adds update activity on touch (tablets, phones support)

* CB-4346 add debug log

* CB-4346 force update session on create

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-23 17:02:04 +00:00
38987293a3 Cb 4590 prevent search field autocomplete (#2398)
* CB-4590 prevent autocomplete for search in connection-form filter

* CB-4590 fixes search autocomplete for devtools

* CB-4590 removed reshadow from plugin-devtools

* CB-4590 disable autocomplete for all passwords

* Revert "CB-4590 disable autocomplete for all passwords"

This reverts commit 4c20f46140.

* CB-4590 disable auto complete for auth provider passwords

* CB-4590 adds type="search" for all filters

* CB-4590 disables autocomplete for most of authentication forms (except local and ssh database)

* CB-4590 disables autocomplete for create database ssh tunnel passphrase

* CB-4590 better readability for props

* Revert "CB-4590 better readability for props"

This reverts commit 83f6f99995.

* Revert "CB-4590 disables autocomplete for create database ssh tunnel passphrase"

This reverts commit 06554215ac.

* Revert "CB-4590 disables autocomplete for most of authentication forms (except local and ssh database)"

This reverts commit c915f5bee1.

* CB-4590 chore: x for the input type search disabled in forms

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-23 18:49:42 +03:00
888b29c637 Cb 4694 te admin can assign his own team (#2391)
* CB-4716 admin can manage his own team

* CB-4717 allow team assigning in distributed mode

---------

Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-02-23 14:47:39 +00:00
9b050aa186 CB-4677. Refactor after review (#2387)
* CB-4677. Refactor after review

* CB-4677. Refactor after review

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-23 14:46:25 +00:00
0877d07d04 Cb 4430 file extension for export (#2405)
* CB-4430. Fixed file extention for export file json

* CB-4430. Fixed file extention for export file json

* CB-4430. Fixed checkstyle

* CB-4430. Refactor after review

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-23 14:45:26 +00:00
Alexeyandmr-anton-t 8c2b2e584e CB-4732 fix: fields auto hide behaviour (#2409)
* CB-4732 fix: fields auto hide behaviour

* CB-4732 fix: uncontrolled input state tracking

* CB-4732 fix: types

* CB-4732 fix(core-blocks): input default value handling

---------

Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-02-23 17:13:25 +03:00
serge-rider 701ff77f45 Azure and GCPdeps update 2024-02-23 13:45:24 +01:00
serge-rider b520333ddb 24.0.0 version bump 2024-02-23 09:56:30 +01:00
9ba77f112d CB-4719 fix: sql editor shows lock icon only for scripts (not datasets and etc) (#2404)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-22 14:31:35 +03:00
379e0cb3db CB-4685 disable default theme setting (temporary) (#2399)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-21 18:17:00 +03:00
79aaf010f3 CB-4688. Ignore empty X-Role header parameter, hide role param. (#2386)
* CB-4688. Ignore empty X-Role header parameter, hide role param.

* CB-4688. Refactor after review

* CB-4688. Refactor after review

* CB-4688. Refactor after review

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-21 17:44:04 +03:00
mayer 4f7d9751ec Devops 1040 pull common repo dep (#2403)
* dbeaver/dbeaver-devops#1040 added common build dependency

* dbeaver/dbeaver-devops#1040 added common build dependency bat
2024-02-21 12:50:11 +01:00
alexandEvgenia Bezborodova 307808a396 CB-4606 apply min validation to the fetch settings (#2396)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-21 14:01:15 +03:00
Alexander Skoblikov 5182ea1238 complex secret id (#2401)
* complex secret id

* unique secret id
2024-02-20 22:03:57 +03:00
sergeyteleshev 5d77ec02da Merge pull request #2400 from dbeaver/fix/identity-providers-config
fix: identity providers opens after ui creds branch merged to devel
2024-02-20 19:38:09 +01:00
s.teleshev 2401af1d7e fix: identity providers opens after ui creds branch merged to devel 2024-02-20 19:34:48 +01:00
serge-rider 7ec6edb31e dbeaver/pro#2452 Session auth info model 2024-02-20 18:15:34 +01:00
2b90eb038e CB-4561 te UI dynamic connection credentials based on the users team (#2381)
* CB-4598 npe fix

* CB-4561 refactor: connection info resource

* CB-4561 refactor: connection info resource

* CB-4561 load credentials from secret in initConnection

* CB-4561 merge devel

* CB-4561 allow initial team secrets test

* CB-4561 remove ability to use any secret in test connection

* CB-4561 feat: shared credentials management

* CB-4561 feat: connection secret authentication

* CB-4561 little fix

* CB-4561 feat: shared credentials

* CB-4561 chore: remove save credentials checkbox for shared credentials

* CB-4561 fix: send saved state for shared connection credentials

* CB-4561 feat: change shared secret authentication description

* CB-4561 fix: pr review comments

* CB-4561 fix: disable connection test for shared connections in distributed env

* CB-4561 fix: types

---------

Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com>
2024-02-20 16:42:46 +01:00
mayer 662d991aca dbeaver/dbeaver-devops#1040 added common build dependency (#2397) 2024-02-20 14:07:51 +01:00
Daria Marutkina 67be5d9cc4 Merge pull request #2395 from dbeaver/dariamarutkina-patch-5
Update README.md
2024-02-20 11:04:37 +01:00
Daria Marutkina 615eeb997d Update README.md 2024-02-20 11:04:25 +01:00
Daria Marutkina afda51d452 Merge pull request #2394 from dbeaver/dariamarutkina-patch-4
CB_2335 chore: update README
2024-02-20 10:34:28 +01:00
Daria Marutkina c70b9d2053 CB_2335 chore: update README 2024-02-20 10:34:12 +01:00
DenisSinelnikovandDenisSinelnikov 6d6ab69c52 CB-4683. Change delimiter for reverse proxy group (#2385)
* CB-4683. Change delimiter for reverse proxy group

* CB-4683. Refactor after review. Added new parameter team delimiter for reverse proxy identity provider,

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
2024-02-19 19:31:20 +03:00
alex 9c54fb10f1 CB-4695 show delete button in footer if deleting is true (#2383) 2024-02-19 18:51:48 +03:00
serge-rider a569e8eb0f Project deps update 2024-02-14 08:48:56 +01:00
8f01d49f5f CB-3563 cloudbeaver preference store (#2370)
* CB-3563 cloudbeaver preference store

* CB-3563 fix cb custom drivers folder

* CB-3563 fix default property initialization

* CB-3563 :feat adds proposal insert table setting to admins settings

* CB-3563 feat: sqlEditorService has field canInsertAlias

* CB-3563 adds plain keys to the settings

* CB-3563 removes redundant alias resolver for sqlEditor

* CB-3563 fix: sql editor ctrl + z does not cause an error while SQL script typing

* CB-3563 pr fixes

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-13 20:33:52 +03:00
cb897343bd Cb 4457 subcollections firestore (#2338)
* CB-4457. Add api for read subcollections firestore

* CB-4457. Move firestore to ee module

* CB-4457. Move firestore to ee module

* CB-4457. Added annotations for firestore

* CB-4457. Added metaData

* CB-4457. Fixed build

* CB-4457 add hasChildrenCollection flag

* CB-4457. Add new resultsRow

* CB-4457. Renamed SQLResultRowMetaData parameters

* CB-4457 add rows with metadata to schema

* CB-4457. Fix gql

* CB-4457. Added logic to get Firestore subcollection

* CB-4457. Refactor result, rename gql, added new type to return gql

* CB-4457. Revert list to map

* CB-4457. Get Subcollections info

* CB-4457. Refactor code

* Added sceleton for insert subcollection

* CB-4457. Added isSupportsDataFilter flag for subcollection

* CB-4457 add locales

* CB-4457. Added isSupportsDataFilter flag for subcollection

* CB-4457. Added update/insert logic for subcollection

* CB-4457 support collection editing

* CB-4457. Refactor after review, moved hierarchical model to ee.

* CB-4457 add SerializableKey

* CB-4457 keep only new rowsWithMetaData api

* CB-4457 review fixes

* CB-4457 review fixes

* CB-4457. Refactor after review. Added logic for delete

* CB-4457 pass metadata in deleted rows

* CB-4457 check row for undefined

* CB-4457 pass metadata when editing json

* CB-4457. Refactor edit, fix icons

* CB-4457. Refactor makeDocumentInputValue, created new method for locator

* CB-4457 try to get the current metadata for row

* CB-4457 clear cache on result update

* CB-4457 remove extra check

* CB-4457. Fixed npe

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-13 18:29:22 +01:00
Alexander SkoblikovandEvgenia Bezborodova eea72bd467 CB-4673 validate default team exists (#2374)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-13 20:08:46 +03:00
b62b8d178d Cb 4375 support idle connection closing (#2368)
* CB-4365. Support idle connection closing

* CB-4375. Fix connection time

* CB-4375. Fixed checkstyle

* CB-4375. Refactor after review

* CB-4375. Refactor after review

* CB-4375. Refactor after review

* CB-4375. Refactor after review

* CB-4375. Refactor after review

* CB-4375. Refactor after review, change event type

* CB-4375. Refactor after review

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-13 20:08:29 +03:00
alexandDaria Marutkina 9828b1de1e CB-4567 add disableCopyData settings (#2378)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-13 13:45:05 +01:00
Alexey 325cbef1d8 chore: update version 23.3.5
* chore: update version 23.3.5
2024-02-13 10:47:34 +03:00
serge-rider 1e13e65205 23.3.5 version bump 2024-02-12 18:04:26 +01:00
alexandDaria Marutkina 426ab15bfc CB-4651 change wrap lines icons (#2371)
* CB-4651 change wrap lines icons

* CB-4651 remove icons from icons.svg

* CB-4651 add different size of icons

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-12 13:06:40 +03:00
898e7d9b9d CB-4570 add correct limits for text and blob columns in value panel (#2351)
* CB-4570 add correct limits for text and blob columns in value panel

* CB-4570 pr fixes

* CB-4570 adds shorter versions of limit messages

* CB-4570 pr fixes

* CB-4570 pr fixes

* CB-4570 code cleanup

* CB-4570 show more button moved to quota container

* CB-4570 code cleanup

* CB-4570 code cleanup

* CB-4570 quota placeholder to module css

* CB-4570 refactor: limit info in content action

* CB-4570 cleanup

* CB-4570 refactor: result set binary file implementation

* CB-4570 code clean

* CB-4570 adds QuotaPlaceholder getLimitInfo logic

* CB-4570 adds quota placeholder logic to not render when size is not truncated

* CB-4570 fix: shouldShowPasteButton reverted

* CB-4570 fix: show quota placeholder correctly

* CB-4570 code clean

* Revert "CB-4570 fix: show quota placeholder correctly"

This reverts commit d86b35e47a.

* CB-4570 fix: truncate image and text depending on current value panel presentation tab id

* Revert "Revert "CB-4570 fix: show quota placeholder correctly""

This reverts commit d5df008e89.

* CB-4570 code clean

* CB-4570 chore: dataContent has no image mentions

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-09 19:31:56 +03:00
alexandDaria Marutkina 1d497fe14f CB-4628 remove unused logic (#2367)
* CB-4628 remove unused logic

* CB-4628 remove onClean callback

* CB-4628 add applyDisabled prop

* CB-4628 check if apply is enabled on enter

* CB-4628 add disable actions prop

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-02-09 19:08:36 +03:00
Alexander Skoblikovandkseniaguzeeva 3965f16330 CB-4498 secrets cleanup (#2352)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-02-09 17:52:59 +03:00
Alexander Skoblikov 3891eed4a9 CB-4636 fix initial data configuration (#2358) 2024-02-09 14:24:18 +03:00
Serge Rider f980ee80b2 Merge branch 'devel' of https://github.com/dbeaver/cloudbeaver into devel 2024-02-08 13:44:24 +01:00
Serge Rider 1816016cf3 Repo dependencies 2024-02-08 13:43:07 +01:00
sergeyteleshev 9e051d5158 Merge pull request #2366 from dbeaver/CB-4633-unit-tests-licenses
CB-4633 adds licenses to unit tests
2024-02-07 17:38:27 +01:00
s.teleshev 7437b9e5eb CB-4633 adds licenses to unit tests 2024-02-07 17:37:41 +01:00
sergeyteleshevands.teleshev d96b9e94ad Cb 4633 unit tests for utils (#2357)
* CB-4633 blobToBase64 unit tests

* СB-4633 importLazyComponent tests

* CB-4633 OrderedMap unit tests

* CB-4633 removed test time limit from blobToBase64 test

* CB-4633 adds to ordered map unit tests for edge cases

* CB-4633 importLazy moved to core-blocks

* CB-4633 adds update-ts-references

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
2024-02-07 19:31:19 +03:00
7eba02ac1f CB-4535. Remove Ability to edit all users team (#2341)
* CB-4535. Remove Ability to edit all users team

* CB-4536. Fixed test

* CB-4536. Refactor after review.

* CB-4536. Refactor after review

* CB-4536. Refactor after review

* CB-4536. Refactor after review

* CB-4536. Refactor after review

* CB-4536. Refactor after review.

* CB-4536. Auto filled default group for all user when application is started

* CB-4536. Refactor after review

* CB-4536. Fixed update empty list

* CB-4536 feat: display default user team info

* CB-4536 chore: code cleanup

---------

Co-authored-by: DenisSinelnikov <denis.sinelnikov@dbaever.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
2024-02-07 18:15:42 +03:00
Serge Rider e285ad0279 CB-4645 Null descriptions fix (#2359) 2024-02-07 17:56:49 +03:00
AnastasiyaandMashaKorax 6b2f314383 dbeaver/pro#2420 update MariaDB driver to 3.3.2 (#2362)
Co-authored-by: MashaKorax <84867187+MashaKorax@users.noreply.github.com>
2024-02-07 14:12:00 +03:00
Serge Riderandkseniaguzeeva 09e5141e37 dbeaver/pro#2403 AWS secret controller stub (#2350)
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-02-07 14:07:55 +03:00
Alexander Skoblikov 0c03d201a8 CB-4596 fix http cookies (#2363) 2024-02-06 16:50:46 +03:00
sergeyteleshevands.teleshev d96e0b812d CB-4400 removed project margin styles to prevent tree jump on DnD (#2344)
* CB-4400 removed project margin styles to prevent tree jump on DnD

* CB-4400 removed DND jump lag for connection/script/dataset trees

* CB-4400 top tree project has margin

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
2024-02-06 09:52:35 +03:00
Alexander Skoblikov 98d7d1f0d5 update sql to support oracle (#2355) 2024-02-05 15:49:01 +03:00
590830cbb5 CB-4605 fix: sql editor shows datasets panels correctly (#2347)
* CB-4605 fix: sql editor shows datasets panels correctly

* Revert "CB-4605 fix: sql editor shows datasets panels correctly"

This reverts commit 5e2afc5296.

* CB-4605 fix: TE edit dataset works fine with new dividers

* CB-4605 revert sqleditor displayed editors state

* CB-4605 removed sqlEditor hack to open full size dataset

* Revert "CB-4605 removed sqlEditor hack to open full size dataset"

This reverts commit 7ad98e42b4.

* CB-4605 sqlEditor works as it was for EE and TE

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-05 15:47:23 +03:00
Daria Marutkina 4d04f4b2ee Merge pull request #2356 from dbeaver/dariamarutkina-patch-3
CB_2334 chore: update README
2024-02-05 13:15:57 +01:00
Daria Marutkina 8cdfb12ecc CB_2334 chore: update README 2024-02-05 13:15:47 +01:00
Alexander Skoblikov 30e0bad784 fix schema version (#2354) 2024-02-05 13:41:18 +03:00
Serge RiderandEvgenia Bezborodova f8e74f926c CB-4617 NPE fix (#2349)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-02-05 12:31:30 +03:00
Alexey b7ab8b13d6 CB-4611 fix: revert font size changes (#2348) 2024-02-01 17:16:12 +03:00
8585af7f1a Cb 4429 change divider behavior (#2335)
* CB-4429 adds visible buttons for resizers

* CB-4429 adds auto margin to dividers

* CB-4429 fix initial auto margin

* CB-4429 adds auto margins without hook

* CB-4429 split controls cleanup

* CB-4429 hide content if panel minimized

* CB-4429 remove ts ignore

* CB-4429 Pane cleanup

* CB-4429 update go-split

* CB-4429 pane renders null if it is minimized splitter

* CV-4429 removed children memoization in Pane component

* CB-4429 fix: hide content if maximized pane

* CB-4429 chore: update go-split version

* CB-4429 update go-split lib

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Aleksei Potsetsuev <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-31 20:34:52 +03:00
fdde4348a2 CB-3703 save product configuration from ui (#2334)
* CB-4560 api for saving product configuration

* CB-4560 save product config in te

* CB-4560 move update product config to mutations

* CB-3703 feat: extend base components

* CB-3703 feat: settings editor

* CB-3703 chore: review fixes

* CB-3703 chore: pr review

* CB-3703 feat: update server configuration icon

* CB-4560 add events

* CB-3703 fix: localization

* CB-3703 chore: localization

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-31 20:33:05 +03:00
11adc7d3d6 dbeaver/pro#2404 Revert legacy Clickhouse driver (#2337)
Co-authored-by: Matvey16 <82543000+Matvey16@users.noreply.github.com>
Co-authored-by: Ainur <59531286+yagudin10@users.noreply.github.com>
2024-01-31 19:23:05 +03:00
alexandEvgenia Bezborodova d79ab9593e CB-4489 increase class priority (#2345)
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-31 19:18:23 +03:00
alexandDaria Marutkina cf2d647aea CB-4591 do not require password if its saved (#2342)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-31 19:17:48 +03:00
Alexey a698363dfd chore: update javaConfig (#2346) 2024-01-31 18:25:00 +03:00
a2094a4d90 CB-3834 secret controller redesign (#2343)
* CB-3834 Secret manager database schema

* CB-3834 add credentials storage flat to teams

* CB-3834 subject based secrets

---------

Co-authored-by: Serge Rider <serge@jkiss.org>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-01-31 16:52:00 +03:00
Alexander SkoblikovandDaria Marutkina 71a61047e2 CB-4257 validate required features for providers (#2322)
* CB-4257 validate required features for providers

* CB-4257 rename types - categories

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-31 11:23:58 +03:00
alexandDaria Marutkina cd7ffe6c2e CB-4504 transform coordinates according to the chosen srid (#2331)
* CB-4504 transform coordinates according to the chosen srid

* CB-4504 add licence

* CB-4504 move types to dev deps

---------

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-30 17:22:52 +01:00
Ainur 7a45f2feea CB-4476 data source folder send event fix (#2340) 2024-01-30 17:46:26 +03:00
Serge Rider ba208ad024 INF-10 Include dbeaver-common in build 2024-01-29 17:16:08 +01:00
sergeyteleshevands.teleshev 04236b949b CB-4531 fix: connect to the tables/connections without red screen error (has connection already) (#2339)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
2024-01-29 15:35:20 +03:00
Serge Rider 1e4cbd60b8 23.3.4 version bump 2024-01-26 11:46:08 +01:00
Serge Rider a33c17a997 23.3.4 version bump 2024-01-26 11:43:39 +01:00
f41c485ba0 Cb 4382 anonymous access restricted error (#2302)
* CB-4382 fixed anonymous error

* CB-4382 move EAdminPermission to root-resources in order to FeatureResource can import it

* CB-4282 EAdminPermission moved to core-root

* CB-4382 update-ts-references

* СB-4382 removed unneeded deps in packages

* CB-4282 revert needed deps to be present

* CB-4382 reverted popperjs for plugin-data-spreadsheet-new

* CB-4382 TE error fix for fast opening admin server settings

* CB-4382 update yarn lock

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-01-25 17:42:58 +03:00
AlexeyandDaria Marutkina ba3ca5e28a CB-4236 feat: script reopen (#2324)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-25 17:40:31 +03:00
Serge RiderandDaria Marutkina 3c4f4a988d CB-4573 PostgreSQL driver updated to 42.5.2 (#2332)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-25 13:43:46 +03:00
alexandEvgenia Bezborodova 3e93752d53 CB-4134 adjust cursor position (#2299)
* CB-4134 adjust cursor position

* CB-4134 pass controlled cursor to the editor

* CB-4134 do not trim value

* CB-4134 revert const history

* CB-4134 review fixes

* CB-4134 remove onUpdate method

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-25 10:47:47 +03:00
Mikhailov Grigorii 8df248bfde #984 Changed to 23.10 ubuntu (#2329) 2024-01-24 18:13:49 +03:00
6553132019 CB-4023 sets equal window sizes on edit dataset (#2325)
* CB-4023 sets equal window sizes on edit dataset

* СB-4023 sql editor sets size on displayed editors change

* CB-4023 sqlEditor isEditorEmpty flag for SqlEditor

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-01-24 17:37:56 +03:00
Daria Marutkina bcda5ebbd8 Merge pull request #2330 from dbeaver/dariamarutkina-patch-2
CB_2333 chore: update
2024-01-24 13:10:21 +01:00
Daria Marutkina 53fca74dfe CB_2333 chore: update 2024-01-24 13:10:07 +01:00
Alexey 92b5d47232 chore: fix build broken gql (#2328) 2024-01-24 12:46:40 +03:00
Alexey b0a34c7d75 CB-4541 refactor: tree (#2326)
* CB-4541 refactor: tree

* CB-4541 chore: revert test code
2024-01-24 12:31:48 +03:00
47f1267957 Cb 4523 remove identity providers tab (#2310)
* CB-4523 move identity providers from plugin-authentication-administration

* CB-4523 remove * dep

---------

Co-authored-by: Alexey <wrouds@gmail.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-24 09:42:03 +03:00
AlexeyandEvgenia Bezborodova 544f3a8dd3 CB-4539 fix: value panel auto type detection (#2320)
* CB-4539 fix: value panel auto type detection

* CB-4539 feat: add wrap lines action

* CB-4539 fix: remove extra button

* CB-4539 chore: enable line wrapping by default

* CB-4539 fix: quota message

---------

Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
2024-01-23 19:35:00 +03:00
4cdb3ac30b Cb 4389 convert reverse proxy (#2300)
* CB-4389. Converted reverse proxy to identity provider

* CB-4039 build logout redirect link on backend side

* CB-4039 fix return value

* CB-4389. Added auto configuration for Reverse proxy if its enabled on ce, fixed typo, rename plugin parameters

* CB-4389. Added check for already exist configuration

* CB-4389. Refactor after review

* CB-4039 adds logout with context for Okta Identity Provider

* CB-4039 backward compatibility fix

* CB-4039 add since annotation

* CB-4039 api return type fix

* CB-4039 logout extended

* CB-4389. Refactor after review

* CB-4389. Refactor after review

* CB-4039 okta logout redirect moved to AuthenticationService

* CB-4039 remove windowService dep

* CB-4039 removes old logic of identity provider logout links

* CB-4039 okta review changes

* CB-4389. Merge logout logic into branch

* CB-4389. Delete param after review

* CB-4389. Converted reverse proxy to identity provider

* CB-4389. Added auto configuration for Reverse proxy if its enabled on ce, fixed typo, rename plugin parameters

* CB-4389. Added check for already exist configuration

* CB-4389. Refactor after review

* CB-4389. Refactor after review

* CB-4389. Refactor after review

* CB-4039 adds logout with context for Okta Identity Provider

* CB-4039 okta logout redirect moved to AuthenticationService

* CB-4389. Merge logout logic into branch

* CB-4389. Delete param after review

* CB-4546 shows hex/base64 only on blob column selection (#2314)

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>

* CB-4389. Fix logout redirect and npe for logout parameter

* CB-4389. Fix logout redirect and npe for logout parameter

* CB-4389. Change version

---------

Co-authored-by: Aleksandr Skoblikov <aleksandr.skoblikov@dbeaver.com>
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: sergeyteleshev <iamsergeyteleshev@gmail.com>
2024-01-23 19:15:34 +03:00
AinurandDaria Marutkina f4fd603297 CB-4441 mariadb fix clear auth attempt info (#2313)
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-23 19:14:51 +03:00
76454a352d CB-4546 shows hex/base64 only on blob column selection (#2314)
Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-22 18:38:19 +03:00
35b625c1df CB-3015: adds an fadeout animation & min close delay time to all noti… (#2306)
* CB-3015: adds an fadeout animation & min close delay time to all notifications

* CB-3015 revert closeDelay in NotificationItem

* CB-3015 shows notification if it is not closed during first 300ms

* Revert "CB-3015 shows notification if it is not closed during first 300ms"

This reverts commit 184aae708e.

* CB-3015 show process snack bar with delay fix

* CB-3015 snackbar removed potential deps bug

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
2024-01-22 18:31:43 +03:00
bc7cd3b217 CB-4289 add file name param for data export (#2308)
* CB-4289 add file name param for data export

* CB-4289 pass file name based on context

* CB-4289 use existing export action

---------

Co-authored-by: naumov <iamemptyhuh@gmail.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-01-22 18:30:36 +03:00
sergeyteleshevands.teleshev 3274988d4a CB-4551 unit tests form timestampToDate and cacheValue (#2316)
* CB-4551 unit tests form timestampToDate and cacheValue

* CB-4551 cacheValue added one more test case

* CB-4551 removed unused plugins for tests

* CB-4551 all tests has UTC timezone

* СB-4551 fix: icons has no data-test id

---------

Co-authored-by: s.teleshev <s.teleshev@mu.se>
2024-01-22 14:10:23 +03:00
Evgenia Bezborodova 38e5fa0cbb Merge pull request #2321 from dbeaver/EvgeniaBzzz-patch-2
CB_2333: update README.md
2024-01-22 13:36:19 +03:00
Evgenia Bezborodova 75413db6a5 CB_2333: update README.md 2024-01-22 13:36:04 +03:00
Alexey 6b124072e9 chore: performance improvements (#2319) 2024-01-21 16:18:35 +03:00
a230dac79e Cb 4403 map ad roles (#2295)
* CB-4403. Implement import with auth roles for AD

* CB-4403 feat: add auth role provided flag

* CB-4403. Refactor after review, added auto configurable flag

* CB-4403. Refactor after review

* CB-4403. Refactor after review

* CB-4403. Refactor after review

* CB-4403. Fixed set teams for imported users

* CB-4403. Refactor after review

* CB-4403. Refactor after review

---------

Co-authored-by: Denis Sinelnikov <denis.sinelnikov@dbeaver.com>
Co-authored-by: DenisSinelnikov <142215442+DenisSinelnikov@users.noreply.github.com>
Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com>
2024-01-19 21:11:39 +03:00
alex 10c1b374fc Cb 4534 fix circle deps (#2312)
* CB-4534 fix empty password validation (#2311)

* CB-4534 move password policy hook to core blocks
2024-01-18 16:45:04 +01:00
alex 80ce154b03 CB-4534 do not validate empty password, required attribute will (#2309)
* CB-4534 do not validate empty password, required attribute will

* CB-4534 remove trim
2024-01-18 14:19:38 +01:00
3625 changed files with 71444 additions and 44245 deletions
-35
View File
@@ -1,35 +0,0 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/java
{
"name": "Java",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/java:1-17-bookworm",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "true",
"installGradle": "false"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/node:1": {}
},
"hostRequirements": {
"cpus": 8,
"memory": "16gb",
"storage": "64gb"
}
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "java -version",
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
+42
View File
@@ -0,0 +1,42 @@
name: Backend Build
on:
# Allows you to reuse workflows by referencing their YAML files
workflow_call:
jobs:
build-backend:
name: Build
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
path: cloudbeaver
- name: Clone Deps Repositories
uses: dbeaver/github-actions/clone-repositories@devel
with:
project_deps_path: "./cloudbeaver/project.deps"
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "17"
cache: maven
- uses: dbeaver/github-actions/install-maven@devel
- name: Run build script
run: ./build-backend.sh
shell: bash
working-directory: ./cloudbeaver/deploy
# - name: Archive build artifacts
# uses: actions/upload-artifact@v4
# with:
# name: backend-build-artifacts
# path: cloudbeaver/deploy/cloudbeaver
# if-no-files-found: error
+14
View File
@@ -0,0 +1,14 @@
name: Cleanup
on:
pull_request:
types: [closed]
push:
branches:
- devel
jobs:
delete-caches:
name: Cleanup
uses: dbeaver/dbeaver-common/.github/workflows/cleanup-caches.yml@devel
secrets: inherit
@@ -0,0 +1,93 @@
name: Build and Push Docker Image
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Allows you to reuse workflows by referencing their YAML files
workflow_call:
jobs:
build-and-push-docker:
name: Build and Push Docker Image
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download backend artifacts
uses: actions/download-artifact@v4
with:
name: backend-build-artifacts
path: deploy/cloudbeaver/
- name: Download frontend artifacts
uses: actions/download-artifact@v4
with:
name: frontend-build-artifacts
path: deploy/cloudbeaver/web
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Run custom Docker build script
run: ./make-docker-container.sh
shell: bash
working-directory: ./deploy/docker
- name: Tag Docker Image
run: |
REPO_NAME=$(basename ${{ github.repository }})
IMAGE_NAME=ghcr.io/${{ github.repository_owner }}/$REPO_NAME
BRANCH_NAME=${{ github.head_ref || github.ref_name }}
TAG_NAME=$(echo $BRANCH_NAME | sed 's/[^a-zA-Z0-9._-]/-/g')
docker tag dbeaver/cloudbeaver:dev $IMAGE_NAME:$TAG_NAME
echo "image=$IMAGE_NAME:$TAG_NAME" >> $GITHUB_ENV
# - name: Install Docker Credential Helper
# run: |
# sudo apt-get update
# sudo apt-get install -y gnupg2 pass
# curl -fsSL https://github.com/docker/docker-credential-helpers/releases/download/v0.6.4/docker-credential-pass-v0.6.4-amd64.tar.gz -o docker-credential-pass.tar.gz
# tar xzvf docker-credential-pass.tar.gz
# sudo mv docker-credential-pass /usr/local/bin/docker-credential-pass
# sudo chmod +x /usr/local/bin/docker-credential-pass
# - name: Configure Docker to use Credential Helper
# run: |
# mkdir -p ~/.docker
# echo '{"credsStore":"pass"}' > ~/.docker/config.json
# - name: Initialize Password Store
# run: |
# gpg --batch --gen-key <<EOF
# %no-protection
# Key-Type: default
# Subkey-Type: default
# Name-Real: Docker Credential Helper
# Expire-Date: 0
# %commit
# EOF
# pass init "$(gpg --list-keys --with-colons | grep '^pub' | cut -d: -f5)"
- name: Log in to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin
- name: Push Docker Image
run: docker push ${{ env.image }}
# - name: Comment on Pull Request
# if: github.event_name == 'pull_request'
# uses: actions/github-script@v6
# with:
# github-token: ${{ secrets.PAT }}
# script: |
# const tag = process.env.TAG_NAME;
# const commentBody = `The Docker image has been built and pushed to Docker Hub.\n\nYou can pull the image using the following command:\n\`\`\`\ndocker pull dbeaver/cloudbeaver:${tag}\n\`\`\``;
# github.rest.issues.createComment({
# owner: context.repo.owner,
# repo: context.repo.repo,
# issue_number: context.issue.number,
# body: commentBody
# });
+76
View File
@@ -0,0 +1,76 @@
name: Frontend Build
on:
# Allows you to reuse workflows by referencing their YAML files
workflow_call:
outputs:
build-status:
description: "Build status"
value: ${{ jobs.frontend-build.outputs.build-status }}
test-status:
description: "Test status"
value: ${{ jobs.frontend-build.outputs.test-status }}
inputs:
skip_cache:
required: false
type: string
jobs:
frontend-build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
outputs:
build-status: ${{ steps.build.outcome }}
test-status: ${{ steps.test.outcome }}
defaults:
run:
working-directory: ./webapp
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: yarn
cache-dependency-path: webapp/yarn.lock
- name: restore node_modules
uses: actions/cache@v4
with:
path: "**/node_modules"
key: ${{ runner.os }}-node_modules-${{ hashFiles('webapp/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node_modules-
- name: restore typescript cache
uses: actions/cache@v4
with:
path: "**/packages/*/dist"
key: ${{ runner.os }}-dist-${{ hashFiles('webapp/yarn.lock') }}
restore-keys: |
${{ runner.os }}-dist-
- name: yarn clean
if: env.skip_cache == 'true'
run: yarn clear
- run: yarn install --immutable
- run: yarn bundle
working-directory: ./webapp/packages/product-default
- run: yarn test
# - name: Archive build artifacts
# uses: actions/upload-artifact@v4
# with:
# name: frontend-build-artifacts
# path: webapp/packages/product-default/lib
# if-no-files-found: error
-76
View File
@@ -1,76 +0,0 @@
name: frontend-cache
on:
push:
branches: ["devel"]
paths:
- "webapp/**"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build_and_test:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./webapp
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: "18"
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: restore yarn cache
uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: restore node_modules
uses: actions/cache@v3
with:
path: "**/node_modules"
key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node_modules-
- name: restore typescript cache
uses: actions/cache@v3
with:
path: "**/packages/*/dist"
key: ${{ runner.os }}-dist-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-dist-
- name: yarn install
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: install
- name: yarn lerna bootstrap
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: lerna bootstrap
- name: build
uses: borales/actions-yarn@v4
with:
dir: webapp/packages/product-default
cmd: build # build tyescript source code
- name: test
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: lerna run test # build packages that have test script
-29
View File
@@ -1,29 +0,0 @@
name: cleanup caches by a branch
on:
pull_request:
types:
- closed
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Cleanup
run: |
gh extension install actions/gh-actions-cache
echo "Fetching list of cache key"
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH -L 100 | cut -f 1 )
## Setting this to not fail the workflow while deleting cache keys.
set +e
echo "Deleting caches..."
for cacheKey in $cacheKeysForPR
do
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
done
echo "Done"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge
+45
View File
@@ -0,0 +1,45 @@
name: Frontend Lint
on:
# Allows you to reuse workflows by referencing their YAML files
workflow_call:
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
defaults:
run:
working-directory: ./webapp
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: yarn
cache-dependency-path: webapp/yarn.lock
- name: restore node_modules
uses: actions/cache@v4
with:
path: "**/node_modules"
key: ${{ runner.os }}-node_modules-${{ hashFiles('webapp/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node_modules-
- run: |
yarn install --immutable
git fetch origin "${{ github.base_ref }}" --depth=1
FILES=$(git diff --name-only 'origin/${{ github.base_ref }}' ${{ github.sha }} -- . | sed 's|^webapp/||')
if [ -n "$FILES" ]; then
yarn lint --pass-on-no-patterns --no-error-on-unmatched-pattern $FILES
else
echo "No files to lint"
fi
-80
View File
@@ -1,80 +0,0 @@
name: frontend
on:
# Triggers the workflow on push or pull request events but only for the "devel" branch
pull_request:
branches: ["devel"]
paths:
- "webapp/**" # monitor for the frontend changes
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Allows you to reuse workflows by referencing their YAML files
workflow_call:
jobs:
build_and_test:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./webapp
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: "20"
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: restore yarn cache
uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: restore node_modules
uses: actions/cache@v3
with:
path: "**/node_modules"
key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node_modules-
- name: restore typescript cache
uses: actions/cache@v3
with:
path: "**/packages/*/dist"
key: ${{ runner.os }}-dist-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-dist-
- name: yarn install
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: install
- name: yarn lerna bootstrap
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: lerna bootstrap
- name: build
uses: borales/actions-yarn@v4
with:
dir: webapp/packages/product-default
cmd: bundle
- name: test
uses: borales/actions-yarn@v4
with:
dir: webapp
cmd: lerna run test
+54
View File
@@ -0,0 +1,54 @@
name: CI
on:
pull_request:
types:
- opened
- synchronize
- reopened
push:
branches: [devel]
concurrency:
group: ${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || 'push-pr-devel' }}
cancel-in-progress: true
jobs:
build-server:
name: Server
uses: ./.github/workflows/backend-build.yml
secrets: inherit
build-frontend:
name: Frontend
uses: ./.github/workflows/frontend-build.yml
secrets: inherit
lint-server:
name: Server
uses: dbeaver/dbeaver-common/.github/workflows/java-checkstyle.yml@devel
secrets: inherit
lint-frontend:
name: Frontend
uses: ./.github/workflows/frontend-lint.yml
secrets: inherit
# call-frontend-tests:
# name: Frontend Unit Tests
# needs: call-frontend-build
# runs-on: ubuntu-latest
# steps:
# - name: Check if tests passed
# if: ${{ needs.call-frontend-build.outputs.test-status != 'success' }}
# run: |
# echo "Tests failed"
# exit 1
# - name: Continue if tests passed
# if: ${{ needs.call-frontend-build.outputs.test-status == 'success' }}
# run: echo "Tests passed"
# call-docker-build-and-push:
# name: Run
# needs: [call-backend-build, call-frontend-build]
# uses: ./.github/workflows/docker-build-and-push.yml
-17
View File
@@ -1,17 +0,0 @@
name: validation
on:
pull_request:
branches:
- devel
types:
- opened
- synchronize
- reopened
- edited
- ready_for_review
- labeled
jobs:
commit-message:
uses: dbeaver/dbeaver/.github/workflows/reused-commit-msgs-validator.yml@devel
+5 -1
View File
@@ -26,7 +26,7 @@ dist/
*.iml
/idea/
.idea/
## Mac OS
.DS_Store
@@ -40,6 +40,10 @@ server/test/io.cloudbeaver.test.platform/workspace/.data/
.classpath
.settings/
## Eclipse PDE
*.product.launch
workspace-dev-ce/
deploy/cloudbeaver
server/**/target
apps/**/target
-1
View File
@@ -15,7 +15,6 @@
"streetsidesoftware.code-spell-checker",
"streetsidesoftware.code-spell-checker-russian",
"syler.sass-indented",
"VisualStudioExptTeam.intellicode-api-usage-examples",
"VisualStudioExptTeam.vscodeintellicode",
"yzhang.markdown-all-in-one",
"GraphQL.vscode-graphql-syntax",
+59 -81
View File
@@ -4,95 +4,73 @@
{
"type": "chrome",
"request": "launch",
"name": "Chrome",
"name": "CloudBeaver CE",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}/..",
"outFiles": [
"${workspaceFolder}/../cloudbeaver/packages/**/dist/**/*.{js,jsx}"
],
"smartStep": true,
"sourceMaps": true,
"sourceMapPathOverrides": {
"webpack:///*": "${workspaceFolder}/../*"
},
"skipFiles": [
"<node_internals>/**",
"**/node_modules/**",
"${workspaceFolder}/webapp/**/node_modules/**/*.js",
"${workspaceFolder}/webapp/**/dist/**/*.js"
]
"disableNetworkCache": true,
"skipFiles": ["<node_internals>/**", "**/node_modules/**"]
},
{
"type": "java",
"name": "CloudBeaver CE",
"name": "CloudBeaver CE Server",
"cwd": "${workspaceFolder}/../opt/cbce",
"request": "launch",
"mainClass": "org.eclipse.equinox.launcher.Main",
"windows": {
"type": "java",
"name": "CloudBeaver CE",
"request": "launch",
"mainClass": "org.eclipse.equinox.launcher.Main",
"classPaths": [
"${workspaceFolder}/../eclipse/eclipse/plugins/org.eclipse.equinox.launcher_1.6.600.v20231106-1826.jar"
],
"args": [
"-product",
"io.cloudbeaver.product.ce.product",
"-configuration",
"file:${workspaceFolder}/../eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/CloudbeaverServer.product/",
"-dev",
"file:${workspaceFolder}/../eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/CloudbeaverServer.product/dev.properties",
"-os",
"win32",
"-ws",
"win32",
"-arch",
"x86_64",
"-nl",
"en",
"-showsplash",
"-web-config",
"conf/cloudbeaver.conf"
],
"vmArgs": [
"-XX:+IgnoreUnrecognizedVMOptions",
"--add-modules=ALL-SYSTEM",
"-Xms64m",
"-Xmx1024m",
"-Declipse.pde.launch=true"
]
},
"osx": {
"type": "java",
"name": "CloudBeaver CE",
"request": "launch",
"mainClass": "org.eclipse.equinox.launcher.Main",
"classPaths": [
"${workspaceFolder}/../eclipse/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.equinox.launcher_1.6.600.v20231106-1826.jar"
],
"args": [
"-product",
"io.cloudbeaver.product.ce.product",
"-configuration",
"file:${workspaceFolder}/../eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/CloudbeaverServer.product/",
"-dev",
"file:${workspaceFolder}/../eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/CloudbeaverServer.product/dev.properties",
"-os",
"macosx",
"-ws",
"cocoa",
"-arch",
"aarch64",
"-nl",
"en_US",
"-showsplash"
],
"vmArgs": [
"-XX:+IgnoreUnrecognizedVMOptions",
"--add-modules=ALL-SYSTEM",
"-Xms64m",
"-Xmx1024m",
"-Declipse.pde.launch=true",
"-XstartOnFirstThread"
]
}
"mainClass": "org.jkiss.dbeaver.launcher.DBeaverLauncher",
"args": [
"-product",
"io.cloudbeaver.product.ce.product",
"-configuration",
"file:${workspaceFolder}/../dbeaver-workspace/products/CloudbeaverServer.product/",
"-dev",
"file:${workspaceFolder}/../dbeaver-workspace/products/CloudbeaverServer.product/dev.properties",
"-nl",
"en",
"-web-config",
"conf/cloudbeaver.conf",
"-registryMultiLanguage"
],
// "windows": {
// "args": ["-os", "win32", "-ws", "win32", "-arch", "x86_64"]
// },
// "osx": {
// "args": ["-os", "macosx", "-ws", "cocoa", "-arch", "aarch64"]
// },
"vmArgs": [
"-XX:+IgnoreUnrecognizedVMOptions",
"-Xms64m",
"-Xmx1024m",
"-Declipse.pde.launch=true",
"-XstartOnFirstThread",
"-Dfile.encoding=UTF-8",
"--add-modules=ALL-SYSTEM",
"--add-opens=java.base/java.io=ALL-UNNAMED",
"--add-opens=java.base/java.lang=ALL-UNNAMED",
"--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
"--add-opens=java.base/java.net=ALL-UNNAMED",
"--add-opens=java.base/java.nio=ALL-UNNAMED",
"--add-opens=java.base/java.nio.charset=ALL-UNNAMED",
"--add-opens=java.base/java.text=ALL-UNNAMED",
"--add-opens=java.base/java.time=ALL-UNNAMED",
"--add-opens=java.base/java.util=ALL-UNNAMED",
"--add-opens=java.base/java.util.concurrent=ALL-UNNAMED",
"--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED",
"--add-opens=java.base/jdk.internal.vm=ALL-UNNAMED",
"--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-opens=java.base/sun.nio.ch=ALL-UNNAMED",
"--add-opens=java.base/sun.security.ssl=ALL-UNNAMED",
"--add-opens=java.base/sun.security.action=ALL-UNNAMED",
"--add-opens=java.base/sun.security.util=ALL-UNNAMED",
"--add-opens=java.security.jgss/sun.security.jgss=ALL-UNNAMED",
"--add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED",
"--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED",
"--add-opens=java.sql/java.sql=ALL-UNNAMED"
]
}
]
}
+1 -3
View File
@@ -9,9 +9,7 @@
" *",
" * Licensed under the Apache License, Version 2.0.",
" * you may not use this file except in compliance with the License.",
" */",
"",
""
" */"
]
}
}
+1 -1
View File
@@ -46,6 +46,6 @@
"*.css": "postcss"
},
"java.checkstyle.configuration": "${workspaceFolder}/../dbeaver/dbeaver-checkstyle-config.xml",
"java.checkstyle.configuration": "${workspaceFolder}/../dbeaver-common/.github/dbeaver-checkstyle-config.xml",
"java.checkstyle.version": "10.12.0"
}
+38 -4
View File
@@ -17,7 +17,7 @@
"type": "shell",
"command": "yarn",
"group": "test",
"args": ["lerna", "run", "test", "--no-bail", "--stream", "--"]
"args": ["test"]
},
{
"label": "Run DevServer CE",
@@ -33,14 +33,32 @@
"cwd": "${workspaceFolder}/webapp/packages/product-default"
}
},
{
"label": "Generate Eclipse PDE CloudBeaver",
"type": "shell",
"osx": {
"command": "./generate_workspace.sh"
},
"windows": {
"command": "./generate_workspace.cmd"
},
"options": {
"cwd": "${workspaceFolder}/../cloudbeaver"
},
"presentation": {
"reveal": "silent",
"close": true,
"clear": false
}
},
{
"label": "Build CE",
"type": "shell",
"windows": {
"command": "./build-sqlite.bat"
"command": "./build.bat"
},
"osx": {
"command": "./build-sqlite.sh"
"command": "./build.sh"
},
"options": {
"cwd": "${workspaceFolder}/deploy"
@@ -66,13 +84,29 @@
{
"label": "Yarn Install",
"type": "shell",
"command": "yarn install; yarn lerna bootstrap",
"command": "yarn install",
"args": [],
"presentation": {
"reveal": "silent",
"close": true,
"clear": false
}
},
{
"label": "Update TS references CE",
"type": "shell",
"command": "yarn run update-ts-references",
"options": {
"cwd": "${workspaceFolder}/webapp"
}
},
{
"label": "Clean CE",
"type": "shell",
"command": "yarn clean",
"options": {
"cwd": "${workspaceFolder}/webapp"
}
}
],
"inputs": [
+60 -22
View File
@@ -1,13 +1,16 @@
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/cloudbeaver-logo.png" align="right" width="250"/>
# CloudBeaver Community
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/cloudbeaver-logo.png" width="250"/>
Cloud Database Manager - Community Edition.
CloudBeaver is a web server which provides rich web interface. Server itself is a Java application, web part is written on TypeScript and React.
CloudBeaver is a web server that provides a rich web interface. The server itself is a Java application, and the web part is written in TypeScript and React.
It is free to use and open-source (licensed under [Apache 2](https://github.com/dbeaver/cloudbeaver/blob/devel/LICENSE) license).
See out [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details.
See our [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details.
![](https://github.com/dbeaver/cloudbeaver/wiki/images/demo_screenshot_1.png)
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/connection-creation-demo.png" width="400"/>
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/gis-demo.png" width="400"/>
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/data-transfer-demo.png" width="400"/>
<img src="https://github.com/dbeaver/cloudbeaver/wiki/images/sql-editor-demo.png" width="400"/>
## Run in Docker
@@ -16,30 +19,65 @@ See out [WIKI](https://github.com/dbeaver/cloudbeaver/wiki) for more details.
## Demo server
You can see live demo of CloudBeaver here: https://demo.cloudbeaver.io
You can see a live demo of CloudBeaver here: https://demo.cloudbeaver.io
[Database access instructions](https://github.com/dbeaver/cloudbeaver/wiki/Demo-Server)
## Changelog
### 23.3.2. 2024-01-08
- Added the ability to view decoded binary-type data in the Value panel;
- Enhanced security for unauthorized access;
- Different bug fixes and enhancements have been made.
### 24.2.3. 2024-10-21
- Important update:
- Connections Templates feature is declared as obsolete and will be removed in future releases.
- General:
- Data editor enhancements: Rows with focused cells are specially marked to make it easier to locate a position in large tables;
- DB2i driver has been updated to version 20.0.7;
- The URL mode for PostgreSQL now supports connecting to multiple databases;
- The issue with displaying BLOB data types in DuckDB has been resolved.
### 23.3.1. 2023-12-25
- Performance:
- Upgraded to Jetty 11, delivering improved performance, enhanced features, and better alignment with the latest Java specifications.
- Resource management:
- Read-only scripts now have a padlock icon.
- UX improvement:
- Added validation for mandatory fields in all forms for creating and editing entities.
- Driver management:
- Apache Derby driver has been removed because of the vulnerability issues.
- Many small bug fixes, enhancements, and improvements have been made
### 24.2.2. 2024-10-07
- Schemas were added to the SQL autocompletion for PostgreSQL, H2, and SQL Server;
- CloudBeaver can now correctly display negative dates for MySQL database;
- A search option was added for preferences in the Administration part;
- Keyboard navigation has been enhanced. You can now use the arrow keys to move through navigator tree elements and the tab key to switch between editors tabs;
- Sample SQLite database was removed.
### 24.2.1. 2024-09-23
- Chinese localization has been improved (thanks to [cashlifei](https://github.com/cashlifei));
- Environment variables configuration has been improved - now you can configure more variables on the initial stage of the Docker setup;
- SQL Server driver has been updated to version 12.8.0.
### Old CloudBeaver releases
### 24.2.0. 2024-09-02
### Changes since 24.1.0:
- General:
- French language support was added (thanks to [matthieukhl](https://github.com/matthieukhl))
- Added the ability to close editor tabs with the middle mouse button
- Added right-click support to open the context menu in the Metadata Editor
- The list of forbidden characters for naming and renaming resource manager files has been updated, and now it includes the following characters: / : " \ ' <> | ? *
- Application cookies security was improved
- Authentication:
- Improved LDAP authentication: added the ability to filter users via service account parameters and ability to specify custom unique user identifiers
- Data Editor:
- Added additional notifications about the restricted operations
- Enhanced IPv6 and DateTime32 data representation for Clickhouse
- Data editing was fixed for DuckDB
- SQL Editor:
- SQL Editor auto-completion was enhanced to get column, table, and function names faster
- Fixed the dollar-quoted string parsing in the SQL Editor for PostgreSQL
- Improved display of the long error messages in the SQL Editor and Log viewer
- Changed the save script icon to a floppy disk for better recognition
- Improved application behavior when closing a connection - open editors won't be closed on disconnect
- Administration:
- Redesigned administration navigation panel - now it is more compact and clear
- Added the ability to change the default commit mode for each connection separately
- Added the ability to configure the server property rootURI parameter (thanks to [arioko](https://github.com/arioko))
- Databases:
- Added the "Keep alive" setting for Db2 LUW and IMB i, Apache Kyuubi, Clickhouse, Firebird, and Trino
- Updated Firebird driver to version 5.0.4
- DDL generation for Oracle Tablespaces was added (thanks to [pandya09](https://github.com/pandya09))
You can find information about earlier releases on the CloudBeaver wiki https://github.com/dbeaver/cloudbeaver/wiki/Releases.
## Contribution
As a community-driven open-source project, we warmly welcome contributions through GitHub pull requests.
[We are happy to reward](https://dbeaver.com/help-dbeaver/) our most active contributors every major sprint.
The most significant contribution to our code for the major release 24.2.0 was made by:
1. [matthieukhl](https://github.com/matthieukhl)
+4 -3
View File
@@ -9,9 +9,10 @@ currently being supported with security updates.
| ------- | --------- |
| 22.x | yes |
| 23.x | yes |
| 24.x | yes |
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities to devops@dbeaver.com.
You will receive a response from us within 48 hours.
If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days.
Please report (suspected) security vulnerabilities to devops@dbeaver.com.
You will receive a response from us within 48 hours.
If the issue is confirmed, we will release a patch as soon as possible, depending on complexity, but historically, within a few days.
+1 -1
View File
@@ -17,7 +17,7 @@
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.220</version>
<version>2.1.214</version>
</dependency>
</dependencies>
<build>
@@ -0,0 +1,4 @@
{
"folders": {},
"connections": {}
}
+104
View File
@@ -0,0 +1,104 @@
{
server: {
serverPort: "${CLOUDBEAVER_SERVICE_PORT:8978}",
workspaceLocation: "${CLOUDBEAVER_WORKSPACE_LOCATION:workspace}",
contentRoot: "web",
driversLocation: "drivers",
sslConfigurationPath:"${CLOUDBEAVER_SSL_CONF_PATH:workspace/.data/ssl-config.xml}",
rootURI: "${CLOUDBEAVER_ROOT_URI:/}",
serviceURI: "/api/",
productSettings: {
# Global properties
core.theming.theme: 'light',
core.localization.localization: 'en',
plugin.sql-editor.autoSave: true,
plugin.sql-editor.disabled: false,
# max size of the file that can be uploaded to the editor (in kilobytes)
plugin.sql-editor.maxFileSize: 10240,
plugin.log-viewer.disabled: false,
plugin.log-viewer.logBatchSize: 1000,
plugin.log-viewer.maxLogRecords: 2000,
sql.proposals.insert.table.alias: PLAIN
},
expireSessionAfterPeriod: "${CLOUDBEAVER_EXPIRE_SESSION_AFTER_PERIOD:1800000}",
develMode: "${CLOUDBEAVER_DEVEL_MODE:false}",
enableSecurityManager: false,
sm: {
enableBruteForceProtection: "${CLOUDBEAVER_BRUTE_FORCE_PROTECTION_ENABLED:true}",
maxFailedLogin: "${CLOUDBEAVER_MAX_FAILED_LOGINS:10}",
minimumLoginTimeout: "${CLOUDBEAVER_MINIMUM_LOGIN_TIMEOUT:1}",
blockLoginPeriod: "${CLOUDBEAVER_BLOCK_PERIOD:300}",
passwordPolicy: {
minLength: "${CLOUDBEAVER_POLICY_MIN_LENGTH:8}",
requireMixedCase: "${CLOUDBEAVER_POLICY_REQUIRE_MIXED_CASE:true}",
minNumberCount: "${CLOUDBEAVER_POLICY_MIN_NUMBER_COUNT:1}",
minSymbolCount: "${CLOUDBEAVER_POLICY_MIN_SYMBOL_COUNT:0}"
}
},
database: {
driver: "${CLOUDBEAVER_DB_DRIVER:h2_embedded_v2}",
url: "${CLOUDBEAVER_DB_URL:jdbc:h2:${workspace}/.data/cb.h2v2.dat}",
schema: "${CLOUDBEAVER_DB_SCHEMA:''}",
user: "${CLOUDBEAVER_DB_USER:''}",
password: "${CLOUDBEAVER_DB_PASSWORD:''}",
initialDataConfiguration: "${CLOUDBEAVER_DB_INITIAL_DATA:conf/initial-data.conf}",
pool: {
minIdleConnections: "${CLOUDBEAVER_DB_MIN_IDLE_CONNECTIONS:4}",
maxIdleConnections: "${CLOUDBEAVER_DB_MAX_IDLE_CONNECTIONS:10}",
maxConnections: "${CLOUDBEAVER_DB_MAX_CONNECTIONS:100}",
validationQuery: "${CLOUDBEAVER_DB_VALIDATION_QUERY:SELECT 1}"
},
backupEnabled: "${CLOUDBEAVER_DB_BACKUP_ENABLED:true}"
}
},
app: {
anonymousAccessEnabled: "${CLOUDBEAVER_APP_ANONYMOUS_ACCESS_ENABLED:true}",
anonymousUserRole: user,
defaultUserTeam: "${CLOUDBEAVER_APP_DEFAULT_USER_TEAM:user}",
grantConnectionsAccessToAnonymousTeam: "${CLOUDBEAVER_APP_GRANT_CONNECTIONS_ACCESS_TO_ANONYMOUS_TEAM:false}",
supportsCustomConnections: "${CLOUDBEAVER_APP_SUPPORTS_CUSTOM_CONNECTIONS:false}",
showReadOnlyConnectionInfo: "${CLOUDBEAVER_APP_READ_ONLY_CONNECTION_INFO:false}",
systemVariablesResolvingEnabled: "${CLOUDBEAVER_SYSTEM_VARIABLES_RESOLVING_ENABLED:false}",
forwardProxy: "${CLOUDBEAVER_APP_FORWARD_PROXY:false}",
publicCredentialsSaveEnabled: "${CLOUDBEAVER_APP_PUBLIC_CREDENTIALS_SAVE_ENABLED:true}",
adminCredentialsSaveEnabled: "${CLOUDBEAVER_APP_ADMIN_CREDENTIALS_SAVE_ENABLED:true}",
resourceManagerEnabled: "${CLOUDBEAVER_APP_RESOURCE_MANAGER_ENABLED:true}",
resourceQuotas: {
dataExportFileSizeLimit: "${CLOUDBEAVER_RESOURCE_QUOTA_DATA_EXPORT_FILE_SIZE_LIMIT:10000000}",
resourceManagerFileSizeLimit: "${CLOUDBEAVER_RESOURCE_QUOTA_RESOURCE_MANAGER_FILE_SIZE_LIMIT:500000}",
sqlMaxRunningQueries: "${CLOUDBEAVER_RESOURCE_QUOTA_SQL_MAX_RUNNING_QUERIES:100}",
sqlResultSetRowsLimit: "${CLOUDBEAVER_RESOURCE_QUOTA_SQL_RESULT_SET_ROWS_LIMIT:100000}",
sqlTextPreviewMaxLength: "${CLOUDBEAVER_RESOURCE_QUOTA_SQL_TEXT_PREVIEW_MAX_LENGTH:4096}",
sqlBinaryPreviewMaxLength: "${CLOUDBEAVER_RESOURCE_QUOTA_SQL_BINARY_PREVIEW_MAX_LENGTH:261120}"
},
enabledAuthProviders: [
"local"
],
disabledDrivers: [
"sqlite:sqlite_jdbc",
"h2:h2_embedded",
"h2:h2_embedded_v2",
"clickhouse:yandex_clickhouse"
],
disabledBetaFeatures: [
]
}
}
+2 -2
View File
@@ -2,13 +2,13 @@
teams: [
{
subjectId: "admin",
name: "Admin",
teamName: "Admin",
description: "Administrative access. Has all permissions.",
permissions: [ "admin" ]
},
{
subjectId: "user",
name: "User",
teamName: "User",
description: "All users, including anonymous.",
permissions: [ ]
}
-31
View File
@@ -1,31 +0,0 @@
// Product configuration. Customized web application behavior
// It is in JSONC format
{
// Global properties
core: {
// User defaults
user: {
defaultTheme: "light",
defaultLanguage: "en"
},
app: {
// Log viewer config
logViewer: {
refreshTimeout: 3000,
logBatchSize: 1000,
maxLogRecords: 2000,
maxFailedRequests: 3
}
}
},
// Notifications config
core_events: {
notificationsPool: 20
},
plugin_data_spreadsheet_new: {
hidden: false
},
plugin_data_export: {
disabled: false
}
}
@@ -1,24 +0,0 @@
{
"folders": {},
"connections": {
"postgresql-template-1": {
"provider": "postgresql",
"driver": "postgres-jdbc",
"name": "PostgreSQL (Template)",
"save-password": false,
"show-system-objects": false,
"read-only": true,
"template": true,
"configuration": {
"host": "localhost",
"port": "5432",
"database": "postgres",
"url": "jdbc:postgresql://localhost:5432/postgres",
"type": "dev",
"provider-properties": {
"@dbeaver-show-non-default-db@": "false"
}
}
}
}
}
@@ -1,84 +0,0 @@
{
server: {
serverPort: 8978,
workspaceLocation: "workspace",
contentRoot: "web",
driversLocation: "drivers",
sslConfigurationPath:"${CLOUDBEAVER_SSL_CONF_PATH:workspace/.data/ssl-config.xml}",
rootURI: "/",
serviceURI: "/api/",
productConfiguration: "conf/product.conf",
expireSessionAfterPeriod: 1800000,
develMode: false,
enableSecurityManager: false,
sm: {
enableBruteForceProtection: "${CLOUDBEAVER_BRUTE_FORCE_PROTECTION_ENABLED:true}",
maxFailedLogin: "${CLOUDBEAVER_MAX_FAILED_LOGINS:10}",
minimumLoginTimeout: "${CLOUDBEAVER_MINIMUM_LOGIN_TIMEOUT:1}",
blockLoginPeriod: "${CLOUDBEAVER_BLOCK_PERIOD:300}",
passwordPolicy: {
minLength: "${CLOUDBEAVER_POLICY_MIN_LENGTH:8}",
requireMixedCase: "${CLOUDBEAVER_POLICY_REQUIRE_MIXED_CASE:true}",
minNumberCount: "${CLOUDBEAVER_POLICY_MIN_NUMBER_COUNT:1}",
minSymbolCount: "${CLOUDBEAVER_POLICY_MIN_SYMBOL_COUNT:0}"
}
},
database: {
driver="h2_embedded_v2",
url: "jdbc:h2:${workspace}/.data/cb.h2v2.dat",
initialDataConfiguration: "conf/initial-data.conf",
pool: {
minIdleConnections: 4,
maxIdleConnections: 10,
maxConnections: 100,
validationQuery: "SELECT 1"
}
}
},
app: {
anonymousAccessEnabled: true,
anonymousUserRole: "user",
grantConnectionsAccessToAnonymousTeam: false,
supportsCustomConnections: false,
showReadOnlyConnectionInfo: false,
forwardProxy: false,
publicCredentialsSaveEnabled: true,
adminCredentialsSaveEnabled: true,
resourceManagerEnabled: true,
resourceQuotas: {
dataExportFileSizeLimit: 10000000,
resourceManagerFileSizeLimit: 500000,
sqlMaxRunningQueries: 100,
sqlResultSetRowsLimit: 100000,
sqlResultSetMemoryLimit: 2000000,
sqlTextPreviewMaxLength: 4096,
sqlBinaryPreviewMaxLength: 261120
},
enabledAuthProviders: [
"local"
],
disabledDrivers: [
"sqlite:sqlite_jdbc",
"h2:h2_embedded",
"h2:h2_embedded_v2",
"clickhouse:yandex_clickhouse"
]
}
}
-3
View File
@@ -1,3 +0,0 @@
### Sample databases
Provides access to locally deployed SQLite sample database
@@ -1,39 +0,0 @@
{
"folders": {},
"connections": {
"sqlite_xerial-sample-database": {
"provider": "generic",
"driver": "sqlite_jdbc",
"name": "SQLite - Chinook (Sample)",
"save-password": true,
"navigator-show-only-entities": false,
"navigator-hide-folders": false,
"read-only": false,
"template": false,
"configuration": {
"database": "${application.path}/../samples/db/Chinook.sqlitedb",
"type": "dev",
"auth-model": "native"
}
},
"postgresql-template-1": {
"provider": "postgresql",
"driver": "postgres-jdbc",
"name": "PostgreSQL (Template)",
"save-password": false,
"show-system-objects": false,
"read-only": true,
"template": true,
"configuration": {
"host": "localhost",
"port": "5432",
"database": "postgres",
"url": "jdbc:postgresql://localhost:5432/postgres",
"type": "dev",
"provider-properties": {
"@dbeaver-show-non-default-db@": "false"
}
}
}
}
}
@@ -1,4 +0,0 @@
{
"folders": {},
"connections": {}
}
@@ -1,80 +0,0 @@
{
server: {
serverPort: 8978,
workspaceLocation: "workspace",
contentRoot: "web",
driversLocation: "drivers",
rootURI: "/",
serviceURI: "/api/",
productConfiguration: "conf/product.conf",
expireSessionAfterPeriod: 1800000,
develMode: false,
enableSecurityManager: false,
database: {
driver="h2_embedded_v2",
url: "jdbc:h2:${workspace}/.data/cb.h2v2.dat",
initialDataConfiguration: "conf/initial-data.conf",
pool: {
minIdleConnections: 4,
maxIdleConnections: 10,
maxConnections: 100,
validationQuery: "SELECT 1"
}
},
sm: {
enableBruteForceProtection: "${CLOUDBEAVER_BRUTE_FORCE_PROTECTION_ENABLED:true}",
maxFailedLogin: "${CLOUDBEAVER_MAX_FAILED_LOGINS:10}",
minimumLoginTimeout: "${CLOUDBEAVER_MINIMUM_LOGIN_TIMEOUT:1}",
blockLoginPeriod: "${CLOUDBEAVER_BLOCK_PERIOD:300}",
passwordPolicy: {
minLength: "${CLOUDBEAVER_POLICY_MIN_LENGTH:8}",
requireMixedCase: "${CLOUDBEAVER_POLICY_REQUIRE_MIXED_CASE:true}",
minNumberCount: "${CLOUDBEAVER_POLICY_MIN_NUMBER_COUNT:1}",
minSymbolCount: "${CLOUDBEAVER_POLICY_MIN_SYMBOL_COUNT:0}"
}
}
},
app: {
anonymousAccessEnabled: true,
anonymousUserRole: "user",
grantConnectionsAccessToAnonymousTeam: false,
supportsCustomConnections: false,
showReadOnlyConnectionInfo: false,
forwardProxy: false,
publicCredentialsSaveEnabled: true,
adminCredentialsSaveEnabled: true,
resourceManagerEnabled: true,
resourceQuotas: {
dataExportFileSizeLimit: 10000000,
resourceManagerFileSizeLimit: 500000,
sqlMaxRunningQueries: 100,
sqlResultSetRowsLimit: 100000,
sqlResultSetMemoryLimit: 2000000,
sqlTextPreviewMaxLength: 4096,
sqlBinaryPreviewMaxLength: 261120
},
enabledAuthProviders: [
"local"
],
disabledDrivers: [
"h2:h2_embedded",
"h2:h2_embedded_v2",
"clickhouse:yandex_clickhouse"
]
}
}
Binary file not shown.
-6
View File
@@ -1,6 +0,0 @@
Chinook Database - Version 1.3
Script: Chinook_Sqlite.sql
Description: Creates and populates the Chinook database.
DB Server: Sqlite
Author: Luis Rocha
License: http://www.codeplex.com/ChinookDatabase/license
+4 -21
View File
@@ -2,12 +2,6 @@
set -Eeo pipefail
set +u
# #command line arguments
# CONFIGURATION_PATH=${1-"../config/sample-databases/DefaultConfiguration"}
# SAMPLE_DATABASE_PATH=${2-""}
# echo $CONFIGURATION_PATH
# echo $SAMPLE_DATABASE_PATH
echo "Clone and build Cloudbeaver"
rm -rf ./drivers
@@ -16,14 +10,15 @@ mkdir ./cloudbeaver
mkdir ./cloudbeaver/server
mkdir ./cloudbeaver/conf
mkdir ./cloudbeaver/workspace
mkdir ./cloudbeaver/web
echo "Pull cloudbeaver platform"
cd ../..
echo "Pull dbeaver platform"
[ ! -d dbeaver ] && git clone https://github.com/dbeaver/dbeaver.git
[ ! -d dbeaver ] && git clone --depth 1 https://github.com/dbeaver/dbeaver.git
[ ! -d dbeaver-common ] && git clone --depth 1 https://github.com/dbeaver/dbeaver-common.git
cd cloudbeaver/deploy
@@ -42,20 +37,8 @@ cp -rp ../server/product/web-server/target/products/io.cloudbeaver.product/all/a
cp -p ./scripts/* ./cloudbeaver
mkdir cloudbeaver/samples
if [[ -z $SAMPLE_DATABASE_PATH ]]; then
SAMPLE_DATABASE_PATH=""
else
mkdir cloudbeaver/samples/db
cp -rp "${SAMPLE_DATABASE_PATH}" cloudbeaver/samples/
fi
if [[ -z "$CONFIGURATION_PATH" ]]; then
CONFIGURATION_PATH="../config/sample-databases/DefaultConfiguration"
fi
cp -rp ../config/core/* cloudbeaver/conf
cp -rp "${CONFIGURATION_PATH}"/GlobalConfiguration/.dbeaver/data-sources.json cloudbeaver/conf/initial-data-sources.conf
cp -p "${CONFIGURATION_PATH}"/*.conf cloudbeaver/conf/
cp -rp ../config/GlobalConfiguration/.dbeaver/data-sources.json cloudbeaver/conf/initial-data-sources.conf
mv drivers cloudbeaver
echo "End of backend build"
+13 -3
View File
@@ -3,19 +3,29 @@ set -Eeuo pipefail
echo "Build static content"
mkdir ./cloudbeaver/web
cd ../../cloudbeaver/webapp
yarn
yarn lerna run bootstrap
yarn lerna run bundle --no-bail --stream --scope=@cloudbeaver/product-default #-- -- --env source-map
cd ./packages/product-default
yarn run bundle
if [[ "$?" -ne 0 ]] ; then
echo 'Application build failed'; exit $rc
fi
cd ../../
yarn test
if [[ "$?" -ne 0 ]] ; then
echo 'Frontend tests failed'; exit $rc
fi
cd ../deploy
echo "Copy static content"
cp -rp ../webapp/packages/product-default/lib/* cloudbeaver/web
echo "Cloudbeaver is ready. Run run-server.bat in cloudbeaver folder to start the server."
echo "Cloudbeaver is ready. Run run-server.sh in cloudbeaver folder to start the server."
-1
View File
@@ -1 +0,0 @@
@call build.bat ..\config\sample-databases\SQLiteConfiguration ..\config\sample-databases\db
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
set -Eeuo pipefail
#command line arguments
CONFIGURATION_PATH='../config/sample-databases/SQLiteConfiguration'
SAMPLE_DATABASE_PATH='../config/sample-databases/db'
source build-backend.sh
source build-frontend.sh
+23 -18
View File
@@ -1,11 +1,6 @@
@echo off
rem command line arguments
SET CONFIGURATION_PATH=%1
SET SAMPLE_DATABASE_PATH=%2
IF "%CONFIGURATION_PATH%"=="" SET CONFIGURATION_PATH="..\config\sample-databases\DefaultConfiguration"
echo "Configuration path=%CONFIGURATION_PATH%"
echo Clone and build Cloudbeaver
@@ -24,6 +19,7 @@ cd ..\..
echo Pull dbeaver platform
IF NOT EXIST dbeaver git clone https://github.com/dbeaver/dbeaver.git
IF NOT EXIST dbeaver-common git clone https://github.com/dbeaver/dbeaver-common.git
cd cloudbeaver\deploy
echo Build cloudbeaver server
@@ -39,32 +35,41 @@ xcopy /E /Q ..\server\product\web-server\target\products\io.cloudbeaver.product\
copy scripts\* cloudbeaver >NUL
mkdir cloudbeaver\samples
IF NOT "%SAMPLE_DATABASE_PATH%"=="" (
mkdir cloudbeaver\samples\db
xcopy /E /Q %SAMPLE_DATABASE_PATH% cloudbeaver\samples\db >NUL
)
copy ..\config\core\* cloudbeaver\conf >NUL
copy %CONFIGURATION_PATH%\GlobalConfiguration\.dbeaver\data-sources.json cloudbeaver\conf\initial-data-sources.conf >NUL
copy %CONFIGURATION_PATH%\*.conf cloudbeaver\conf >NUL
copy ..\config\DefaultConfiguration\GlobalConfiguration\.dbeaver\data-sources.json cloudbeaver\conf\initial-data-sources.conf >NUL
move drivers cloudbeaver >NUL
echo Build static content
echo "Build static content"
cd ..\
mkdir .\cloudbeaver\web
cd ..\cloudbeaver\webapp
cd ..\webapp
call yarn
call yarn lerna bootstrap
call yarn lerna run bundle --no-bail --stream --scope=@cloudbeaver/product-default &::-- -- --env source-map
cd .\packages\product-default
call yarn run bundle
if %ERRORLEVEL% neq 0 (
echo 'Application build failed'
exit /b %ERRORLEVEL%
)
cd ..\..\
call yarn test
if %ERRORLEVEL% neq 0 (
echo 'Frontend tests failed'
exit /b %ERRORLEVEL%
)
cd ..\deploy
echo Copy static content
echo "Copy static content"
xcopy /E /Q ..\webapp\packages\product-default\lib cloudbeaver\web >NUL
echo Cloudbeaver is ready. Run run-server.bat in cloudbeaver folder to start the server.
echo "Cloudbeaver is ready. Run run-server.bat in cloudbeaver folder to start the server."
pause
-4
View File
@@ -1,9 +1,5 @@
#!/bin/bash
set -Eeuo pipefail
#command line arguments
CONFIGURATION_PATH="../config/sample-databases/DefaultConfiguration"
SAMPLE_DATABASE_PATH=""
source build-backend.sh
source build-frontend.sh
@@ -1,10 +1,12 @@
FROM ubuntu:23.04
FROM ubuntu:24.04
MAINTAINER DBeaver Corp, devops@dbeaver.com
ENV DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
apt-get update; \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
apt-get install -y --no-install-recommends \
# curl required for historical reasons, see https://github.com/adoptium/containers/issues/255
curl \
wget \
@@ -43,10 +45,3 @@ RUN set -eux; \
### Patch java security
COPY java.security* ${JAVA_HOME}/conf/security/java.security
COPY cloudbeaver /opt/cloudbeaver
EXPOSE 8978
RUN find /opt/cloudbeaver -type d -exec chmod 775 {} \;
WORKDIR /opt/cloudbeaver/
ENTRYPOINT ["./run-server.sh"]
+13
View File
@@ -0,0 +1,13 @@
FROM dbeaver/base-java
MAINTAINER DBeaver Corp, devops@dbeaver.com
RUN apt-get update; \
apt-get upgrade -y;
COPY cloudbeaver /opt/cloudbeaver
EXPOSE 8978
RUN find /opt/cloudbeaver -type d -exec chmod 775 {} \;
WORKDIR /opt/cloudbeaver/
ENTRYPOINT ["./run-server.sh"]
+1 -1
View File
@@ -1,3 +1,3 @@
cd ..
docker build -t dbeaver/cloudbeaver:dev . --file ./docker/Dockerfile
docker build -t dbeaver/cloudbeaver:dev . --file ./docker/cloudbeaver-ce/Dockerfile
+1 -1
View File
@@ -1,5 +1,5 @@
@echo off
for /f %%a in ('dir /B /S server\plugins\org.eclipse.equinox.launcher*.jar') do SET launcherJar="%%a"
for /f %%a in ('dir /B /S server\plugins\org.jkiss.dbeaver.launcher*.jar') do SET launcherJar="%%a"
echo "Starting Cloudbeaver Server"
+2 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash
launcherJar=( server/plugins/org.eclipse.equinox.launcher*.jar )
launcherJar=( server/plugins/org.jkiss.dbeaver.launcher*.jar )
echo "Starting Cloudbeaver Server"
@@ -9,7 +9,7 @@ echo "Starting Cloudbeaver Server"
&& [ ! -f "workspace/GlobalConfiguration/.dbeaver/data-sources.json" ] \
&& cp conf/initial-data-sources.conf workspace/GlobalConfiguration/.dbeaver/data-sources.json
java ${JAVA_OPTS} \
exec java ${JAVA_OPTS} \
-Dfile.encoding=UTF-8 \
--add-modules=ALL-SYSTEM \
--add-opens=java.base/java.io=ALL-UNNAMED \
-10
View File
@@ -1,10 +0,0 @@
[program:cloudbeaver]
directory=/opt/cloudbeaver/
command=/opt/cloudbeaver/run-server.sh
stopasgroup=true
killasgroup=true
stopsignal=INT
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/cloudbeaver-server.log
+3
View File
@@ -0,0 +1,3 @@
SET mypath=%~dp0
.\..\idea-rcp-launch-config-generator\runGenerator.cmd -f %mypath%
+1
View File
@@ -0,0 +1 @@
./../idea-rcp-launch-config-generator/runGenerator.sh -f "$PWD"
-1
View File
@@ -1,4 +1,3 @@
{
"projects": ["../dbeaver", "../cloudbeaver/server"],
"targetPlatform": "./org.jkiss.cloudbeaver.tp.target"
}
+2 -3
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde version="3.8"?>
<target name="org.jkiss.tp.cloudbeaver">
<target name="org.jkiss.cloudbeaver.tp">
<locations>
<location path="../eclipse/Eclipse.app/Contents/Eclipse/plugins" type="Directory"/>
<location path="../eclipse/eclipse/plugins" type="Directory"/>
<location path="../dbeaver-workspace/dependencies/plugins" type="Directory"/>
</locations>
</target>
+33
View File
@@ -0,0 +1,33 @@
workspaceName=cloudbeaver-ce
featuresPaths=\
dbeaver/features;\
cloudbeaver/server/features;
bundlesPaths=\
dbeaver-common/modules;\
dbeaver/plugins;\
cloudbeaver/server/bundles;
testLibraries=\
org.junit;\
org.mockito.mockito-core;\
junit-jupiter-api;\
org.opentest4j
repositories=\
https://p2.dev.dbeaver.com/eclipse-repo/;\
https://download.eclipse.org/releases/${eclipse-version}/;
testBundles=\
org.junit;\
org.mockito.mockito-core;\
junit-jupiter-api;\
org.opentest4j
productsPaths=\
dbeaver/product/community/DBeaver.product;\
cloudbeaver/server/product/web-server/CloudbeaverServer.product:../../opt/cloudbeaver;
ideaConfigurationFilesPaths=\
dbeaver/.ide/.idea;
testBundlePaths=\
dbeaver/test;\
cloudbeaver/server/test;
additionalModuleRoots=\
opt;
optionalFeatureRepositories=\
dbeaver/product/repositories
+2
View File
@@ -0,0 +1,2 @@
dbeaver-common
dbeaver
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
Bundle-Vendor: DBeaver Corp
Bundle-Name: Cloudbeaver Web Model
Bundle-SymbolicName: io.cloudbeaver.model;singleton:=true
Bundle-Version: 1.0.45.qualifier
Bundle-Release-Date: 20240122
Bundle-Version: 1.0.64.qualifier
Bundle-Release-Date: 20241104
Bundle-RequiredExecutionEnvironment: JavaSE-17
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
@@ -18,16 +18,19 @@ Require-Bundle: org.jkiss.dbeaver.data.gis;visibility:=reexport,
org.jkiss.bundle.graphql.java;visibility:=reexport,
org.jkiss.bundle.apache.dbcp,
com.google.gson;visibility:=reexport,
jakarta.servlet;visibility:=reexport
jakarta.servlet-api;bundle-version:="6.0.0";visibility:=reexport
Export-Package: io.cloudbeaver,
io.cloudbeaver.auth,
io.cloudbeaver.auth.provider,
io.cloudbeaver.auth.provider.fa,
io.cloudbeaver.auth.provider.local,
io.cloudbeaver.auth.provisioning,
io.cloudbeaver.websocket,
io.cloudbeaver.model,
io.cloudbeaver.model.app,
io.cloudbeaver.model.config,
io.cloudbeaver.model.fs,
io.cloudbeaver.model.log,
io.cloudbeaver.model.rm,
io.cloudbeaver.model.rm.local,
io.cloudbeaver.model.rm.lock,
@@ -40,6 +43,7 @@ Export-Package: io.cloudbeaver,
io.cloudbeaver.service.admin,
io.cloudbeaver.service.security,
io.cloudbeaver.service.sql,
io.cloudbeaver.test,
io.cloudbeaver.utils,
io.cloudbeaver.utils.file
Automatic-Module-Name: io.cloudbeaver.model
+1 -1
View File
@@ -10,7 +10,7 @@
<relativePath>../</relativePath>
</parent>
<artifactId>io.cloudbeaver.model</artifactId>
<version>1.0.45-SNAPSHOT</version>
<version>1.0.64-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
@@ -16,23 +16,20 @@
*/
package io.cloudbeaver;
import org.eclipse.core.resources.IProject;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMSessionContext;
import org.jkiss.dbeaver.model.impl.app.BaseProjectImpl;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMControllerProvider;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMUtils;
import org.jkiss.dbeaver.registry.BaseProjectImpl;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.Pair;
import java.nio.file.Path;
import java.util.Collection;
public class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerProvider {
public abstract class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerProvider {
@NotNull
private final RMProject project;
@@ -40,7 +37,6 @@ public class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerP
@NotNull
private final Path path;
@NotNull
protected final DataSourceFilter dataSourceFilter;
private final RMController resourceController;
public BaseWebProjectImpl(
@@ -48,13 +44,12 @@ public class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerP
@NotNull RMController resourceController,
@NotNull SMSessionContext sessionContext,
@NotNull RMProject project,
@NotNull DataSourceFilter dataSourceFilter
@NotNull Path path
) {
super(workspace, sessionContext);
this.resourceController = resourceController;
this.path = RMUtils.getProjectPath(project);
this.path = path;
this.project = project;
this.dataSourceFilter = dataSourceFilter;
}
@NotNull
@@ -91,12 +86,6 @@ public class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerP
return path;
}
@Nullable
@Override
public IProject getEclipseProject() {
return null;
}
@Override
public boolean isOpen() {
return true;
@@ -112,11 +101,6 @@ public class BaseWebProjectImpl extends BaseProjectImpl implements RMControllerP
return false;
}
@NotNull
public RMProject getRmProject() {
return this.project;
}
/**
* Method for Bulk Update of resources properties paths
*
@@ -22,19 +22,22 @@ import org.jkiss.dbeaver.model.rm.RMConstants;
/**
* General constants
*/
public class DBWConstants {
public interface DBWConstants {
public static final String PERMISSION_ADMIN = DBAPermissionRealm.PERMISSION_ADMIN;
String PERMISSION_ADMIN = DBAPermissionRealm.PERMISSION_ADMIN;
public static final String PERMISSION_CONFIGURATION_MANAGER = RMConstants.PERMISSION_CONFIGURATION_MANAGER;
public static final String PERMISSION_PRIVATE_PROJECT_ACCESS = "private-project-access";
String PERMISSION_CONFIGURATION_MANAGER = RMConstants.PERMISSION_CONFIGURATION_MANAGER;
String PERMISSION_PRIVATE_PROJECT_ACCESS = "private-project-access";
String PERMISSION_SECRET_MANAGER = "secret-manager";
public static final String PERMISSION_EDIT_STRUCTURE = "edit-meta";
public static final String PERMISSION_EDIT_DATA = "edit-data";
public static final String STATE_ATTR_SIGN_IN_STATE = "state.signin";
String PERMISSION_EDIT_STRUCTURE = "edit-meta";
String PERMISSION_EDIT_DATA = "edit-data";
public enum SignInState {
String STATE_ATTR_SIGN_IN_STATE = "state.signin";
String WORK_DATA_FOLDER_NAME = ".work-data";
enum SignInState {
GLOBAL,
EMBEDDED
}
@@ -21,7 +21,7 @@ import graphql.ErrorType;
import graphql.GraphQLError;
import graphql.language.SourceLocation;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.sql.SQLState;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
@@ -38,6 +38,7 @@ public class DBWebException extends DBException implements GraphQLError {
public static final String ERROR_CODE_SESSION_EXPIRED = "sessionExpired";
public static final String ERROR_CODE_ACCESS_DENIED = "accessDenied";
public static final String ERROR_CODE_SERVER_NOT_INITIALIZED = "serverNotInitialized";
public static final String ERROR_CODE_LICENSE_DENIED = "licenseRequired";
public static final String ERROR_CODE_IDENT_REQUIRED = "identRequired";
public static final String ERROR_CODE_AUTH_REQUIRED = "authRequired";
@@ -65,12 +66,8 @@ public class DBWebException extends DBException implements GraphQLError {
this.webErrorCode = errorCode;
}
public DBWebException(Throwable cause, DBPDataSource dataSource) {
super(cause, dataSource);
}
public DBWebException(String message, Throwable cause, DBPDataSource dataSource) {
super(makeMessage(message, cause), cause, dataSource);
public DBWebException(Throwable cause) {
super(null, cause);
}
public String getWebErrorCode() {
@@ -128,14 +125,14 @@ public class DBWebException extends DBException implements GraphQLError {
//stString = stString.substring(divPos + 1).trim();
}
extensions.put("stackTrace", stString.trim());
int errorCode = getErrorCode();
int errorCode = SQLState.getCodeFromException(this);
if (errorCode != ERROR_CODE_NONE) {
extensions.put("errorCode", errorCode);
}
if (!CommonUtils.isEmpty(webErrorCode)) {
extensions.put("webErrorCode", webErrorCode);
}
String databaseState = getDatabaseState();
String databaseState = SQLState.getStateFromException(this);
if (databaseState != null) {
extensions.put("databaseState", databaseState);
}
@@ -29,6 +29,7 @@ import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.net.DBWNetworkProfile;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.secret.DBSSecretController;
import org.jkiss.dbeaver.model.struct.DBSObjectFilter;
@@ -51,6 +52,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
this.dataSourceFilter = filter;
}
@NotNull
@Override
public DBPProject getProject() {
return dataSourceRegistry.getProject();
@@ -58,7 +60,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
@Nullable
@Override
public DBPDataSourceContainer getDataSource(String id) {
public DBPDataSourceContainer getDataSource(@NotNull String id) {
DBPDataSourceContainer dataSource = dataSourceRegistry.getDataSource(id);
if (dataSource == null || dataSourceFilter != null && !dataSourceFilter.filter(dataSource)) {
return null;
@@ -68,7 +70,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
@Nullable
@Override
public DBPDataSourceContainer getDataSource(DBPDataSource dataSource) {
public DBPDataSourceContainer getDataSource(@NotNull DBPDataSource dataSource) {
if (dataSourceFilter != null && !dataSourceFilter.filter(dataSource.getContainer())) {
return null;
}
@@ -107,13 +109,13 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
@NotNull
@Override
public DBPDataSourceContainer createDataSource(DBPDriver driver, DBPConnectionConfiguration connConfig) {
public DBPDataSourceContainer createDataSource(@NotNull DBPDriver driver, @NotNull DBPConnectionConfiguration connConfig) {
return dataSourceRegistry.createDataSource(driver, connConfig);
}
@NotNull
@Override
public DBPDataSourceContainer createDataSource(DBPDataSourceContainer source) {
public DBPDataSourceContainer createDataSource(@NotNull DBPDataSourceContainer source) {
return dataSourceRegistry.createDataSource(source);
}
@@ -164,18 +166,20 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
return dataSourceRegistry.getRootFolders();
}
@Nullable
@Override
public DBPDataSourceFolder getFolder(String path) {
public DBPDataSourceFolder getFolder(@NotNull String path) {
return dataSourceRegistry.getFolder(path);
}
@NotNull
@Override
public DBPDataSourceFolder addFolder(DBPDataSourceFolder parent, String name) {
public DBPDataSourceFolder addFolder(@Nullable DBPDataSourceFolder parent, @NotNull String name) {
return dataSourceRegistry.addFolder(parent, name);
}
@Override
public void removeFolder(DBPDataSourceFolder folder, boolean dropContents) {
public void removeFolder(@NotNull DBPDataSourceFolder folder, boolean dropContents) {
dataSourceRegistry.removeFolder(folder, dropContents);
}
@@ -197,18 +201,18 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
}
@Override
public void updateSavedFilter(DBSObjectFilter filter) {
public void updateSavedFilter(@NotNull DBSObjectFilter filter) {
dataSourceRegistry.updateSavedFilter(filter);
}
@Override
public void removeSavedFilter(String filterName) {
public void removeSavedFilter(@NotNull String filterName) {
dataSourceRegistry.removeSavedFilter(filterName);
}
@Nullable
@Override
public DBWNetworkProfile getNetworkProfile(String source, String name) {
public DBWNetworkProfile getNetworkProfile(@Nullable String source, @NotNull String name) {
return dataSourceRegistry.getNetworkProfile(source, name);
}
@@ -219,18 +223,18 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
}
@Override
public void updateNetworkProfile(DBWNetworkProfile profile) {
public void updateNetworkProfile(@NotNull DBWNetworkProfile profile) {
dataSourceRegistry.updateNetworkProfile(profile);
}
@Override
public void removeNetworkProfile(DBWNetworkProfile profile) {
public void removeNetworkProfile(@NotNull DBWNetworkProfile profile) {
dataSourceRegistry.removeNetworkProfile(profile);
}
@Nullable
@Override
public DBAAuthProfile getAuthProfile(String id) {
public DBAAuthProfile getAuthProfile(@NotNull String id) {
return dataSourceRegistry.getAuthProfile(id);
}
@@ -247,12 +251,17 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
}
@Override
public void updateAuthProfile(DBAAuthProfile profile) {
public void updateAuthProfile(@NotNull DBAAuthProfile profile) {
dataSourceRegistry.updateAuthProfile(profile);
}
@Override
public void removeAuthProfile(DBAAuthProfile profile) {
public void setAuthProfiles(@NotNull Collection<DBAAuthProfile> profiles) {
dataSourceRegistry.setAuthProfiles(profiles);
}
@Override
public void removeAuthProfile(@NotNull DBAAuthProfile profile) {
dataSourceRegistry.removeAuthProfile(profile);
}
@@ -271,6 +280,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
dataSourceRegistry.refreshConfig(dataSourceIds);
}
@Nullable
@Override
public Throwable getLastError() {
return dataSourceRegistry.getLastError();
@@ -287,7 +297,7 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
}
@Override
public void notifyDataSourceListeners(DBPEvent event) {
public void notifyDataSourceListeners(@NotNull DBPEvent event) {
dataSourceRegistry.notifyDataSourceListeners(event);
}
@@ -307,11 +317,18 @@ public class WebDataSourceRegistryProxy implements DBPDataSourceRegistry, DataSo
dataSourceRegistry.setAuthCredentialsProvider(authCredentialsProvider);
}
@NotNull
@Override
public Set<DBPDataSourceFolder> getTemporaryFolders() {
return dataSourceRegistry.getTemporaryFolders();
}
@NotNull
@Override
public DBPPreferenceStore getPreferenceStore() {
return dataSourceRegistry.getPreferenceStore();
}
@Override
public boolean loadDataSources(
@NotNull List<DBPDataSourceConfigurationStorage> storages,
@@ -0,0 +1,38 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver;
import io.cloudbeaver.model.session.WebHeadlessSession;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMUtils;
public class WebHeadlessSessionProjectImpl extends WebProjectImpl {
public WebHeadlessSessionProjectImpl(
@NotNull WebHeadlessSession session,
@NotNull RMProject project
) {
super(
session.getWorkspace(),
session.getUserContext().getRmController(),
session.getSessionContext(),
project,
session.getUserContext().getPreferenceStore(),
RMUtils.getProjectPath(project)
);
}
}
@@ -17,29 +17,39 @@
package io.cloudbeaver;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMSessionContext;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.task.DBTTaskManager;
import org.jkiss.dbeaver.registry.rm.DataSourceRegistryRM;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import java.nio.file.Path;
public abstract class WebProjectImpl extends BaseWebProjectImpl {
private static final Log log = Log.getLog(WebProjectImpl.class);
@NotNull
protected final DBPPreferenceStore preferenceStore;
public WebProjectImpl(
@NotNull DBPWorkspace workspace,
@NotNull RMController resourceController,
@NotNull SMSessionContext sessionContext,
@NotNull RMProject project,
@NotNull DataSourceFilter dataSourceFilter
@NotNull DBPPreferenceStore preferenceStore,
@NotNull Path path
) {
super(workspace, resourceController, sessionContext, project, dataSourceFilter);
super(workspace, resourceController, sessionContext, project, path);
this.preferenceStore = preferenceStore;
}
@Nullable
@Override
public Object getProjectProperty(String propName) {
try {
@@ -51,7 +61,7 @@ public abstract class WebProjectImpl extends BaseWebProjectImpl {
}
@Override
public void setProjectProperty(String propName, Object propValue) {
public void setProjectProperty(@NotNull String propName, @Nullable Object propValue) {
try {
getResourceController().setProjectProperty(getId(), propName, propValue);
} catch (DBException e) {
@@ -64,13 +74,24 @@ public abstract class WebProjectImpl extends BaseWebProjectImpl {
return DBWorkbench.isDistributed();
}
@NotNull
@Override
public DBTTaskManager getTaskManager() {
throw new IllegalStateException("Task manager not supported");
}
@NotNull
@Override
protected DBPDataSourceRegistry createDataSourceRegistry() {
return new WebDataSourceRegistryProxy(
new DataSourceRegistryRM(this, getResourceController()),
dataSourceFilter
new DataSourceRegistryRM(this, getResourceController(), preferenceStore),
getDataSourceFilter()
);
}
@NotNull
public DataSourceFilter getDataSourceFilter() {
return (ds) -> true;
}
}
@@ -0,0 +1,118 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver;
import io.cloudbeaver.model.session.WebSession;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPEvent;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.security.SMObjectType;
import org.jkiss.dbeaver.model.security.user.SMObjectPermissions;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Global project.
* Connections there can be not accessible.
*/
public class WebSessionGlobalProjectImpl extends WebSessionProjectImpl {
private static final Log log = Log.getLog(WebSessionGlobalProjectImpl.class);
private Set<String> accessibleConnectionIds = Collections.emptySet();
public WebSessionGlobalProjectImpl(@NotNull WebSession webSession, @NotNull RMProject project) {
super(webSession, project);
}
/**
* Update info about accessible connections from a database.
*/
public synchronized void refreshAccessibleConnectionIds() {
this.accessibleConnectionIds = readAccessibleConnectionIds();
}
@NotNull
private Set<String> readAccessibleConnectionIds() {
try {
return webSession.getSecurityController()
.getAllAvailableObjectsPermissions(SMObjectType.datasource)
.stream()
.map(SMObjectPermissions::getObjectId)
.collect(Collectors.toSet());
} catch (DBException e) {
webSession.addSessionError(e);
log.error("Error reading connection grants", e);
return Collections.emptySet();
}
}
/**
* Checks if connection is accessible for current user.
*/
public boolean isDataSourceAccessible(@NotNull DBPDataSourceContainer dataSource) {
return dataSource.isExternallyProvided() ||
dataSource.isTemporary() ||
webSession.hasPermission(DBWConstants.PERMISSION_ADMIN) ||
accessibleConnectionIds.contains(dataSource.getId());
}
/**
* Adds a connection if it became accessible.
* The method is processed when connection permissions were updated.
*/
public synchronized void addAccessibleConnectionToCache(@NotNull String dsId) {
if (!getRMProject().isGlobal()) {
return;
}
this.accessibleConnectionIds.add(dsId);
var registry = getDataSourceRegistry();
var dataSource = registry.getDataSource(dsId);
if (dataSource != null) {
addConnection(dataSource);
// reflect changes is navigator model
registry.notifyDataSourceListeners(new DBPEvent(DBPEvent.Action.OBJECT_ADD, dataSource, true));
}
}
/**
* Removes a connection if it became not accessible.
* The method is processed when connection permissions were updated.
*/
public synchronized void removeAccessibleConnectionFromCache(@NotNull String dsId) {
if (!getRMProject().isGlobal()) {
return;
}
var registry = getDataSourceRegistry();
var dataSource = registry.getDataSource(dsId);
if (dataSource != null) {
this.accessibleConnectionIds.remove(dsId);
removeConnection(dataSource);
// reflect changes is navigator model
registry.notifyDataSourceListeners(new DBPEvent(DBPEvent.Action.OBJECT_REMOVE, dataSource));
dataSource.dispose();
}
}
@NotNull
public DataSourceFilter getDataSourceFilter() {
return this::isDataSourceAccessible;
}
}
@@ -16,18 +16,60 @@
*/
package io.cloudbeaver;
import io.cloudbeaver.model.WebConnectionInfo;
import io.cloudbeaver.model.session.WebSession;
import io.cloudbeaver.utils.WebDataSourceUtils;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistryCache;
import org.jkiss.dbeaver.model.navigator.DBNModel;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMUtils;
import org.jkiss.dbeaver.model.websocket.event.WSEventType;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.runtime.jobs.DisconnectJob;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
public class WebSessionProjectImpl extends WebProjectImpl {
private static final Log log = Log.getLog(WebSessionProjectImpl.class);
protected final WebSession webSession;
private final Map<String, WebConnectionInfo> connections = new HashMap<>();
private boolean registryIsLoaded = false;
private final WebSession webSession;
public WebSessionProjectImpl(
@NotNull WebSession webSession,
@NotNull RMProject project
) {
super(
webSession.getWorkspace(),
webSession.getRmController(),
webSession.getSessionContext(),
project,
webSession.getUserPreferenceStore(),
RMUtils.getProjectPath(project)
);
this.webSession = webSession;
}
public WebSessionProjectImpl(@NotNull WebSession webSession, @NotNull RMProject project, @NotNull DataSourceFilter dataSourceFilter) {
super(webSession.getWorkspace(), webSession.getRmController(), webSession.getSessionContext(), project, dataSourceFilter);
public WebSessionProjectImpl(
@NotNull WebSession webSession,
@NotNull RMProject project,
@NotNull Path path
) {
super(
webSession.getWorkspace(),
webSession.getRmController(),
webSession.getSessionContext(),
project,
webSession.getUserPreferenceStore(),
path
);
this.webSession = webSession;
}
@@ -36,4 +78,156 @@ public class WebSessionProjectImpl extends WebProjectImpl {
public DBNModel getNavigatorModel() {
return webSession.getNavigatorModel();
}
@NotNull
@Override
protected DBPDataSourceRegistry createDataSourceRegistry() {
DBPDataSourceRegistry dataSourceRegistry = super.createDataSourceRegistry();
dataSourceRegistry.setAuthCredentialsProvider(webSession);
return dataSourceRegistry;
}
private synchronized void addDataSourcesToCache() {
if (registryIsLoaded) {
return;
}
getDataSourceRegistry().getDataSources().forEach(this::addConnection);
Throwable lastError = getDataSourceRegistry().getLastError();
if (lastError != null) {
webSession.addSessionError(lastError);
log.error("Error refreshing connections from project '" + getId() + "'", lastError);
}
registryIsLoaded = true;
}
@Override
public void dispose() {
super.dispose();
Map<String, WebConnectionInfo> conCopy;
synchronized (this.connections) {
conCopy = new HashMap<>(this.connections);
this.connections.clear();
}
for (WebConnectionInfo connectionInfo : conCopy.values()) {
if (connectionInfo.isConnected()) {
new DisconnectJob(connectionInfo.getDataSourceContainer()).schedule();
}
}
}
/**
* Returns web connection info from cache (if exists).
*/
@Nullable
public WebConnectionInfo findWebConnectionInfo(@NotNull String connectionId) {
synchronized (connections) {
return connections.get(connectionId);
}
}
/**
* Returns web connection info from cache, adds it to cache if not present.
* Throws exception if connection is not found.
*/
@NotNull
public WebConnectionInfo getWebConnectionInfo(@NotNull String connectionId) throws DBWebException {
WebConnectionInfo connectionInfo = findWebConnectionInfo(connectionId);
if (connectionInfo != null) {
return connectionInfo;
}
DBPDataSourceContainer dataSource = getDataSourceRegistry().getDataSource(connectionId);
if (dataSource != null) {
return addConnection(dataSource);
}
throw new DBWebException("Connection '%s' not found".formatted(connectionId));
}
/**
* Adds connection to project cache.
*/
@NotNull
public synchronized WebConnectionInfo addConnection(@NotNull DBPDataSourceContainer dataSourceContainer) {
WebConnectionInfo connection = new WebConnectionInfo(webSession, dataSourceContainer);
synchronized (connections) {
connections.put(dataSourceContainer.getId(), connection);
}
return connection;
}
/**
* Removes connection from project cache.
*/
public void removeConnection(@NotNull DBPDataSourceContainer dataSourceContainer) {
WebConnectionInfo webConnectionInfo = connections.get(dataSourceContainer.getId());
if (webConnectionInfo != null) {
webConnectionInfo.clearCache();
synchronized (connections) {
connections.remove(dataSourceContainer.getId());
}
}
}
/**
* Loads connection from registry if they are not loaded.
*
* @return connections from cache.
*/
public List<WebConnectionInfo> getConnections() {
if (!registryIsLoaded) {
addDataSourcesToCache();
registryIsLoaded = true;
}
synchronized (connections) {
return new ArrayList<>(connections.values());
}
}
/**
* updates data sources based on event in web session
*
* @param dataSourceIds list of updated connections
* @param type type of event
*/
public synchronized boolean updateProjectDataSources(@NotNull List<String> dataSourceIds, @NotNull WSEventType type) {
var sendDataSourceUpdatedEvent = false;
DBPDataSourceRegistry registry = getDataSourceRegistry();
// save old connections
var oldDataSources = dataSourceIds.stream()
.map(registry::getDataSource)
.filter(Objects::nonNull)
.collect(Collectors.toMap(
DBPDataSourceContainer::getId,
ds -> new DataSourceDescriptor((DataSourceDescriptor) ds, ds.getRegistry())
));
if (type == WSEventType.DATASOURCE_CREATED || type == WSEventType.DATASOURCE_UPDATED) {
registry.refreshConfig(dataSourceIds);
}
for (String dsId : dataSourceIds) {
DataSourceDescriptor ds = (DataSourceDescriptor) registry.getDataSource(dsId);
if (ds == null) {
continue;
}
switch (type) {
case DATASOURCE_CREATED -> {
addConnection(ds);
sendDataSourceUpdatedEvent = true;
}
case DATASOURCE_UPDATED -> // if settings were changed we need to send event
sendDataSourceUpdatedEvent |= !ds.equalSettings(oldDataSources.get(dsId));
case DATASOURCE_DELETED -> {
WebDataSourceUtils.disconnectDataSource(webSession, ds);
if (registry instanceof DBPDataSourceRegistryCache dsrc) {
dsrc.removeDataSourceFromList(ds);
}
removeConnection(ds);
sendDataSourceUpdatedEvent = true;
}
default -> {
}
}
}
return sendDataSourceUpdatedEvent;
}
}
@@ -25,6 +25,7 @@ public interface CBAuthConstants {
String CB_AUTH_ID_REQUEST_PARAM = "authId";
String CB_AUTO_LOGIN_REQUEST_PARAM = "autoLogin";
String CB_REDIRECT_URL_REQUEST_PARAM = "redirectUrl";
String CB_FORCE_SESSIONS_LOGOUT = "forceSessionsLogout";
// Default max idle time (10 minutes)
long MAX_SESSION_IDLE_TIME = 10 * 60 * 1000;
@@ -27,17 +27,12 @@ import java.util.Map;
* Federated auth provider.
* Provides links to external auth resource
*/
public interface SMAuthProviderFederated {
public interface SMAuthProviderFederated extends SMSignOutLinkProvider {
@NotNull
String getSignInLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException;
/**
* @return a common link for logout, not related with the user context
*/
@NotNull
String getCommonSignOutLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException;
@Override
default String getUserSignOutLink(
@NotNull SMAuthProviderCustomConfiguration providerConfig,
@NotNull Map<String, Object> userCredentials
@@ -51,6 +46,9 @@ public interface SMAuthProviderFederated {
@Nullable
String getAcsLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException;
@Nullable
String getEntityIdLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException;
@Nullable
default String getRedirectLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException {
return null;
@@ -0,0 +1,37 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.auth;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
import java.util.Map;
public interface SMSignOutLinkProvider {
/**
* @return a common link for logout, not related with the user context
*/
@NotNull
String getCommonSignOutLink(String id, @NotNull Map<String, Object> providerConfig) throws DBException;
String getUserSignOutLink(
@NotNull SMAuthProviderCustomConfiguration providerConfig,
@NotNull Map<String, Object> userCredentials
) throws DBException;
}
@@ -0,0 +1,79 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.auth.provider.fa;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.auth.*;
import java.time.LocalDateTime;
import java.util.Map;
public abstract class AbstractSessionExternal implements SMSessionExternal {
@NotNull
protected final Map<String, Object> authParameters;
@NotNull
protected final SMSession parentSession;
@NotNull
protected final SMAuthSpace space;
protected AbstractSessionExternal(
@NotNull SMSession parentSession,
@NotNull SMAuthSpace space,
@NotNull Map<String, Object> authParameters
) {
this.parentSession = parentSession;
this.space = space;
this.authParameters = authParameters;
}
@NotNull
@Override
public SMAuthSpace getSessionSpace() {
return space;
}
@NotNull
@Override
public SMSessionContext getSessionContext() {
return this.parentSession.getSessionContext();
}
@Nullable
@Override
public SMSessionPrincipal getSessionPrincipal() {
return parentSession.getSessionPrincipal();
}
@NotNull
@Override
public LocalDateTime getSessionStart() {
return parentSession.getSessionStart();
}
@Override
public void close() {
// do nothing
}
@Override
public Map<String, Object> getAuthParameters() {
return authParameters;
}
}
@@ -31,4 +31,8 @@ public interface SMProvisioner {
@NotNull SMAuthProviderCustomConfiguration customConfiguration,
@NotNull SMProvisioningFilter filter
) throws DBException;
default boolean isAuthRoleProvided(SMAuthProviderCustomConfiguration configuration) {
return false;
}
}
@@ -24,12 +24,11 @@ import io.cloudbeaver.service.sql.WebDataFormat;
import io.cloudbeaver.utils.CBModelConstants;
import io.cloudbeaver.utils.WebAppUtils;
import io.cloudbeaver.utils.WebCommonUtils;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPDataSourceFolder;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.admin.sessions.DBAServerSessionManager;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.connection.DBPAuthModelDescriptor;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
@@ -40,6 +39,7 @@ import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.preferences.DBPPropertySource;
import org.jkiss.dbeaver.model.rm.RMConstants;
import org.jkiss.dbeaver.model.rm.RMProjectPermission;
import org.jkiss.dbeaver.model.runtime.DBRRunnableParametrized;
import org.jkiss.dbeaver.runtime.DBWorkbench;
@@ -56,6 +56,17 @@ public class WebConnectionInfo {
private static final Log log = Log.getLog(WebConnectionInfo.class);
public static final String SECURED_VALUE = "********";
private static final String FEATURE_HAS_TOOLS = "hasTools";
private static final String FEATURE_CONNECTED = "connected";
private static final String FEATURE_VIRTUAL = "virtual";
private static final String FEATURE_TEMPORARY = "temporary";
private static final String FEATURE_READ_ONLY = "readOnly";
private static final String FEATURE_PROVIDED = "provided";
private static final String FEATURE_MANAGEABLE = "manageable";
private static final String TOOL_SESSION_MANAGER = "sessionManager";
private final WebSession session;
private final DBPDataSourceContainer dataSourceContainer;
private WebServerError connectError;
@@ -243,22 +254,25 @@ public class WebConnectionInfo {
List<String> features = new ArrayList<>();
if (dataSourceContainer.isConnected()) {
features.add("connected");
features.add(FEATURE_CONNECTED);
if (!getTools().isEmpty()) {
features.add(FEATURE_HAS_TOOLS);
}
}
if (dataSourceContainer.isHidden()) {
features.add("virtual");
features.add(FEATURE_VIRTUAL);
}
if (dataSourceContainer.isTemporary()) {
features.add("temporary");
features.add(FEATURE_TEMPORARY);
}
if (dataSourceContainer.isConnectionReadOnly()) {
features.add("readOnly");
features.add(FEATURE_READ_ONLY);
}
if (dataSourceContainer.isProvided()) {
features.add("provided");
features.add(FEATURE_PROVIDED);
}
if (dataSourceContainer.isManageable()) {
features.add("manageable");
features.add(FEATURE_MANAGEABLE);
}
return features.toArray(new String[0]);
@@ -384,6 +398,16 @@ public class WebConnectionInfo {
}
}
@Property
public Map<String, String> getMainPropertyValues() {
Map<String, String> mainProperties = new LinkedHashMap<>();
mainProperties.put(DBConstants.PROP_HOST, getHost());
mainProperties.put(DBConstants.PROP_PORT, getPort());
mainProperties.put(DBConstants.PROP_DATABASE, getDatabaseName());
mainProperties.put(DBConstants.PROP_SERVER, getServerName());
return mainProperties;
}
@Property
public Map<String, String> getProviderProperties() {
return dataSourceContainer.getConnectionConfiguration().getProviderProperties();
@@ -421,10 +445,10 @@ public class WebConnectionInfo {
private boolean hasProjectPermission(RMProjectPermission projectPermission) {
DBPProject project = dataSourceContainer.getProject();
if (!(project instanceof WebProjectImpl)) {
if (!(project instanceof WebProjectImpl webProject)) {
return false;
}
return SMUtils.hasProjectPermission(session, ((WebProjectImpl) project).getRmProject(), projectPermission);
return SMUtils.hasProjectPermission(session, webProject.getRMProject(), projectPermission);
}
private boolean canViewReadOnlyConnections() {
@@ -448,5 +472,35 @@ public class WebConnectionInfo {
return dataSourceContainer.getConnectionConfiguration().getKeepAliveInterval();
}
@Property
public boolean isAutocommit() {
Boolean isAutoCommit = dataSourceContainer.getConnectionConfiguration().getBootstrap().getDefaultAutoCommit();
if (isAutoCommit == null) {
return true;
}
return isAutoCommit;
}
@Property
public List<WebSecretInfo> getSharedSecrets() throws DBException {
return dataSourceContainer.listSharedCredentials()
.stream()
.map(WebSecretInfo::new)
.collect(Collectors.toList());
}
@NotNull
@Property
public List<String> getTools() {
if (!session.hasPermission(RMConstants.PERMISSION_DATABASE_DEVELOPER)) {
return List.of();
}
List<String> tools = new ArrayList<>();
// checks inside that datasource is not null in container, and it is adaptable to session manager class
if (DBUtils.getAdapter(DBAServerSessionManager.class, dataSourceContainer) != null) {
tools.add(TOOL_SESSION_MANAGER);
}
return tools;
}
}
@@ -53,11 +53,13 @@ public class WebProjectInfo {
}
@Property
public boolean isGlobal() { return project.getRmProject().isGlobal(); }
public boolean isGlobal() {
return project.getRMProject().isGlobal();
}
@Property
public boolean isShared() {
return project.getRmProject().isShared();
return project.getRMProject().isShared();
}
@Property
@@ -72,7 +74,7 @@ public class WebProjectInfo {
@Property
public boolean isCanEditDataSources() {
if (project.getRmProject().getType() == RMProjectType.USER && !customPrivateConnectionsEnabled) {
if (project.getRMProject().getType() == RMProjectType.USER && !customPrivateConnectionsEnabled) {
return false;
}
return hasDataSourcePermission(RMProjectPermission.DATA_SOURCES_EDIT);
@@ -94,12 +96,12 @@ public class WebProjectInfo {
}
private boolean hasDataSourcePermission(RMProjectPermission permission) {
return SMUtils.hasProjectPermission(session, project.getRmProject(), permission);
return SMUtils.hasProjectPermission(session, project.getRMProject(), permission);
}
@Property
public RMResourceType[] getResourceTypes() {
RMResourceType[] resourceTypes = project.getRmProject().getResourceTypes();
RMResourceType[] resourceTypes = project.getRMProject().getResourceTypes();
if(resourceTypes == null) {
return ArrayUtils.toArray(RMResourceType.class, new ArrayList<>());
@@ -18,6 +18,7 @@ package io.cloudbeaver.model;
import io.cloudbeaver.model.session.WebSession;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.connection.DBPDriverConfigurationType;
@@ -27,6 +28,7 @@ import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.meta.PropertyLength;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.preferences.DBPPropertySource;
import org.jkiss.dbeaver.registry.settings.ProductSettingDescriptor;
import org.jkiss.dbeaver.runtime.properties.ObjectPropertyDescriptor;
import org.jkiss.utils.CommonUtils;
@@ -242,4 +244,12 @@ public class WebPropertyInfo {
return CommonUtils.toString(value);
}
@Nullable
@Property
public List<String> getScopes() {
if (property instanceof ProductSettingDescriptor productSettingDescriptor) {
return productSettingDescriptor.getScopes();
}
return null;
}
}
@@ -0,0 +1,38 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.secret.DBSSecretValue;
public class WebSecretInfo {
private final DBSSecretValue secretValue;
public WebSecretInfo(DBSSecretValue secretValue) {
this.secretValue = secretValue;
}
@Property
public String getDisplayName() {
return secretValue.getDisplayName();
}
@Property
public String getSecretId() {
return secretValue.getUniqueId();
}
}
@@ -17,8 +17,8 @@
package io.cloudbeaver.model;
import io.cloudbeaver.DBWebException;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.sql.DBQuotaException;
import org.jkiss.dbeaver.model.sql.SQLState;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -28,22 +28,18 @@ import java.io.StringWriter;
*/
public class WebServerError {
private String message;
private String stackTrace;
private String errorType;
private String errorCode;
private final String message;
private final String stackTrace;
private final String errorType;
private final String errorCode;
public WebServerError(Throwable ex) {
this.message = ex.getMessage();
StringWriter buf = new StringWriter();
ex.printStackTrace(new PrintWriter(buf, true));
this.stackTrace = buf.toString();
if (ex instanceof DBException) {
errorCode = String.valueOf(((DBException) ex).getErrorCode());
}
if (ex instanceof DBQuotaException) {
errorType = DBWebException.ERROR_CODE_QUOTA_EXCEEDED;
}
errorCode = String.valueOf(SQLState.getCodeFromException(ex));
errorType = ex instanceof DBQuotaException ? DBWebException.ERROR_CODE_QUOTA_EXCEEDED : null;
}
public String getMessage() {
@@ -1,144 +0,0 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.app;
import com.google.gson.annotations.Expose;
import io.cloudbeaver.auth.provider.local.LocalAuthProviderConstants;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import io.cloudbeaver.registry.WebAuthProviderRegistry;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
import org.jkiss.utils.ArrayUtils;
import java.util.*;
public abstract class BaseAuthWebAppConfiguration extends BaseWebAppConfiguration implements WebAuthConfiguration {
private String defaultAuthProvider;
private String[] enabledAuthProviders;
private final Set<SMAuthProviderCustomConfiguration> authConfigurations;
// Legacy auth configs, left for backward compatibility
@Expose(serialize = false)
private final Map<String, SMAuthProviderCustomConfiguration> authConfiguration;
public BaseAuthWebAppConfiguration() {
super();
this.defaultAuthProvider = LocalAuthProviderConstants.PROVIDER_ID;
this.enabledAuthProviders = null;
this.authConfigurations = new LinkedHashSet<>();
this.authConfiguration = new LinkedHashMap<>();
}
public BaseAuthWebAppConfiguration(BaseAuthWebAppConfiguration src) {
super(src);
this.defaultAuthProvider = src.defaultAuthProvider;
this.enabledAuthProviders = src.enabledAuthProviders;
this.authConfigurations = new LinkedHashSet<>(src.authConfigurations);
this.authConfiguration = new LinkedHashMap<>(src.authConfiguration);
}
@Override
public String getDefaultAuthProvider() {
return defaultAuthProvider;
}
public void setDefaultAuthProvider(String defaultAuthProvider) {
this.defaultAuthProvider = defaultAuthProvider;
}
@Override
public String[] getEnabledAuthProviders() {
if (enabledAuthProviders == null) {
// No config - enable all providers (+backward compatibility)
return WebAuthProviderRegistry.getInstance().getAuthProviders()
.stream().map(WebAuthProviderDescriptor::getId).toArray(String[]::new);
}
return enabledAuthProviders;
}
public void setEnabledAuthProviders(String[] enabledAuthProviders) {
this.enabledAuthProviders = enabledAuthProviders;
}
@Override
public boolean isAuthProviderEnabled(String id) {
var authProviderDescriptor = WebAuthProviderRegistry.getInstance().getAuthProvider(id);
if (authProviderDescriptor == null) {
return false;
}
if (!ArrayUtils.contains(getEnabledAuthProviders(), id)) {
return false;
}
if (!ArrayUtils.isEmpty(authProviderDescriptor.getRequiredFeatures())) {
for (String rf : authProviderDescriptor.getRequiredFeatures()) {
if (!isFeatureEnabled(rf)) {
return false;
}
}
}
return true;
}
////////////////////////////////////////////
// Auth provider configs
@Override
public Set<SMAuthProviderCustomConfiguration> getAuthCustomConfigurations() {
return authConfigurations;
}
@Override
@Nullable
public SMAuthProviderCustomConfiguration getAuthProviderConfiguration(@NotNull String id) {
synchronized (authConfigurations) {
return authConfigurations.stream().filter(c -> c.getId().equals(id)).findAny().orElse(null);
}
}
public void addAuthProviderConfiguration(@NotNull SMAuthProviderCustomConfiguration config) {
synchronized (authConfigurations) {
authConfigurations.removeIf(c -> c.getId().equals(config.getId()));
authConfigurations.add(config);
}
}
public void setAuthProvidersConfigurations(Collection<SMAuthProviderCustomConfiguration> authProviders) {
synchronized (authConfigurations) {
authConfigurations.clear();
authConfigurations.addAll(authProviders);
}
}
public boolean deleteAuthProviderConfiguration(@NotNull String id) {
synchronized (authConfigurations) {
return authConfigurations.removeIf(c -> c.getId().equals(id));
}
}
public void loadLegacyCustomConfigs() {
// Convert legacy map of configs into list
if (!authConfiguration.isEmpty()) {
for (Map.Entry<String, SMAuthProviderCustomConfiguration> entry : authConfiguration.entrySet()) {
entry.getValue().setId(entry.getKey());
authConfigurations.add(entry.getValue());
}
authConfiguration.clear();
}
}
}
@@ -0,0 +1,104 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.app;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.registry.fs.FileSystemProviderRegistry;
import org.jkiss.utils.IOUtils;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
/**
* Abstract class that contains methods for loading configuration with gson.
*/
public abstract class BaseServerConfigurationController<T extends WebServerConfiguration>
implements WebServerConfigurationController<T> {
private static final Log log = Log.getLog(BaseServerConfigurationController.class);
@NotNull
private final Path homeDirectory;
protected Path workspacePath;
protected BaseServerConfigurationController(@NotNull Path homeDirectory) {
this.homeDirectory = homeDirectory;
//default workspaceLocation
this.workspacePath = homeDirectory.resolve("workspace");
}
@NotNull
public Gson getGson() {
return getGsonBuilder().create();
}
@NotNull
protected abstract GsonBuilder getGsonBuilder();
public abstract T getServerConfiguration();
@NotNull
protected synchronized void initWorkspacePath() throws DBException {
if (workspacePath != null && !IOUtils.isFileFromDefaultFS(workspacePath)) {
log.warn("Workspace directory already initialized: " + workspacePath);
}
String workspaceLocation = getWorkspaceLocation();
URI workspaceUri = URI.create(workspaceLocation);
if (workspaceUri.getScheme() == null) {
// default filesystem
this.workspacePath = getHomeDirectory().resolve(workspaceLocation);
} else {
var externalFsProvider =
FileSystemProviderRegistry.getInstance().getFileSystemProviderBySchema(workspaceUri.getScheme());
if (externalFsProvider == null) {
throw new DBException("File system not found for scheme: " + workspaceUri.getScheme());
}
ClassLoader fsClassloader = externalFsProvider.getInstance().getClass().getClassLoader();
try (FileSystem externalFileSystem = FileSystems.newFileSystem(workspaceUri,
System.getenv(),
fsClassloader);) {
this.workspacePath = externalFileSystem.provider().getPath(workspaceUri);
} catch (Exception e) {
throw new DBException("Failed to initialize workspace path: " + workspaceUri, e);
}
}
log.info("Workspace path initialized: " + workspacePath);
}
@NotNull
protected abstract String getWorkspaceLocation();
@NotNull
protected Path getHomeDirectory() {
return homeDirectory;
}
@NotNull
@Override
public Path getWorkspacePath() {
if (workspacePath == null) {
throw new RuntimeException("Workspace path not initialized");
}
return workspacePath;
}
}
@@ -29,16 +29,18 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
public static final String DEFAULT_APP_ANONYMOUS_TEAM_NAME = "user";
protected final Map<String, Object> plugins;
protected String defaultUserTeam;
protected String defaultUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME;
protected boolean resourceManagerEnabled;
protected boolean showReadOnlyConnectionInfo;
protected String[] enabledFeatures;
protected String[] disabledBetaFeatures;
public BaseWebAppConfiguration() {
this.plugins = new LinkedHashMap<>();
this.defaultUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME;
this.resourceManagerEnabled = true;
this.enabledFeatures = null;
this.disabledBetaFeatures = new String[0];
this.showReadOnlyConnectionInfo = false;
}
@@ -47,6 +49,7 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
this.defaultUserTeam = src.defaultUserTeam;
this.resourceManagerEnabled = src.resourceManagerEnabled;
this.enabledFeatures = src.enabledFeatures;
this.disabledBetaFeatures = src.disabledBetaFeatures;
this.showReadOnlyConnectionInfo = src.showReadOnlyConnectionInfo;
}
@@ -81,14 +84,18 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
return resourceManagerEnabled;
}
@Override
public boolean isFeatureEnabled(String id) {
return ArrayUtils.contains(getEnabledFeatures(), id);
}
@Override
public boolean isFeaturesEnabled(String[] features) {
return ArrayUtils.containsAll(getEnabledFeatures(), features);
}
@NotNull
@Override
public String[] getEnabledFeatures() {
if (enabledFeatures == null) {
// No config - enable all features (+backward compatibility)
@@ -105,4 +112,8 @@ public abstract class BaseWebAppConfiguration implements WebAppConfiguration {
public boolean isShowReadOnlyConnectionInfo() {
return showReadOnlyConnectionInfo;
}
public String[] getDisabledBetaFeatures() {
return disabledBetaFeatures;
}
}
@@ -16,15 +16,7 @@
*/
package io.cloudbeaver.model.app;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.cloudbeaver.DataSourceFilter;
import io.cloudbeaver.WebProjectImpl;
import io.cloudbeaver.WebSessionProjectImpl;
import io.cloudbeaver.model.log.SLF4JLogHandler;
import io.cloudbeaver.model.session.WebSession;
import io.cloudbeaver.server.WebGlobalWorkspace;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.app.IApplicationContext;
import org.jkiss.code.NotNull;
@@ -32,17 +24,16 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBFileController;
import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.auth.SMSessionContext;
import org.jkiss.dbeaver.model.data.json.JSONUtils;
import org.jkiss.dbeaver.model.impl.app.ApplicationRegistry;
import org.jkiss.dbeaver.model.impl.app.BaseApplicationImpl;
import org.jkiss.dbeaver.model.impl.app.BaseWorkspaceImpl;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.secret.DBSSecretController;
import org.jkiss.dbeaver.model.websocket.event.WSEventController;
import org.jkiss.dbeaver.registry.BaseApplicationImpl;
import org.jkiss.dbeaver.runtime.IVariableResolver;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
@@ -63,14 +54,9 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
public static final String CLI_PARAM_WEB_CONFIG = "-web-config";
public static final String LOGBACK_FILE_NAME = "logback.xml";
private static final Log log = Log.getLog(BaseWebApplication.class);
@NotNull
@Override
public DBPWorkspace createWorkspace(@NotNull DBPPlatform platform, @NotNull IWorkspace eclipseWorkspace) {
return new WebGlobalWorkspace(platform, eclipseWorkspace);
}
private String instanceId;
@Override
public RMController createResourceController(
@@ -102,31 +88,21 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
return true;
}
@Nullable
protected Path loadServerConfiguration() throws DBException {
protected boolean loadServerConfiguration() throws DBException {
Path configFilePath = getMainConfigurationFilePath().toAbsolutePath();
Path configFolder = configFilePath.getParent();
// Configure logging
Path logbackConfigPath = getLogbackConfigPath(configFolder);
if (logbackConfigPath == null) {
System.err.println("Can't find slf4j configuration file in " + configFilePath.getParent());
} else {
System.setProperty("logback.configurationFile", logbackConfigPath.toString());
}
Log.setLogHandler(new SLF4JLogHandler());
// Load config file
log.debug("Loading configuration from " + configFilePath);
try {
loadConfiguration(configFilePath);
getServerConfigurationController().loadServerConfiguration(configFilePath);
} catch (Exception e) {
log.error("Error parsing configuration", e);
return null;
return false;
}
return configFilePath;
return true;
}
@Nullable
@@ -153,7 +129,7 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
return getLogbackConfigPath(configFolder);
}
private Path getMainConfigurationFilePath() {
protected Path getMainConfigurationFilePath() {
String configPath = DEFAULT_CONFIG_FILE_PATH;
String[] args = Platform.getCommandLineArgs();
@@ -179,21 +155,6 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
return Files.exists(customConfigPath) ? customConfigPath : configPath.resolve(fileName);
}
protected abstract void loadConfiguration(Path configPath) throws DBException;
@Override
public WebProjectImpl createProjectImpl(
@NotNull WebSession webSession,
@NotNull RMProject project,
@NotNull DataSourceFilter dataSourceFilter
) {
return new WebSessionProjectImpl(
webSession,
project,
dataSourceFilter
);
}
/**
* There is no secret controller in base web app.
* Method returns VoidSecretController instance.
@@ -207,12 +168,14 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
return VoidSecretController.INSTANCE;
}
protected static Map<String, Object> getServerConfigProps(Map<String, Object> configProps) {
public static Map<String, Object> getServerConfigProps(Map<String, Object> configProps) {
return JSONUtils.getObject(configProps, "server");
}
@SuppressWarnings("unchecked")
public static void patchConfigurationWithProperties(Map<String, Object> configProps, IVariableResolver varResolver) {
public static void patchConfigurationWithProperties(
Map<String, Object> configProps, IVariableResolver varResolver
) {
for (Map.Entry<String, Object> entry : configProps.entrySet()) {
Object propValue = entry.getValue();
if (propValue instanceof String) {
@@ -247,16 +210,35 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
protected abstract void startServer() throws DBException;
@Override
public String getApplicationInstanceId() throws DBException {
try {
byte[] macAddress = RuntimeUtils.getLocalMacAddress();
String appId = ApplicationRegistry.getInstance().getApplication().getId();
return appId + "_" + CommonUtils.toHexString(macAddress) + getServerPort();
} catch (Exception e) {
throw new DBException("Error during generation instance id generation", e);
public synchronized String getApplicationInstanceId() throws DBException {
if (instanceId == null) {
try {
byte[] macAddress = RuntimeUtils.getLocalMacAddress();
instanceId = String.join(
"_",
ApplicationRegistry.getInstance().getApplication().getId(),
getWorkspaceIdProperty(), // workspace id is read from property file
CommonUtils.toHexString(macAddress),
CommonUtils.toString(getServerPort())
);
} catch (Exception e) {
throw new DBException("Error during generation instance id generation", e);
}
}
return instanceId;
}
@NotNull
public String getWorkspaceIdProperty() throws DBException {
return BaseWorkspaceImpl.readWorkspaceIdProperty();
}
@Override
public Path getWorkspaceDirectory() {
return getServerConfigurationController().getWorkspacePath();
}
public String getApplicationId() {
try {
return getApplicationInstanceId();
@@ -270,14 +252,18 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements
return null;
}
protected Gson getGson() {
return getGsonBuilder().create();
}
protected abstract GsonBuilder getGsonBuilder();
public abstract WebServerConfigurationController getServerConfigurationController();
@Override
public boolean isEnvironmentVariablesAccessible() {
return false;
}
protected void closeResource(String name, Runnable closeFunction) {
try {
closeFunction.run();
} catch (Exception e) {
log.error("Failed close " + name, e);
}
}
}
@@ -21,8 +21,13 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.auth.SMSessionContext;
import org.jkiss.dbeaver.model.exec.DBCFeatureNotSupportedException;
import org.jkiss.dbeaver.model.secret.DBSSecretController;
import org.jkiss.dbeaver.model.secret.DBSSecretControllerAuthorized;
import org.jkiss.dbeaver.model.secret.DBSSecretObject;
import org.jkiss.dbeaver.model.secret.DBSSecretValue;
import java.util.List;
/**
* Void secret controller.
@@ -37,15 +42,21 @@ public class VoidSecretController implements DBSSecretController, DBSSecretContr
@Nullable
@Override
public String getSecretValue(@NotNull String secretId) {
public String getPrivateSecretValue(@NotNull String secretId) {
return null;
}
@Override
public void setSecretValue(@NotNull String secretId, @Nullable String secretValue) throws DBException {
public void setPrivateSecretValue(@NotNull String secretId, @Nullable String secretValue) throws DBException {
throw new DBException("Secret controller is read-only");
}
@NotNull
@Override
public List<DBSSecretValue> discoverCurrentUserSecrets(@NotNull DBSSecretObject secretObject) throws DBException {
throw new DBCFeatureNotSupportedException("Secrets discovery not supported");
}
@Override
public void flushChanges() {
}
@@ -17,6 +17,7 @@
package io.cloudbeaver.model.app;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import java.util.Map;
@@ -28,6 +29,7 @@ public interface WebAppConfiguration {
boolean isAnonymousAccessEnabled();
@Nullable
<T> T getResourceQuota(String quotaId);
String getDefaultUserTeam();
@@ -42,6 +44,11 @@ public interface WebAppConfiguration {
boolean isFeatureEnabled(String id);
@NotNull
default String[] getEnabledFeatures() {
return new String[0];
}
default boolean isSupportsCustomConnections() {
return true;
}
@@ -16,9 +16,6 @@
*/
package io.cloudbeaver.model.app;
import io.cloudbeaver.DataSourceFilter;
import io.cloudbeaver.WebProjectImpl;
import io.cloudbeaver.model.session.WebSession;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBFileController;
@@ -27,13 +24,13 @@ import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.auth.SMSessionContext;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.secret.DBSSecretController;
import org.jkiss.dbeaver.model.security.SMAdminController;
import org.jkiss.dbeaver.model.security.SMController;
import org.jkiss.dbeaver.model.websocket.event.WSEventController;
import java.nio.file.Path;
import java.util.Map;
/**
* Base interface for web application
@@ -41,8 +38,14 @@ import java.nio.file.Path;
public interface WebApplication extends DBPApplication {
boolean isConfigurationMode();
default boolean isInitializationMode() {
return false;
}
WebAppConfiguration getAppConfiguration();
WebServerConfiguration getServerConfiguration();
Path getDataDirectory(boolean create);
Path getWorkspaceDirectory();
@@ -51,12 +54,6 @@ public interface WebApplication extends DBPApplication {
boolean isMultiNode();
WebProjectImpl createProjectImpl(
@NotNull WebSession webSession,
@NotNull RMProject project,
@NotNull DataSourceFilter dataSourceFilter
);
SMController createSecurityController(@NotNull SMCredentialsProvider credentialsProvider) throws DBException;
SMAdminController getAdminSecurityController(@NotNull SMCredentialsProvider credentialsProvider) throws DBException;
@@ -93,4 +90,8 @@ public interface WebApplication extends DBPApplication {
int getServerPort();
boolean isLicenseRequired();
default void getStatusInfo(Map<String, Object> infoMap) {
}
}
@@ -20,6 +20,8 @@ package io.cloudbeaver.model.app;
import io.cloudbeaver.auth.CBAuthConstants;
import org.jkiss.dbeaver.DBException;
import java.util.List;
public interface WebAuthApplication extends WebApplication {
WebAuthConfiguration getAuthConfiguration();
@@ -30,4 +32,6 @@ public interface WebAuthApplication extends WebApplication {
}
void flushConfiguration() throws DBException;
String getDefaultAuthRole();
}
@@ -0,0 +1,43 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.app;
import io.cloudbeaver.server.WebServerPreferenceStore;
import org.jkiss.code.NotNull;
import java.util.Map;
/**
* Web server configuration.
* Contains only server configuration properties.
*/
public interface WebServerConfiguration {
boolean isDevelMode();
default String getRootURI() {
return "";
}
/**
* @return the setting values that will be used in {@link WebServerPreferenceStore}
*/
@NotNull
default Map<String, Object> getProductSettings() {
return Map.of();
}
}
@@ -0,0 +1,49 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.app;
import com.google.gson.Gson;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import java.nio.file.Path;
import java.util.Map;
/**
* Server configuration controller.
* Works with app server configuration (loads, updates)
*/
public interface WebServerConfigurationController<T extends WebServerConfiguration> {
/**
* Loads server configuration.
*/
void loadServerConfiguration(Path configPath) throws DBException;
@NotNull
default Map<String, Object> getOriginalConfigurationProperties() {
return Map.of();
}
@NotNull
Path getWorkspacePath();
@NotNull
Gson getGson();
void validateFinalServerConfiguration() throws DBException;
}
@@ -14,21 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.server;
package io.cloudbeaver.model.config;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.cloudbeaver.DBWebException;
import io.cloudbeaver.WebServiceUtils;
import io.cloudbeaver.model.app.BaseAuthWebAppConfiguration;
import com.google.gson.annotations.Expose;
import io.cloudbeaver.auth.provider.local.LocalAuthProviderConstants;
import io.cloudbeaver.model.app.BaseWebAppConfiguration;
import io.cloudbeaver.model.app.WebAuthConfiguration;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import io.cloudbeaver.registry.WebAuthProviderRegistry;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
@@ -38,11 +36,15 @@ import java.util.*;
/**
* Application configuration
*/
public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthConfiguration {
public class CBAppConfig extends BaseWebAppConfiguration implements WebAuthConfiguration {
private static final Log log = Log.getLog(CBAppConfig.class);
public static final DataSourceNavigatorSettings.Preset PRESET_WEB = new DataSourceNavigatorSettings.Preset("web", "Web", "Default view");
public static final DataSourceNavigatorSettings DEFAULT_VIEW_SETTINGS = PRESET_WEB.getSettings();
private final Set<SMAuthProviderCustomConfiguration> authConfigurations;
// Legacy auth configs, left for backward compatibility
@Expose(serialize = false)
private final Map<String, SMAuthProviderCustomConfiguration> authConfiguration;
private boolean supportsCustomConnections;
private boolean supportsConnectionBrowser;
@@ -56,6 +58,7 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
private boolean redirectOnFederatedAuth;
private boolean anonymousAccessEnabled;
private boolean grantConnectionsAccessToAnonymousTeam;
private boolean systemVariablesResolvingEnabled;
@Deprecated
private String anonymousUserRole;
private String anonymousUserTeam;
@@ -65,9 +68,14 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
private DataSourceNavigatorSettings defaultNavigatorSettings;
private final Map<String, Object> resourceQuotas;
private String defaultAuthProvider;
private String[] enabledAuthProviders;
public CBAppConfig() {
super();
this.defaultAuthProvider = LocalAuthProviderConstants.PROVIDER_ID;
this.enabledAuthProviders = null;
this.authConfigurations = new LinkedHashSet<>();
this.authConfiguration = new LinkedHashMap<>();
this.anonymousAccessEnabled = false;
this.anonymousUserRole = DEFAULT_APP_ANONYMOUS_TEAM_NAME;
this.anonymousUserTeam = DEFAULT_APP_ANONYMOUS_TEAM_NAME;
@@ -85,10 +93,15 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
this.forwardProxy = false;
this.linkExternalCredentialsWithUser = true;
this.grantConnectionsAccessToAnonymousTeam = false;
this.systemVariablesResolvingEnabled = false;
}
public CBAppConfig(CBAppConfig src) {
super(src);
this.defaultAuthProvider = src.defaultAuthProvider;
this.enabledAuthProviders = src.enabledAuthProviders;
this.authConfigurations = new LinkedHashSet<>(src.authConfigurations);
this.authConfiguration = new LinkedHashMap<>(src.authConfiguration);
this.anonymousAccessEnabled = src.anonymousAccessEnabled;
this.anonymousUserRole = src.anonymousUserRole;
this.anonymousUserTeam = src.anonymousUserTeam;
@@ -106,6 +119,7 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
this.forwardProxy = src.forwardProxy;
this.linkExternalCredentialsWithUser = src.linkExternalCredentialsWithUser;
this.grantConnectionsAccessToAnonymousTeam = src.grantConnectionsAccessToAnonymousTeam;
this.systemVariablesResolvingEnabled = src.systemVariablesResolvingEnabled;
}
@Override
@@ -166,6 +180,10 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
return enabledDrivers;
}
public void setEnabledDrivers(String[] enabledDrivers) {
this.enabledDrivers = enabledDrivers;
}
public String[] getDisabledDrivers() {
return disabledDrivers;
}
@@ -201,19 +219,6 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
return getPluginConfig(pluginId, false);
}
public <T> T getPluginOptions(@NotNull String pluginId, @NotNull String option, Class<T> theClass) throws DBException {
Map<String, Object> iamSettingsMap = CBPlatform.getInstance().getApplication().getAppConfiguration().getPluginOption(
pluginId, option);
if (CommonUtils.isEmpty(iamSettingsMap)) {
throw new DBException("Settings '" + option + "' not specified in plugin '" + pluginId + "' configuration");
}
Gson gson = new GsonBuilder().create();
return gson.fromJson(
gson.toJsonTree(iamSettingsMap),
theClass);
}
////////////////////////////////////////////
// Quotas
@@ -261,39 +266,100 @@ public class CBAppConfig extends BaseAuthWebAppConfiguration implements WebAuthC
return grantConnectionsAccessToAnonymousTeam;
}
// we disable embedded drivers by default and enable it in enabled drivers list
// that's why we need so complicated logic for disabling drivers
public void updateDisabledDriversConfig(String[] disabledDriversConfig) {
Set<String> disabledIds = new LinkedHashSet<>(Arrays.asList(disabledDriversConfig));
Set<String> enabledIds = new LinkedHashSet<>(Arrays.asList(this.enabledDrivers));
// remove all disabled embedded drivers from enabled drivers list
enabledIds.removeAll(disabledIds);
// enable embedded driver if it is not in disabled drivers list
for (String driverId : this.disabledDrivers) {
if (disabledIds.contains(driverId)) {
// driver is also disabled
continue;
}
// driver is removed from disabled list
// we need to enable if it is embedded
try {
DBPDriver driver = WebServiceUtils.getDriverById(driverId);
if (driver.isEmbedded()) {
enabledIds.add(driverId);
}
} catch (DBWebException e) {
log.error("Failed to find driver by id", e);
}
}
this.disabledDrivers = disabledDriversConfig;
this.enabledDrivers = enabledIds.toArray(String[]::new);
}
public boolean isDriverForceEnabled(@NotNull String driverId) {
return ArrayUtils.containsIgnoreCase(getEnabledDrivers(), driverId);
}
public boolean isSystemVariablesResolvingEnabled() {
return systemVariablesResolvingEnabled;
}
@Override
public String getDefaultAuthProvider() {
return defaultAuthProvider;
}
public void setDefaultAuthProvider(String defaultAuthProvider) {
this.defaultAuthProvider = defaultAuthProvider;
}
@Override
public String[] getEnabledAuthProviders() {
if (enabledAuthProviders == null) {
// No config - enable all providers (+backward compatibility)
return WebAuthProviderRegistry.getInstance().getAuthProviders()
.stream().map(WebAuthProviderDescriptor::getId).toArray(String[]::new);
}
return enabledAuthProviders;
}
public void setEnabledAuthProviders(String[] enabledAuthProviders) {
this.enabledAuthProviders = enabledAuthProviders;
}
@Override
public boolean isAuthProviderEnabled(String id) {
var authProviderDescriptor = WebAuthProviderRegistry.getInstance().getAuthProvider(id);
if (authProviderDescriptor == null) {
return false;
}
if (!ArrayUtils.contains(getEnabledAuthProviders(), id)) {
return false;
}
if (!ArrayUtils.isEmpty(authProviderDescriptor.getRequiredFeatures())) {
for (String rf : authProviderDescriptor.getRequiredFeatures()) {
if (!isFeatureEnabled(rf)) {
return false;
}
}
}
return true;
}
////////////////////////////////////////////
// Auth provider configs
@Override
public Set<SMAuthProviderCustomConfiguration> getAuthCustomConfigurations() {
return authConfigurations;
}
@Override
@Nullable
public SMAuthProviderCustomConfiguration getAuthProviderConfiguration(@NotNull String id) {
synchronized (authConfigurations) {
return authConfigurations.stream().filter(c -> c.getId().equals(id)).findAny().orElse(null);
}
}
public void addAuthProviderConfiguration(@NotNull SMAuthProviderCustomConfiguration config) {
synchronized (authConfigurations) {
authConfigurations.removeIf(c -> c.getId().equals(config.getId()));
authConfigurations.add(config);
}
}
public void setAuthProvidersConfigurations(Collection<SMAuthProviderCustomConfiguration> authProviders) {
synchronized (authConfigurations) {
authConfigurations.clear();
authConfigurations.addAll(authProviders);
}
}
public boolean deleteAuthProviderConfiguration(@NotNull String id) {
synchronized (authConfigurations) {
return authConfigurations.removeIf(c -> c.getId().equals(id));
}
}
public void loadLegacyCustomConfigs() {
// Convert legacy map of configs into list
if (!authConfiguration.isEmpty()) {
for (Map.Entry<String, SMAuthProviderCustomConfiguration> entry : authConfiguration.entrySet()) {
entry.getValue().setId(entry.getKey());
authConfigurations.add(entry.getValue());
}
authConfiguration.clear();
}
}
}
@@ -0,0 +1,185 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.config;
import com.google.gson.annotations.SerializedName;
import io.cloudbeaver.auth.CBAuthConstants;
import io.cloudbeaver.model.app.WebServerConfiguration;
import io.cloudbeaver.server.CBConstants;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.Log;
import java.util.HashMap;
import java.util.Map;
public class CBServerConfig implements WebServerConfiguration {
private static final Log log = Log.getLog(CBServerConfig.class);
protected String serverURL;
protected int serverPort = CBConstants.DEFAULT_SERVER_PORT;
private String serverHost = null;
private String serverName = null;
private String sslConfigurationPath = null;
private String contentRoot = CBConstants.DEFAULT_CONTENT_ROOT;
private String rootURI = CBConstants.DEFAULT_ROOT_URI;
private String serviceURI = CBConstants.DEFAULT_SERVICES_URI;
private String workspaceLocation = CBConstants.DEFAULT_WORKSPACE_LOCATION;
private String driversLocation = CBConstants.DEFAULT_DRIVERS_LOCATION;
@SerializedName("expireSessionAfterPeriod")
private long maxSessionIdleTime = CBAuthConstants.MAX_SESSION_IDLE_TIME;
private boolean develMode = false;
private boolean enableSecurityManager = false;
private final Map<String, Object> productSettings = new HashMap<>();
@SerializedName("sm")
protected final SMControllerConfiguration securityManagerConfiguration = new SMControllerConfiguration();
@SerializedName("database")
private WebDatabaseConfig databaseConfiguration = new WebDatabaseConfig();
private String staticContent = "";
public String getServerURL() {
return serverURL;
}
public int getServerPort() {
return serverPort;
}
public String getServerHost() {
return serverHost;
}
public String getServerName() {
return serverName;
}
public String getSslConfigurationPath() {
return sslConfigurationPath;
}
public String getContentRoot() {
return contentRoot;
}
public String getRootURI() {
return rootURI;
}
public String getServicesURI() {
return serviceURI;
}
public String getWorkspaceLocation() {
return workspaceLocation;
}
public String getDriversLocation() {
return driversLocation;
}
public WebDatabaseConfig getDatabaseConfiguration() {
return databaseConfiguration;
}
public String getStaticContent() {
return staticContent;
}
public void setServerURL(String serverURL) {
this.serverURL = serverURL;
}
public void setServerPort(int serverPort) {
this.serverPort = serverPort;
}
public void setServerHost(String serverHost) {
this.serverHost = serverHost;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public void setSslConfigurationPath(String sslConfigurationPath) {
this.sslConfigurationPath = sslConfigurationPath;
}
public void setContentRoot(String contentRoot) {
this.contentRoot = contentRoot;
}
public void setRootURI(String rootURI) {
this.rootURI = rootURI;
}
public void setServicesURI(String servicesURI) {
this.serviceURI = servicesURI;
}
public void setWorkspaceLocation(String workspaceLocation) {
this.workspaceLocation = workspaceLocation;
}
public void setDriversLocation(String driversLocation) {
this.driversLocation = driversLocation;
}
public void setMaxSessionIdleTime(long maxSessionIdleTime) {
this.maxSessionIdleTime = maxSessionIdleTime;
}
public void setDevelMode(boolean develMode) {
this.develMode = develMode;
}
public void setEnableSecurityManager(boolean enableSecurityManager) {
this.enableSecurityManager = enableSecurityManager;
}
public void setDatabaseConfiguration(WebDatabaseConfig databaseConfiguration) {
this.databaseConfiguration = databaseConfiguration;
}
public void setStaticContent(String staticContent) {
this.staticContent = staticContent;
}
@Override
public boolean isDevelMode() {
return develMode;
}
public long getMaxSessionIdleTime() {
return maxSessionIdleTime;
}
public boolean isEnableSecurityManager() {
return enableSecurityManager;
}
@NotNull
public Map<String, Object> getProductSettings() {
return productSettings;
}
public SMControllerConfiguration getSecurityManagerConfiguration() {
return securityManagerConfiguration;
}
}
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.service.security;
package io.cloudbeaver.model.config;
import org.jkiss.dbeaver.model.meta.Property;
@@ -15,7 +15,7 @@
* limitations under the License.
*/
package io.cloudbeaver.service.security;
package io.cloudbeaver.model.config;
public class SMControllerConfiguration {
//in minutes
@@ -14,15 +14,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.service.security.db;
package io.cloudbeaver.model.config;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.registry.storage.InternalDatabaseConfig;
import org.jkiss.dbeaver.model.connection.InternalDatabaseConfig;
/**
* Database configuration
*/
public class CBDatabaseConfig implements InternalDatabaseConfig {
public class WebDatabaseConfig implements InternalDatabaseConfig {
private String driver;
private String url;
private String user;
@@ -31,6 +31,8 @@ public class CBDatabaseConfig implements InternalDatabaseConfig {
private String initialDataConfiguration;
private boolean backupEnabled;
private final Pool pool = new Pool();
@Override
@@ -52,11 +54,16 @@ public class CBDatabaseConfig implements InternalDatabaseConfig {
this.url = url;
}
public void setBackupEnabled(boolean backupEnabled) {
this.backupEnabled = backupEnabled;
}
@Override
public String getUser() {
return user;
}
@Override
public String getPassword() {
return password;
@@ -70,7 +77,24 @@ public class CBDatabaseConfig implements InternalDatabaseConfig {
return pool;
}
@Override
public boolean isBackupEnabled() {
return backupEnabled;
}
public String getSchema() {
return schema;
}
public void setPassword(String password) {
this.password = password;
}
public void setSchema(String schema) {
this.schema = schema;
}
public void setUser(String user) {
this.user = user;
}
}
@@ -48,7 +48,7 @@ public class FSUtils {
public static DBNPathBase getNodeByPath(@NotNull WebSession webSession, @NotNull String nodePath) throws DBException {
DBRProgressMonitor monitor = webSession.getProgressMonitor();
DBNModel navigatorModel = webSession.getNavigatorModel();
DBNModel navigatorModel = webSession.getNavigatorModelOrThrow();
DBNNode node = navigatorModel.getNodeByPath(monitor, nodePath);
if (!(node instanceof DBNPathBase dbnPath)) {
throw new DBWebException("Node '" + nodePath + "' is not found in File Systems");
@@ -1,18 +1,18 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* NOTICE: All information contained herein is, and remains
* the property of DBeaver Corp and its suppliers, if any.
* The intellectual and technical concepts contained
* herein are proprietary to DBeaver Corp and its suppliers
* and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from DBeaver Corp.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.rm;
@@ -20,7 +20,6 @@ package io.cloudbeaver.model.rm;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.DBPObject;
@@ -37,7 +36,6 @@ import java.util.ArrayList;
import java.util.List;
public class DBNResourceManagerProject extends DBNAbstractResourceManagerNode {
private static final Log log = Log.getLog(DBNResourceManagerProject.class);
private final RMProject project;
@@ -93,8 +91,8 @@ public class DBNResourceManagerProject extends DBNAbstractResourceManagerNode {
}
@Override
public DBNResourceManagerResource[] getChildren(DBRProgressMonitor monitor) throws DBException {
if (children == null) {
public DBNResourceManagerResource[] getChildren(@NotNull DBRProgressMonitor monitor) throws DBException {
if (children == null && !monitor.isForceCacheUsage()) {
List<DBNResourceManagerResource> rfList = new ArrayList<>();
for (RMResource resource : getResourceController().listResources(
project.getId(), null, null, true, false, false)) {
@@ -123,21 +121,15 @@ public class DBNResourceManagerProject extends DBNAbstractResourceManagerNode {
return this;
}
@Nullable
@Override
public String toString() {
return getNodeDisplayName();
}
@Override
public DBPProject getOwnerProject() {
public DBPProject getOwnerProjectOrNull() {
List<? extends DBPProject> globalProjects = getModel().getModelProjects();
if (globalProjects == null) {
return null;
}
for (DBPProject modelProject : globalProjects) {
if (CommonUtils.equalObjects(modelProject.getId(), project.getId())) {
return modelProject;
if (globalProjects != null) {
for (DBPProject modelProject : globalProjects) {
if (CommonUtils.equalObjects(modelProject.getId(), project.getId())) {
return modelProject;
}
}
}
return null;
@@ -148,4 +140,10 @@ public class DBNResourceManagerProject extends DBNAbstractResourceManagerNode {
public DBPObject getObjectDetails(@NotNull DBRProgressMonitor monitor, @NotNull SMSessionContext sessionContext, @NotNull Object dataSource) throws DBException {
return project;
}
@Override
public String toString() {
return getNodeDisplayName();
}
}
@@ -1,18 +1,18 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* NOTICE: All information contained herein is, and remains
* the property of DBeaver Corp and its suppliers, if any.
* The intellectual and technical concepts contained
* herein are proprietary to DBeaver Corp and its suppliers
* and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from DBeaver Corp.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.rm;
@@ -110,8 +110,8 @@ public class DBNResourceManagerResource extends DBNAbstractResourceManagerNode {
}
@Override
public DBNNode[] getChildren(DBRProgressMonitor monitor) throws DBException {
if (children == null) {
public DBNNode[] getChildren(@NotNull DBRProgressMonitor monitor) throws DBException {
if (children == null && !monitor.isForceCacheUsage()) {
List<DBNResourceManagerResource> rfList = new ArrayList<>();
for (RMResource resource : getResourceController().listResources(
getResourceProject().getId(), getResourceFolder(), null, true, false, false)) {
@@ -203,9 +203,10 @@ public class DBNResourceManagerResource extends DBNAbstractResourceManagerNode {
return resource;
}
@Nullable
@Override
public DBPProject getOwnerProject() {
return getParentNode().getOwnerProject();
public DBPProject getOwnerProjectOrNull() {
return getParentNode().getOwnerProjectOrNull();
}
public RMResource getResource() {
@@ -1,24 +1,25 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* NOTICE: All information contained herein is, and remains
* the property of DBeaver Corp and its suppliers, if any.
* The intellectual and technical concepts contained
* herein are proprietary to DBeaver Corp and its suppliers
* and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from DBeaver Corp.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.rm;
import io.cloudbeaver.model.session.WebSession;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPHiddenObject;
@@ -81,8 +82,8 @@ public class DBNResourceManagerRoot extends DBNNode implements DBPHiddenObject,
}
@Override
public DBNResourceManagerProject[] getChildren(DBRProgressMonitor monitor) throws DBException {
if (projects == null) {
public DBNResourceManagerProject[] getChildren(@NotNull DBRProgressMonitor monitor) throws DBException {
if (projects == null && !monitor.isForceCacheUsage()) {
List<? extends DBPProject> projectList = getParentNode().getModel().getModelProjects();
if (CommonUtils.isEmpty(projectList)) {
return new DBNResourceManagerProject[0];
@@ -154,8 +155,13 @@ public class DBNResourceManagerRoot extends DBNNode implements DBPHiddenObject,
return;
}
var projectNode = getProjectNode(project);
var rmResourcePath = Arrays.asList(resourcePath.split("/"));
projectNode.ifPresent(dbnResourceManagerProject -> dbnResourceManagerProject.removeChildResourceNode(new ArrayDeque<>(rmResourcePath)));
var rmResourcePath = Arrays.stream(resourcePath.split("/"))
.filter(CommonUtils::isNotEmpty)
.toList();
projectNode.ifPresent(
dbnResourceManagerProject -> dbnResourceManagerProject.removeChildResourceNode(new ArrayDeque<>(
rmResourcePath))
);
}
@NotNull
@@ -0,0 +1,352 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.rm.local;
import io.cloudbeaver.BaseWebProjectImpl;
import io.cloudbeaver.model.rm.lock.RMFileLockController;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceConfigurationStorage;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPDataSourceFolder;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.impl.auth.SessionContextImpl;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMEvent;
import org.jkiss.dbeaver.model.rm.RMEventManager;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.registry.*;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.IOUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.function.Predicate;
public abstract class BaseLocalResourceController implements RMController {
private static final Log log = Log.getLog(BaseLocalResourceController.class);
public static final String DEFAULT_CHANGE_ID = "0";
private static final String FILE_REGEX = "(?U)[\\w.$()@/\\\\ -]+";
private static final String PROJECT_REGEX = "(?U)[\\w.$()@ -]+"; // slash not allowed in project name
@NotNull
protected final DBPWorkspace workspace;
@NotNull
protected final RMFileLockController lockController;
protected BaseLocalResourceController(
@NotNull DBPWorkspace workspace,
@NotNull RMFileLockController lockController
) {
this.workspace = workspace;
this.lockController = lockController;
}
@Override
public RMProject getProject(@NotNull String projectId, boolean readResources, boolean readProperties)
throws DBException {
RMProject project = makeProjectFromId(projectId, true);
if (project == null) {
return null;
}
if (readResources) {
doProjectOperation(projectId, () -> {
project.setChildren(
listResources(projectId, null, null, readProperties, false, true)
);
return null;
});
}
return project;
}
@Override
public Object getProjectProperty(@NotNull String projectId, @NotNull String propName) throws DBException {
var project = getWebProject(projectId, false);
return doFileReadOperation(projectId,
project.getMetadataFilePath(),
() -> project.getProjectProperty(propName));
}
@Override
public void setProjectProperty(
@NotNull String projectId,
@NotNull String propName,
@NotNull Object propValue
) throws DBException {
BaseWebProjectImpl webProject = getWebProject(projectId, false);
doFileWriteOperation(projectId, webProject.getMetadataFilePath(),
() -> {
log.debug("Updating value for property '" + propName + "' in project '" + projectId + "'");
webProject.setProjectProperty(propName, propValue);
return null;
}
);
}
@Override
public String getProjectsDataSources(@NotNull String projectId, @Nullable String[] dataSourceIds)
throws DBException {
DBPProject projectMetadata = getWebProject(projectId, false);
return doFileReadOperation(
projectId,
projectMetadata.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = projectMetadata.getDataSourceRegistry();
registry.refreshConfig();
registry.checkForErrors();
DataSourceConfigurationManagerBuffer buffer = new DataSourceConfigurationManagerBuffer();
Predicate<DBPDataSourceContainer> filter = null;
if (!ArrayUtils.isEmpty(dataSourceIds)) {
filter = ds -> ArrayUtils.contains(dataSourceIds, ds.getId());
}
((DataSourcePersistentRegistry) registry).saveConfigurationToManager(new VoidProgressMonitor(),
buffer,
filter);
registry.checkForErrors();
return new String(buffer.getData(), StandardCharsets.UTF_8);
}
);
}
@Override
public void createProjectDataSources(
@NotNull String projectId,
@NotNull String configuration,
@Nullable List<String> dataSourceIds
) throws DBException {
updateProjectDataSources(projectId, configuration, dataSourceIds);
}
@Override
public boolean updateProjectDataSources(
@NotNull String projectId,
@NotNull String configuration,
@Nullable List<String> dataSourceIds
) throws DBException {
try (var lock = lockController.lockProject(projectId, "updateProjectDataSources")) {
DBPProject project = getWebProject(projectId, false);
return doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
DBPDataSourceConfigurationStorage storage = new DataSourceMemoryStorage(configuration.getBytes(
StandardCharsets.UTF_8));
DataSourceConfigurationManager manager = new DataSourceConfigurationManagerBuffer();
var configChanged = ((DataSourcePersistentRegistry) registry).loadDataSources(
List.of(storage),
manager,
dataSourceIds,
true,
false
);
registry.checkForErrors();
log.debug("Save data sources configuration in project '" + projectId + "'");
((DataSourcePersistentRegistry) registry).saveDataSources();
registry.checkForErrors();
return configChanged;
}
);
}
}
@Override
public void deleteProjectDataSources(
@NotNull String projectId,
@NotNull String[] dataSourceIds
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "deleteDatasources")) {
DBPProject project = getWebProject(projectId, false);
doFileWriteOperation(projectId, project.getMetadataFolder(false), () -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
for (String dataSourceId : dataSourceIds) {
DBPDataSourceContainer dataSource = registry.getDataSource(dataSourceId);
if (dataSource != null) {
log.debug("Deleting data source '" + dataSourceId + "' in project '" + projectId + "'");
registry.removeDataSource(dataSource);
} else {
log.warn("Could not find datasource " + dataSourceId + " for deletion");
}
}
registry.checkForErrors();
return null;
});
}
}
@Override
public void createProjectDataSourceFolder(
@NotNull String projectId,
@NotNull String folderPath
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
log.debug("Creating data source folder '" + folderPath + "' in project '" + projectId + "'");
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
var result = Path.of(folderPath);
var newName = result.getFileName().toString();
GeneralUtils.validateResourceName(newName);
var parent = result.getParent();
var parentFolder = parent == null ? null : registry.getFolder(parent.toString().replace("\\", "/"));
DBPDataSourceFolder newFolder = registry.addFolder(parentFolder, newName);
registry.checkForErrors();
return null;
}
);
}
}
@Override
public void deleteProjectDataSourceFolders(
@NotNull String projectId,
@NotNull String[] folderPaths,
boolean dropContents
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
for (String folderPath : folderPaths) {
DBPDataSourceFolder folder = registry.getFolder(folderPath);
if (folder != null) {
log.debug("Deleting data source folder '" + folderPath + "' in project '" + projectId + "'");
registry.removeFolder(folder, dropContents);
} else {
log.warn("Can not find folder by path [" + folderPath + "] for deletion");
}
}
registry.checkForErrors();
return null;
}
);
}
}
@Override
public void moveProjectDataSourceFolder(
@NotNull String projectId,
@NotNull String oldPath,
@NotNull String newPath
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
log.debug("Moving data source folder from '" + oldPath + "' to '" + newPath + "' in project '" + projectId + "'");
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
registry.moveFolder(oldPath, newPath);
registry.checkForErrors();
return null;
}
);
}
}
protected abstract BaseWebProjectImpl getWebProject(String projectId, boolean refresh) throws DBException;
protected abstract <T> T doFileWriteOperation(String projectId, Path file, RMFileOperation<T> operation)
throws DBException;
protected abstract <T> T doFileReadOperation(String projectId, Path file, RMFileOperation<T> operation)
throws DBException;
protected abstract <T> T doProjectOperation(String projectId, RMFileOperation<T> operation) throws DBException;
protected abstract RMProject makeProjectFromId(String projectId, boolean loadPermissions) throws DBException;
protected void validateResourcePath(String resourcePath) throws DBException {
var fullPath = Paths.get(resourcePath);
for (Path path : fullPath) {
String fileName = IOUtils.getFileNameWithoutExtension(path);
GeneralUtils.validateResourceName(fileName);
}
}
protected void createFolder(Path targetPath) throws DBException {
if (!Files.exists(targetPath)) {
try {
Files.createDirectories(targetPath);
} catch (IOException e) {
throw new DBException("Error creating folder '" + targetPath + "'");
}
}
}
protected class InternalWebProjectImpl extends BaseWebProjectImpl {
public InternalWebProjectImpl(
@NotNull SessionContextImpl sessionContext,
@NotNull RMProject rmProject,
@NotNull Path projectPath
) {
super(
BaseLocalResourceController.this.workspace,
BaseLocalResourceController.this,
sessionContext,
rmProject,
projectPath
);
}
@NotNull
@Override
protected DBPDataSourceRegistry createDataSourceRegistry() {
return new DataSourceRegistry(this);
}
}
protected void fireRmResourceAddEvent(@NotNull String projectId, @NotNull String resourcePath) throws DBException {
RMEventManager.fireEvent(
new RMEvent(RMEvent.Action.RESOURCE_ADD,
getProject(projectId, false, false),
resourcePath)
);
}
protected void fireRmResourceDeleteEvent(@NotNull String projectId, @NotNull String resourcePath)
throws DBException {
RMEventManager.fireEvent(
new RMEvent(RMEvent.Action.RESOURCE_DELETE,
makeProjectFromId(projectId, false),
resourcePath
)
);
}
protected void fireRmProjectAddEvent(@NotNull RMProject project) {
RMEventManager.fireEvent(
new RMEvent(
RMEvent.Action.RESOURCE_ADD,
project
)
);
}
}
@@ -29,39 +29,31 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceConfigurationStorage;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPDataSourceFolder;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.SMCredentials;
import org.jkiss.dbeaver.model.auth.SMCredentialsProvider;
import org.jkiss.dbeaver.model.impl.app.BaseProjectImpl;
import org.jkiss.dbeaver.model.impl.auth.SessionContextImpl;
import org.jkiss.dbeaver.model.rm.*;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.security.SMController;
import org.jkiss.dbeaver.model.security.SMObjectType;
import org.jkiss.dbeaver.model.sql.DBQuotaException;
import org.jkiss.dbeaver.model.websocket.event.MessageType;
import org.jkiss.dbeaver.model.websocket.event.WSEventType;
import org.jkiss.dbeaver.model.websocket.event.WSSessionLogUpdatedEvent;
import org.jkiss.dbeaver.registry.*;
import org.jkiss.dbeaver.registry.ResourceTypeDescriptor;
import org.jkiss.dbeaver.registry.ResourceTypeRegistry;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.IOUtils;
import org.jkiss.utils.Pair;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.text.MessageFormat;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -69,15 +61,10 @@ import java.util.stream.Stream;
/**
* Resource manager API
*/
public class LocalResourceController implements RMController {
public class LocalResourceController extends BaseLocalResourceController {
private static final Log log = Log.getLog(LocalResourceController.class);
private static final String FILE_REGEX = "(?U)[\\w.$()@/\\\\ -]+";
private static final String PROJECT_REGEX = "(?U)[\\w.$()@ -]+"; // slash not allowed in project name
public static final String DEFAULT_CHANGE_ID = "0";
private final DBPWorkspace workspace;
protected final SMCredentialsProvider credentialsProvider;
private final Path rootPath;
@@ -85,7 +72,6 @@ public class LocalResourceController implements RMController {
private final Path sharedProjectsPath;
private final String globalProjectName;
private Supplier<SMController> smControllerSupplier;
protected final RMFileLockController lockController;
protected final List<RMFileOperationHandler> fileHandlers;
private final Map<String, BaseWebProjectImpl> projectRegistries = new LinkedHashMap<>();
@@ -98,13 +84,12 @@ public class LocalResourceController implements RMController {
Path sharedProjectsPath,
Supplier<SMController> smControllerSupplier
) throws DBException {
this.workspace = workspace;
super(workspace, new RMFileLockController(WebAppUtils.getWebApplication()));
this.credentialsProvider = credentialsProvider;
this.rootPath = rootPath;
this.userProjectsPath = userProjectsPath;
this.sharedProjectsPath = sharedProjectsPath;
this.smControllerSupplier = smControllerSupplier;
this.lockController = new RMFileLockController(WebAppUtils.getWebApplication());
this.globalProjectName = DBWorkbench.getPlatform().getApplication().getDefaultProjectName();
this.fileHandlers = RMFileOperationHandlersRegistry.getInstance().getFileHandlers();
@@ -130,12 +115,7 @@ public class LocalResourceController implements RMController {
if (project == null || refresh) {
SessionContextImpl sessionContext = new SessionContextImpl(null);
RMProject rmProject = makeProjectFromId(projectId, false);
project = new BaseWebProjectImpl(
workspace,
this,
sessionContext,
rmProject,
(container) -> true);
project = new InternalWebProjectImpl(sessionContext, rmProject, getProjectPath(projectId));
projectRegistries.put(projectId, project);
}
return project;
@@ -256,18 +236,20 @@ public class LocalResourceController implements RMController {
return new RMProject[0];
}
var projects = new ArrayList<RMProject>();
var allPaths = Files.list(sharedProjectsPath).collect(Collectors.toList());
for (Path path : allPaths) {
var projectPerms = getProjectPermissions(
makeProjectIdFromPath(path, RMProjectType.SHARED),
RMProjectType.SHARED
);
var rmProject = makeProjectFromPath(path, projectPerms, RMProjectType.SHARED, false);
projects.add(rmProject);
try (Stream<Path> list = Files.list(sharedProjectsPath)) {
var allPaths = list.toList();
for (Path path : allPaths) {
var projectPerms = getProjectPermissions(
makeProjectIdFromPath(path, RMProjectType.SHARED),
RMProjectType.SHARED
);
var rmProject = makeProjectFromPath(path, projectPerms, RMProjectType.SHARED, false);
projects.add(rmProject);
}
return projects.stream()
.filter(Objects::nonNull)
.toArray(RMProject[]::new);
}
return projects.stream()
.filter(Objects::nonNull)
.toArray(RMProject[]::new);
} catch (IOException e) {
throw new DBException("Error reading shared projects", e);
}
@@ -344,182 +326,6 @@ public class LocalResourceController implements RMController {
return project;
}
@Override
public Object getProjectProperty(@NotNull String projectId, @NotNull String propName) throws DBException {
var project = getWebProject(projectId, false);
return doFileReadOperation(projectId, project.getMetadataFilePath(), () -> project.getProjectProperty(propName));
}
@Override
public void setProjectProperty(
@NotNull String projectId,
@NotNull String propName,
@NotNull Object propValue
) throws DBException {
BaseWebProjectImpl webProject = getWebProject(projectId, false);
doFileWriteOperation(projectId, webProject.getMetadataFilePath(),
() -> {
log.debug("Updating value for property '" + propName + "' in project '" + projectId + "'");
webProject.setProjectProperty(propName, propValue);
return null;
}
);
}
@Override
public String getProjectsDataSources(@NotNull String projectId, @Nullable String[] dataSourceIds) throws DBException {
DBPProject projectMetadata = getWebProject(projectId, false);
return doFileReadOperation(
projectId,
projectMetadata.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = projectMetadata.getDataSourceRegistry();
registry.refreshConfig();
registry.checkForErrors();
DataSourceConfigurationManagerBuffer buffer = new DataSourceConfigurationManagerBuffer();
Predicate<DBPDataSourceContainer> filter = null;
if (!ArrayUtils.isEmpty(dataSourceIds)) {
filter = ds -> ArrayUtils.contains(dataSourceIds, ds.getId());
}
((DataSourcePersistentRegistry) registry).saveConfigurationToManager(new VoidProgressMonitor(), buffer, filter);
registry.checkForErrors();
return new String(buffer.getData(), StandardCharsets.UTF_8);
}
);
}
@Override
public void createProjectDataSources(
@NotNull String projectId,
@NotNull String configuration,
@Nullable List<String> dataSourceIds
) throws DBException {
updateProjectDataSources(projectId, configuration, dataSourceIds);
}
@Override
public boolean updateProjectDataSources(
@NotNull String projectId,
@NotNull String configuration,
@Nullable List<String> dataSourceIds
) throws DBException {
try (var lock = lockController.lockProject(projectId, "updateProjectDataSources")) {
DBPProject project = getWebProject(projectId, false);
return doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
DBPDataSourceConfigurationStorage storage = new DataSourceMemoryStorage(configuration.getBytes(StandardCharsets.UTF_8));
DataSourceConfigurationManager manager = new DataSourceConfigurationManagerBuffer();
var configChanged = ((DataSourcePersistentRegistry) registry).loadDataSources(
List.of(storage),
manager,
dataSourceIds,
true,
false
);
registry.checkForErrors();
log.debug("Save data sources configuration in project '" + projectId + "'");
((DataSourcePersistentRegistry) registry).saveDataSources();
registry.checkForErrors();
return configChanged;
}
);
}
}
@Override
public void deleteProjectDataSources(@NotNull String projectId,
@NotNull String[] dataSourceIds) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "deleteDatasources")) {
DBPProject project = getWebProject(projectId, false);
doFileWriteOperation(projectId, project.getMetadataFolder(false), () -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
for (String dataSourceId : dataSourceIds) {
DBPDataSourceContainer dataSource = registry.getDataSource(dataSourceId);
if (dataSource != null) {
log.debug("Deleting data source '" + dataSourceId + "' in project '" + projectId + "'");
registry.removeDataSource(dataSource);
} else {
log.warn("Could not find datasource " + dataSourceId + " for deletion");
}
}
registry.checkForErrors();
return null;
});
}
}
@Override
public void createProjectDataSourceFolder(@NotNull String projectId,
@NotNull String folderPath) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
log.debug("Creating data source folder '" + folderPath + "' in project '" + projectId + "'");
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
var result = Path.of(folderPath);
var newName = result.getFileName().toString();
GeneralUtils.validateResourceName(newName);
var parent = result.getParent();
var parentFolder = parent == null ? null : registry.getFolder(parent.toString().replace("\\", "/"));
DBPDataSourceFolder newFolder = registry.addFolder(parentFolder, newName);
registry.checkForErrors();
return null;
}
);
}
}
@Override
public void deleteProjectDataSourceFolders(
@NotNull String projectId,
@NotNull String[] folderPaths,
boolean dropContents
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
for (String folderPath : folderPaths) {
DBPDataSourceFolder folder = registry.getFolder(folderPath);
if (folder != null) {
log.debug("Deleting data source folder '" + folderPath + "' in project '" + projectId + "'");
registry.removeFolder(folder, dropContents);
} else {
log.warn("Can not find folder by path [" + folderPath + "] for deletion");
}
}
registry.checkForErrors();
return null;
}
);
}
}
@Override
public void moveProjectDataSourceFolder(
@NotNull String projectId,
@NotNull String oldPath,
@NotNull String newPath
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createDatasourceFolder")) {
DBPProject project = getWebProject(projectId, false);
log.debug("Moving data source folder from '" + oldPath + "' to '" + newPath + "' in project '" + projectId + "'");
doFileWriteOperation(projectId, project.getMetadataFolder(false),
() -> {
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
registry.moveFolder(oldPath, newPath);
registry.checkForErrors();
return null;
}
);
}
}
@NotNull
@Override
public RMResource[] listResources(
@@ -581,7 +387,7 @@ public class LocalResourceController implements RMController {
@NotNull String resourcePath,
boolean isFolder
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "createResource")) {
try (var ignoredLock = lockController.lockProject(projectId, "createResource")) {
validateResourcePath(resourcePath);
Path targetPath = getTargetPath(projectId, resourcePath);
if (Files.exists(targetPath)) {
@@ -613,7 +419,7 @@ public class LocalResourceController implements RMController {
@NotNull String oldResourcePath,
@NotNull String newResourcePath
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "moveResource")) {
try (var ignoredLock = lockController.lockProject(projectId, "moveResource")) {
var normalizedOldResourcePath = CommonUtils.normalizeResourcePath(oldResourcePath);
var normalizedNewResourcePath = CommonUtils.normalizeResourcePath(newResourcePath);
if (log.isDebugEnabled()) {
@@ -627,7 +433,10 @@ public class LocalResourceController implements RMController {
throw new DBException("Resource '" + oldTargetPath + "' doesn't exists");
}
Path newTargetPath = getTargetPath(projectId, normalizedNewResourcePath);
validateResourcePath(newTargetPath.toString());
validateResourcePath(rootPath.relativize(newTargetPath).toString());
if (Files.exists(newTargetPath)) {
throw new DBException("Resource with name %s already exists".formatted(newTargetPath.getFileName()));
}
try {
Files.move(oldTargetPath, newTargetPath);
} catch (IOException e) {
@@ -679,11 +488,10 @@ public class LocalResourceController implements RMController {
@Override
public void deleteResource(@NotNull String projectId, @NotNull String resourcePath, boolean recursive) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "deleteResource")) {
try (var ignoredLock = lockController.lockProject(projectId, "deleteResource")) {
if (log.isDebugEnabled()) {
log.debug("Removing resource from '" + resourcePath + "' in project '" + projectId + "'" + (recursive ? " recursive" : ""));
}
validateResourcePath(resourcePath);
Path targetPath = getTargetPath(projectId, resourcePath);
doFileWriteOperation(projectId, targetPath, () -> {
if (!Files.exists(targetPath)) {
@@ -768,7 +576,7 @@ public class LocalResourceController implements RMController {
@NotNull byte[] data,
boolean forceOverwrite
) throws DBException {
try (var lock = lockController.lockProject(projectId, "setResourceContents")) {
try (var ignoredLock = lockController.lockProject(projectId, "setResourceContents")) {
validateResourcePath(resourcePath);
Number fileSizeLimit = WebAppUtils.getWebApplication()
.getAppConfiguration()
@@ -804,15 +612,6 @@ public class LocalResourceController implements RMController {
return DEFAULT_CHANGE_ID;
}
protected void createFolder(Path targetPath) throws DBException {
if (!Files.exists(targetPath)) {
try {
Files.createDirectories(targetPath);
} catch (IOException e) {
throw new DBException("Error creating folder '" + targetPath + "'");
}
}
}
@NotNull
@Override
@@ -822,7 +621,7 @@ public class LocalResourceController implements RMController {
@NotNull String propertyName,
@Nullable Object propertyValue
) throws DBException {
try (var projectLock = lockController.lockProject(projectId, "resourcePropertyUpdate")) {
try (var ignoredLock = lockController.lockProject(projectId, "resourcePropertyUpdate")) {
validateResourcePath(resourcePath);
BaseWebProjectImpl webProject = getWebProject(projectId, false);
doFileWriteOperation(projectId, webProject.getMetadataFilePath(),
@@ -836,11 +635,24 @@ public class LocalResourceController implements RMController {
}
}
private void validateResourcePath(String resourcePath) throws DBException {
var fullPath = Paths.get(resourcePath);
for (Path path : fullPath) {
String fileName = IOUtils.getFileNameWithoutExtension(path);
GeneralUtils.validateResourceName(fileName);
@NotNull
@Override
public String setResourceProperties(
@NotNull String projectId,
@NotNull String resourcePath,
@NotNull Map<String, Object> properties
) throws DBException {
try (var ignoredLock = lockController.lockProject(projectId, "resourcePropertyUpdate")) {
validateResourcePath(resourcePath);
BaseWebProjectImpl webProject = getWebProject(projectId, false);
doFileWriteOperation(projectId, webProject.getMetadataFilePath(),
() -> {
log.debug("Updating resource '" + resourcePath + "' properties in project '" + projectId + "'");
webProject.setResourceProperties(resourcePath, properties);
return null;
}
);
return DEFAULT_CHANGE_ID;
}
}
@@ -860,7 +672,7 @@ public class LocalResourceController implements RMController {
if (!targetPath.startsWith(projectPath)) {
throw new DBException("Invalid resource path");
}
return WebAppUtils.getWebApplication().getHomeDirectory().relativize(targetPath);
return targetPath;
} catch (InvalidPathException e) {
throw new DBException("Resource path contains invalid characters");
}
@@ -873,7 +685,7 @@ public class LocalResourceController implements RMController {
}
@Nullable
private RMProject makeProjectFromId(String projectId, boolean loadPermissions) throws DBException {
protected RMProject makeProjectFromId(String projectId, boolean loadPermissions) throws DBException {
var projectName = parseProjectName(projectId);
var projectPath = getProjectPath(projectId);
if (!Files.exists(projectPath)) {
@@ -1089,7 +901,7 @@ public class LocalResourceController implements RMController {
);
}
if (readProperties) {
final BaseProjectImpl project = (BaseProjectImpl) getWebProject(projectId, true);
final BaseProjectImpl project = getWebProject(projectId, true);
final String resourcePath = getProjectRelativePath(projectId, path);
final Map<String, Object> properties = project.getResourceProperties(resourcePath);
@@ -1117,32 +929,6 @@ public class LocalResourceController implements RMController {
return getProjectPath(projectId).toAbsolutePath().relativize(path).toString().replace('\\', IPath.SEPARATOR);
}
private void fireRmResourceAddEvent(@NotNull String projectId, @NotNull String resourcePath) throws DBException {
RMEventManager.fireEvent(
new RMEvent(RMEvent.Action.RESOURCE_ADD,
getProject(projectId, false, false),
resourcePath)
);
}
private void fireRmResourceDeleteEvent(@NotNull String projectId, @NotNull String resourcePath) throws DBException {
RMEventManager.fireEvent(
new RMEvent(RMEvent.Action.RESOURCE_DELETE,
makeProjectFromId(projectId, false),
resourcePath
)
);
}
private void fireRmProjectAddEvent(@NotNull RMProject project) throws DBException {
RMEventManager.fireEvent(
new RMEvent(
RMEvent.Action.RESOURCE_ADD,
project
)
);
}
protected void handleProjectOpened(String projectId) throws DBException {
createResourceTypeFolders(getProjectPath(projectId));
}
@@ -1263,5 +1049,4 @@ public class LocalResourceController implements RMController {
rmProjectName.name.equals(userId);
}
}
@@ -23,6 +23,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.utils.IOUtils;
import java.io.IOException;
import java.io.Reader;
@@ -73,18 +74,23 @@ public class RMFileLockController {
* @return - lock
*/
@NotNull
public RMLock lockProject(@NotNull String projectId,@NotNull String operationName) throws DBException {
public RMLock lockProject(@NotNull String projectId, @NotNull String operationName) throws DBException {
synchronized (RMFileLockController.class) {
try {
createLockFolderIfNeeded();
createProjectFolder(projectId);
Path projectLockFile = getProjectLockFilePath(projectId);
RMLockInfo lockInfo = new RMLockInfo.Builder(projectId, UUID.randomUUID().toString())
.setApplicationId(applicationId)
.setOperationName(operationName)
.setOperationStartTime(System.currentTimeMillis())
.build();
Path projectLockFile = getProjectLockFilePath(projectId);
if (!IOUtils.isFileFromDefaultFS(lockFolderPath)) {
// fake lock for external file system?
return new RMLock(projectLockFile);
}
createLockFolderIfNeeded();
createProjectFolder(projectId);
createLockFile(projectLockFile, lockInfo);
return new RMLock(projectLockFile);
} catch (Exception e) {
@@ -51,27 +51,33 @@ public abstract class BaseWebSession extends AbstractSessionPersistent {
@NotNull
protected final WebUserContext userContext;
@NotNull
protected final WebAuthApplication application;
protected final WebApplication application;
protected volatile long lastAccessTime;
private final List<CBWebSessionEventHandler> sessionEventHandlers = new CopyOnWriteArrayList<>();
private WebSessionEventsFilter eventsFilter = new WebSessionEventsFilter();
private final WebSessionWorkspace workspace;
public BaseWebSession(@NotNull String id, @NotNull WebAuthApplication application) throws DBException {
public BaseWebSession(@NotNull String id, @NotNull WebApplication application) throws DBException {
this.id = id;
this.application = application;
this.createTime = System.currentTimeMillis();
this.lastAccessTime = this.createTime;
this.workspace = new WebSessionWorkspace(this);
this.workspace = createWebWorkspace();
this.workspace.getAuthContext().addSession(this);
this.userContext = createUserContext();
}
@NotNull
protected WebSessionWorkspace createWebWorkspace() {
return new WebSessionWorkspace(this);
}
protected WebUserContext createUserContext() throws DBException {
return new WebUserContext(this.application, this.workspace);
}
@NotNull
public WebSessionWorkspace getWorkspace() {
return workspace;
}
@@ -114,7 +120,9 @@ public abstract class BaseWebSession extends AbstractSessionPersistent {
public synchronized void refreshUserData() {
try {
userContext.refreshPermissions();
userContext.refreshAccessibleProjects();
if (userContext.isAuthorizedInSecurityManager()) {
userContext.refreshAccessibleProjects();
}
} catch (DBException e) {
addSessionError(e);
log.error("Error refreshing accessible projects", e);
@@ -171,14 +179,24 @@ public abstract class BaseWebSession extends AbstractSessionPersistent {
@Override
public void close() {
super.close();
var sessionExpiredEvent = new WSSessionExpiredEvent();
cleanUpSession(true);
}
public void close(boolean clearTokens, boolean sendSessionExpiredEvent) {
cleanUpSession(sendSessionExpiredEvent);
}
private void cleanUpSession(boolean sendSessionExpiredEvent) {
application.getEventController().addEvent(new WSEventDeleteTempFile(getSessionId()));
synchronized (sessionEventHandlers) {
var sessionExpiredEvent = new WSSessionExpiredEvent();
for (CBWebSessionEventHandler sessionEventHandler : sessionEventHandlers) {
try {
sessionEventHandler.handleWebSessionEvent(sessionExpiredEvent);
} catch (DBException e) {
log.warn("Failed to send session expiration event", e);
if (sendSessionExpiredEvent) {
try {
sessionEventHandler.handleWebSessionEvent(sessionExpiredEvent);
} catch (DBException e) {
log.warn("Failed to send session expiration event", e);
}
}
sessionEventHandler.close();
}
@@ -220,6 +238,9 @@ public abstract class BaseWebSession extends AbstractSessionPersistent {
@Property
public long getRemainingTime() {
return application.getMaxSessionIdleTime() + lastAccessTime - System.currentTimeMillis();
if (application instanceof WebAuthApplication authApplication) {
return authApplication.getMaxSessionIdleTime() + lastAccessTime - System.currentTimeMillis();
}
return Integer.MAX_VALUE;
}
}
@@ -1,18 +1,18 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* NOTICE: All information contained herein is, and remains
* the property of DBeaver Corp and its suppliers, if any.
* The intellectual and technical concepts contained
* herein are proprietary to DBeaver Corp and its suppliers
* and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from DBeaver Corp.
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.session;
@@ -22,6 +22,7 @@ import io.cloudbeaver.model.user.WebUserOriginInfo;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.auth.SMAuthInfo;
import org.jkiss.dbeaver.model.auth.SMAuthProvider;
import org.jkiss.dbeaver.model.auth.SMSession;
import org.jkiss.dbeaver.model.auth.SMSessionPrincipal;
@@ -41,7 +42,10 @@ public class WebAuthInfo implements SMSessionPrincipal {
private final WebUser user;
private final WebAuthProviderDescriptor authProvider;
private String authProviderConfigurationId;
private SMSession authSession;
@NotNull
private final SMAuthInfo authInfo;
@NotNull
private final SMSession authSession;
private final OffsetDateTime loginTime;
private final DBWUserIdentity userIdentity;
private String message;
@@ -54,12 +58,14 @@ public class WebAuthInfo implements SMSessionPrincipal {
@NotNull WebAuthProviderDescriptor authProvider,
@NotNull DBWUserIdentity userIdentity,
@NotNull SMSession authSession,
@NotNull SMAuthInfo authInfo,
@NotNull OffsetDateTime loginTime
) {
this.session = session;
this.user = user;
this.authProvider = authProvider;
this.userIdentity = userIdentity;
this.authInfo = authInfo;
this.authSession = authSession;
this.loginTime = loginTime;
}
@@ -120,10 +126,16 @@ public class WebAuthInfo implements SMSessionPrincipal {
return authProvider;
}
@NotNull
public SMSession getAuthSession() {
return authSession;
}
@NotNull
public SMAuthInfo getAuthInfo() {
return authInfo;
}
void closeAuth() {
if (authProvider != null && authSession != null) {
try {
@@ -19,6 +19,7 @@ package io.cloudbeaver.model.session;
import io.cloudbeaver.model.WebServerMessage;
import io.cloudbeaver.model.app.WebAuthApplication;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.auth.SMSessionPrincipal;
@@ -43,6 +44,7 @@ public class WebHeadlessSession extends BaseWebSession {
}
@Nullable
@Override
public SMSessionPrincipal getSessionPrincipal() {
return null;
@@ -0,0 +1,57 @@
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2024 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.cloudbeaver.model.session;
import jakarta.servlet.http.HttpServletRequest;
public class WebHttpRequestInfo {
private final String id;
private final Object locale;
private final String lastRemoteAddress;
private final String lastRemoteUserAgent;
public WebHttpRequestInfo(HttpServletRequest request) {
this.id = request.getSession().getId();
this.locale = request.getAttribute("locale");
this.lastRemoteAddress = request.getRemoteAddr();
this.lastRemoteUserAgent = request.getHeader("User-Agent");
}
public WebHttpRequestInfo(String id, Object locale, String lastRemoteAddress, String lastRemoteUserAgent) {
this.id = id;
this.locale = locale;
this.lastRemoteAddress = lastRemoteAddress;
this.lastRemoteUserAgent = lastRemoteUserAgent;
}
public String getId() {
return id;
}
public Object getLocale() {
return locale;
}
public String getLastRemoteAddress() {
return lastRemoteAddress;
}
public String getLastRemoteUserAgent() {
return lastRemoteUserAgent;
}
}
@@ -19,23 +19,18 @@ package io.cloudbeaver.model.session;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.InstanceCreator;
import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.DBWebException;
import io.cloudbeaver.DataSourceFilter;
import io.cloudbeaver.WebProjectImpl;
import com.google.gson.Strictness;
import io.cloudbeaver.*;
import io.cloudbeaver.model.WebAsyncTaskInfo;
import io.cloudbeaver.model.WebConnectionInfo;
import io.cloudbeaver.model.WebServerMessage;
import io.cloudbeaver.model.app.WebApplication;
import io.cloudbeaver.model.app.WebAuthApplication;
import io.cloudbeaver.model.user.WebUser;
import io.cloudbeaver.service.DBWSessionHandler;
import io.cloudbeaver.service.sql.WebSQLConstants;
import io.cloudbeaver.utils.CBModelConstants;
import io.cloudbeaver.utils.WebAppUtils;
import io.cloudbeaver.utils.WebDataSourceUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@@ -45,12 +40,8 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBFileController;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPEvent;
import org.jkiss.dbeaver.model.access.DBAAuthCredentials;
import org.jkiss.dbeaver.model.access.DBACredentialsProvider;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistryCache;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.*;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.exec.DBCException;
@@ -58,6 +49,7 @@ import org.jkiss.dbeaver.model.fs.DBFFileSystemManager;
import org.jkiss.dbeaver.model.meta.Association;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.navigator.DBNModel;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.rm.RMController;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMProjectType;
@@ -69,18 +61,15 @@ import org.jkiss.dbeaver.model.runtime.ProxyProgressMonitor;
import org.jkiss.dbeaver.model.security.SMAdminController;
import org.jkiss.dbeaver.model.security.SMConstants;
import org.jkiss.dbeaver.model.security.SMController;
import org.jkiss.dbeaver.model.security.SMObjectType;
import org.jkiss.dbeaver.model.security.user.SMObjectPermissions;
import org.jkiss.dbeaver.model.sql.DBQuotaException;
import org.jkiss.dbeaver.model.websocket.event.MessageType;
import org.jkiss.dbeaver.model.websocket.event.WSEventType;
import org.jkiss.dbeaver.model.websocket.event.WSSessionLogUpdatedEvent;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.jobs.DisconnectJob;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Path;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -90,8 +79,9 @@ import java.util.stream.Collectors;
* Web session.
* Is the main source of data in web application
*/
//TODO: split to authenticated and non authenticated context
public class WebSession extends BaseWebSession
implements SMSession, SMCredentialsProvider, DBACredentialsProvider, IAdaptable {
implements SMSessionWithAuth, SMCredentialsProvider, DBACredentialsProvider, IAdaptable {
private static final Log log = Log.getLog(WebSession.class);
@@ -100,17 +90,16 @@ public class WebSession extends BaseWebSession
private static final String ATTR_LOCALE = "locale";
private static final AtomicInteger TASK_ID = new AtomicInteger();
public static String RUNTIME_PARAM_AUTH_INFOS = "auth-infos";
private final AtomicInteger taskCount = new AtomicInteger();
private String lastRemoteAddr;
private String lastRemoteUserAgent;
private Set<String> accessibleConnectionIds = Collections.emptySet();
private String locale;
private boolean cacheExpired;
private final Map<String, WebConnectionInfo> connections = new HashMap<>();
protected WebSessionGlobalProjectImpl globalProject;
private final List<WebServerMessage> sessionMessages = new ArrayList<>();
private final Map<String, WebAsyncTaskInfo> asyncTasks = new HashMap<>();
@@ -124,16 +113,37 @@ public class WebSession extends BaseWebSession
private final Map<String, DBWSessionHandler> sessionHandlers;
public WebSession(
@NotNull HttpSession httpSession,
@NotNull WebHttpRequestInfo requestInfo,
@NotNull WebAuthApplication application,
@NotNull Map<String, DBWSessionHandler> sessionHandlers
) throws DBException {
super(httpSession.getId(), application);
this.lastAccessTime = this.createTime;
setLocale(CommonUtils.toString(httpSession.getAttribute(ATTR_LOCALE), this.locale));
this.sessionHandlers = sessionHandlers;
this(requestInfo.getId(),
CommonUtils.toString(requestInfo.getLocale()),
application,
sessionHandlers
);
updateSessionParameters(requestInfo);
}
protected WebSession(
@NotNull String id,
@Nullable String locale,
@NotNull WebApplication application,
@NotNull Map<String, DBWSessionHandler> sessionHandlers
) throws DBException {
super(id, application);
this.lastAccessTime = this.createTime;
this.sessionHandlers = sessionHandlers;
setLocale(CommonUtils.toString(locale, this.locale));
//force authorization of anonymous session to avoid access error,
//because before authorization could be called by any request,
//but now 'updateInfo' is called only in special requests,
//and the order of requests is not guaranteed.
//look at CB-4747
refreshSessionAuth();
}
@Nullable
@Override
public SMSessionPrincipal getSessionPrincipal() {
synchronized (authTokens) {
@@ -144,8 +154,8 @@ public class WebSession extends BaseWebSession
}
}
@NotNull
public DBPProject getSingletonProject() {
@Nullable
public WebSessionProjectImpl getSingletonProject() {
return getWorkspace().getActiveProject();
}
@@ -242,59 +252,6 @@ public class WebSession extends BaseWebSession
initNavigatorModel();
}
/**
* updates data sources based on event in web session
*
* @param project project of connection
* @param dataSourceIds list of updated connections
* @param type type of event
*/
public synchronized boolean updateProjectDataSources(
DBPProject project,
List<String> dataSourceIds,
WSEventType type
) {
var sendDataSourceUpdatedEvent = false;
DBPDataSourceRegistry registry = project.getDataSourceRegistry();
// save old connections
var oldDataSources = dataSourceIds.stream()
.map(registry::getDataSource)
.filter(Objects::nonNull)
.collect(Collectors.toMap(
DBPDataSourceContainer::getId,
ds -> new DataSourceDescriptor((DataSourceDescriptor) ds, ds.getRegistry())
));
if (type == WSEventType.DATASOURCE_CREATED || type == WSEventType.DATASOURCE_UPDATED) {
registry.refreshConfig(dataSourceIds);
}
for (String dsId : dataSourceIds) {
DataSourceDescriptor ds = (DataSourceDescriptor) registry.getDataSource(dsId);
if (ds == null) {
continue;
}
switch (type) {
case DATASOURCE_CREATED -> {
WebConnectionInfo connectionInfo = new WebConnectionInfo(this, ds);
this.connections.put(connectionInfo.getId(), connectionInfo);
sendDataSourceUpdatedEvent = true;
}
case DATASOURCE_UPDATED -> // if settings were changed we need to send event
sendDataSourceUpdatedEvent |= !ds.equalSettings(oldDataSources.get(dsId));
case DATASOURCE_DELETED -> {
WebDataSourceUtils.disconnectDataSource(this, ds);
if (registry instanceof DBPDataSourceRegistryCache dsrc) {
dsrc.removeDataSourceFromList(ds);
}
this.connections.remove(ds.getId());
sendDataSourceUpdatedEvent = true;
}
default -> {
}
}
}
return sendDataSourceUpdatedEvent;
}
// Note: for admin use only
public synchronized void resetUserState() throws DBException {
clearAuthTokens();
@@ -315,7 +272,7 @@ public class WebSession extends BaseWebSession
this.navigatorModel.dispose();
this.navigatorModel = null;
}
this.connections.clear();
this.globalProject = null;
loadProjects();
@@ -335,14 +292,13 @@ public class WebSession extends BaseWebSession
// No anonymous mode in distributed apps
return;
}
refreshAccessibleConnectionIds();
try {
RMController controller = getRmController();
RMProject[] rmProjects = controller.listAccessibleProjects();
for (RMProject project : rmProjects) {
createWebProject(project);
}
if (user == null) {
if (user == null && application.getAppConfiguration().isAnonymousAccessEnabled()) {
WebProjectImpl anonymousProject = createWebProject(RMUtils.createAnonymousProject());
anonymousProject.setInMemory(true);
}
@@ -355,57 +311,33 @@ public class WebSession extends BaseWebSession
}
}
public WebProjectImpl createWebProject(RMProject project) {
// Do not filter data sources from user project
DataSourceFilter filter = project.getType() == RMProjectType.GLOBAL
? this::isDataSourceAccessible
: x -> true;
WebProjectImpl sessionProject = application.createProjectImpl(this, project, filter);
private WebSessionProjectImpl createWebProject(RMProject project) throws DBException {
WebSessionProjectImpl sessionProject;
if (project.isGlobal()) {
sessionProject = createGlobalProject(project);
} else {
sessionProject = new WebSessionProjectImpl(this, project, getProjectPath(project));
}
// do not load data sources for anonymous project
if (project.getType() == RMProjectType.USER && userContext.getUser() == null) {
sessionProject.setInMemory(true);
}
DBPDataSourceRegistry dataSourceRegistry = sessionProject.getDataSourceRegistry();
dataSourceRegistry.setAuthCredentialsProvider(this);
addSessionProject(sessionProject);
if (!project.isShared() || application.isConfigurationMode()) {
getWorkspace().setActiveProject(sessionProject);
}
for (DBPDataSourceContainer ds : dataSourceRegistry.getDataSources()) {
addConnection(new WebConnectionInfo(this, ds));
}
Throwable lastError = dataSourceRegistry.getLastError();
if (lastError != null) {
addSessionError(lastError);
log.error("Error refreshing connections from project '" + project.getId() + "'", lastError);
}
return sessionProject;
}
public void filterAccessibleConnections(List<WebConnectionInfo> connections) {
connections.removeIf(c -> !isDataSourceAccessible(c.getDataSourceContainer()));
}
private boolean isDataSourceAccessible(DBPDataSourceContainer dataSource) {
return dataSource.isExternallyProvided() ||
dataSource.isTemporary() ||
this.hasPermission(DBWConstants.PERMISSION_ADMIN) ||
accessibleConnectionIds.contains(dataSource.getId());
}
@NotNull
private Set<String> readAccessibleConnectionIds() {
try {
return getSecurityController()
.getAllAvailableObjectsPermissions(SMObjectType.datasource)
.stream()
.map(SMObjectPermissions::getObjectId)
.collect(Collectors.toSet());
} catch (DBException e) {
addSessionError(e);
log.error("Error reading connection grants", e);
return Collections.emptySet();
}
protected Path getProjectPath(@NotNull RMProject project) throws DBException {
return RMUtils.getProjectPath(project);
}
protected WebSessionProjectImpl createGlobalProject(RMProject project) {
globalProject = new WebSessionGlobalProjectImpl(this, project);
globalProject.refreshAccessibleConnectionIds();
return globalProject;
}
private void resetSessionCache() throws DBCException {
@@ -423,17 +355,7 @@ public class WebSession extends BaseWebSession
}
private void resetNavigationModel() {
Map<String, WebConnectionInfo> conCopy;
synchronized (this.connections) {
conCopy = new HashMap<>(this.connections);
this.connections.clear();
}
for (WebConnectionInfo connectionInfo : conCopy.values()) {
if (connectionInfo.isConnected()) {
new DisconnectJob(connectionInfo.getDataSourceContainer()).schedule();
}
}
getWorkspace().getProjects().forEach(WebSessionProjectImpl::dispose);
if (this.navigatorModel != null) {
this.navigatorModel.dispose();
@@ -447,7 +369,9 @@ public class WebSession extends BaseWebSession
authAsAnonymousUser();
} else if (getUserId() != null) {
userContext.refreshPermissions();
refreshAccessibleConnectionIds();
if (globalProject != null) {
globalProject.refreshAccessibleConnectionIds();
}
}
} catch (Exception e) {
@@ -456,32 +380,6 @@ public class WebSession extends BaseWebSession
}
}
private synchronized void refreshAccessibleConnectionIds() {
this.accessibleConnectionIds = readAccessibleConnectionIds();
}
public synchronized void addAccessibleConnectionToCache(@NotNull String dsId) {
this.accessibleConnectionIds.add(dsId);
var registry = getProjectById(WebAppUtils.getGlobalProjectId()).getDataSourceRegistry();
var dataSource = registry.getDataSource(dsId);
if (dataSource != null) {
connections.put(dsId, new WebConnectionInfo(this, dataSource));
// reflect changes is navigator model
registry.notifyDataSourceListeners(new DBPEvent(DBPEvent.Action.OBJECT_ADD, dataSource, true));
}
}
public synchronized void removeAccessibleConnectionFromCache(@NotNull String dsId) {
var registry = getProjectById(WebAppUtils.getGlobalProjectId()).getDataSourceRegistry();
var dataSource = registry.getDataSource(dsId);
if (dataSource != null) {
this.accessibleConnectionIds.remove(dsId);
connections.remove(dsId);
// reflect changes is navigator model
registry.notifyDataSourceListeners(new DBPEvent(DBPEvent.Action.OBJECT_REMOVE, dataSource));
dataSource.dispose();
}
}
private synchronized void authAsAnonymousUser() throws DBException {
if (!application.getAppConfiguration().isAnonymousAccessEnabled()) {
@@ -501,10 +399,18 @@ public class WebSession extends BaseWebSession
this.locale = locale != null ? locale : Locale.getDefault().getLanguage();
}
@Nullable
public DBNModel getNavigatorModel() {
return navigatorModel;
}
@NotNull
public DBNModel getNavigatorModelOrThrow() throws DBWebException {
if (navigatorModel != null) {
return navigatorModel;
}
throw new DBWebException("Navigator model is not found in session");
}
/**
* Returns and clears progress messages
*/
@@ -517,16 +423,10 @@ public class WebSession extends BaseWebSession
}
}
public synchronized void updateInfo(
HttpServletRequest request,
HttpServletResponse response
) throws DBWebException {
public synchronized void updateInfo(boolean isOldHttpSessionUsed) {
log.debug("Update session lifetime " + getSessionId() + " for user " + getUserId());
touchSession();
HttpSession httpSession = request.getSession();
this.lastRemoteAddr = request.getRemoteAddr();
this.lastRemoteUserAgent = request.getHeader("User-Agent");
this.cacheExpired = false;
if (!httpSession.isNew()) {
if (isOldHttpSessionUsed) {
try {
// Persist session
if (!isAuthorizedInSecurityManager()) {
@@ -546,55 +446,10 @@ public class WebSession extends BaseWebSession
}
}
@Association
public List<WebConnectionInfo> getConnections() {
synchronized (connections) {
return new ArrayList<>(connections.values());
}
}
@NotNull
public WebConnectionInfo getWebConnectionInfo(@Nullable String projectId, String connectionID) throws DBWebException {
WebConnectionInfo connectionInfo;
synchronized (connections) {
connectionInfo = connections.get(connectionID);
}
if (connectionInfo == null) {
WebProjectImpl project = getProjectById(projectId);
if (project == null) {
throw new DBWebException("Project '" + projectId + "' not found in web workspace");
}
DBPDataSourceContainer dataSource = project.getDataSourceRegistry().getDataSource(connectionID);
if (dataSource != null) {
connectionInfo = new WebConnectionInfo(this, dataSource);
synchronized (connections) {
connections.put(connectionID, connectionInfo);
}
} else {
throw new DBWebException("Connection '" + connectionID + "' not found");
}
}
return connectionInfo;
}
@Nullable
public WebConnectionInfo findWebConnectionInfo(String connectionID) {
synchronized (connections) {
return connections.get(connectionID);
}
}
public void addConnection(WebConnectionInfo connectionInfo) {
synchronized (connections) {
connections.put(connectionInfo.getId(), connectionInfo);
}
}
public void removeConnection(WebConnectionInfo connectionInfo) {
connectionInfo.clearCache();
synchronized (connections) {
connections.remove(connectionInfo.getId());
}
public synchronized void updateSessionParameters(WebHttpRequestInfo requestInfo) {
this.lastRemoteAddr = requestInfo.getLastRemoteAddress();
this.lastRemoteUserAgent = requestInfo.getLastRemoteUserAgent();
this.cacheExpired = false;
}
@Override
@@ -614,6 +469,25 @@ public class WebSession extends BaseWebSession
super.close();
}
@Override
public void close(boolean clearTokens, boolean sendSessionExpiredEvent) {
try {
resetNavigationModel();
resetSessionCache();
} catch (Throwable e) {
log.error(e);
}
if (clearTokens) {
try {
clearAuthTokens();
} catch (Exception e) {
log.error("Error closing web session tokens");
}
}
this.userContext.setUser(null);
super.close(clearTokens, sendSessionExpiredEvent);
}
private List<WebAuthInfo> clearAuthTokens() throws DBException {
ArrayList<WebAuthInfo> tokensCopy;
synchronized (authTokens) {
@@ -761,7 +635,7 @@ public class WebSession extends BaseWebSession
synchronized (attributes) {
Object value = attributes.get(name);
if (value instanceof PersistentAttribute persistentAttribute) {
value = persistentAttribute.getValue();
value = persistentAttribute.value();
}
return (T) value;
}
@@ -777,7 +651,7 @@ public class WebSession extends BaseWebSession
synchronized (attributes) {
Object value = attributes.get(name);
if (value instanceof PersistentAttribute persistentAttribute) {
value = persistentAttribute.getValue();
value = persistentAttribute.value();
}
if (value == null) {
value = creator.apply(null);
@@ -813,6 +687,14 @@ public class WebSession extends BaseWebSession
}
}
@Override
public List<SMAuthInfo> getAuthInfos() {
synchronized (authTokens) {
return authTokens.stream().map(WebAuthInfo::getAuthInfo).toList();
}
}
public List<WebAuthInfo> getAllAuthInfo() {
synchronized (authTokens) {
return new ArrayList<>(authTokens);
@@ -910,10 +792,14 @@ public class WebSession extends BaseWebSession
for (DBACredentialsProvider contextCredentialsProvider : getContextCredentialsProviders()) {
contextCredentialsProvider.provideAuthParameters(monitor, dataSourceContainer, configuration);
}
configuration.setRuntimeAttribute(RUNTIME_PARAM_AUTH_INFOS, getAllAuthInfo());
WebConnectionInfo webConnectionInfo = findWebConnectionInfo(dataSourceContainer.getId());
if (webConnectionInfo != null) {
WebDataSourceUtils.saveCredentialsInDataSource(webConnectionInfo, dataSourceContainer, configuration);
WebSessionProjectImpl project = getProjectById(dataSourceContainer.getProject().getId());
if (project != null) {
WebConnectionInfo webConnectionInfo = project.findWebConnectionInfo(dataSourceContainer.getId());
if (webConnectionInfo != null) {
WebDataSourceUtils.saveCredentialsInDataSource(webConnectionInfo, dataSourceContainer, configuration);
}
}
// uncommented because we had the problem with non-native auth models
@@ -922,7 +808,7 @@ public class WebSession extends BaseWebSession
InstanceCreator<DBAAuthCredentials> credTypeAdapter = type -> credentials;
Gson credGson = new GsonBuilder()
.setLenient()
.setStrictness(Strictness.LENIENT)
.registerTypeAdapter(credentials.getClass(), credTypeAdapter)
.create();
@@ -1004,22 +890,44 @@ public class WebSession extends BaseWebSession
}
@Nullable
public WebProjectImpl getProjectById(@Nullable String projectId) {
public WebSessionProjectImpl getProjectById(@Nullable String projectId) {
return getWorkspace().getProjectById(projectId);
}
public List<WebProjectImpl> getAccessibleProjects() {
/**
* Returns project info from session cache.
*
* @throws DBWebException if project with provided id is not found.
*/
public WebSessionProjectImpl getAccessibleProjectById(@Nullable String projectId) throws DBWebException {
WebSessionProjectImpl project = null;
if (projectId != null) {
project = getWorkspace().getProjectById(projectId);
}
if (project == null) {
throw new DBWebException("Project not found: " + projectId);
}
return project;
}
public List<WebSessionProjectImpl> getAccessibleProjects() {
return getWorkspace().getProjects();
}
public void addSessionProject(@NotNull WebProjectImpl project) {
/**
* Adds project to session cache and navigator tree.
*/
public void addSessionProject(@NotNull WebSessionProjectImpl project) {
getWorkspace().addProject(project);
if (navigatorModel != null) {
navigatorModel.getRoot().addProject(project, false);
}
}
public void deleteSessionProject(@Nullable WebProjectImpl project) {
/**
* Removes project from session cache and navigator tree.
*/
public void deleteSessionProject(@Nullable WebSessionProjectImpl project) {
if (project != null) {
project.dispose();
}
@@ -1044,10 +952,6 @@ public class WebSession extends BaseWebSession
return;
}
deleteSessionProject(project);
var projectConnections = project.getDataSourceRegistry().getDataSources();
for (DBPDataSourceContainer c : projectConnections) {
removeConnection(new WebConnectionInfo(this, c));
}
}
@NotNull
@@ -1059,6 +963,16 @@ public class WebSession extends BaseWebSession
return project.getFileSystemManager();
}
@NotNull
public DBPPreferenceStore getUserPreferenceStore() {
return getUserContext().getPreferenceStore();
}
@Nullable
public WebSessionGlobalProjectImpl getGlobalProject() {
return globalProject;
}
private class SessionProgressMonitor extends BaseProgressMonitor {
@Override
public void beginTask(String name, int totalWork) {
@@ -1093,15 +1007,6 @@ public class WebSession extends BaseWebSession
}
}
private static class PersistentAttribute {
private final Object value;
public PersistentAttribute(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
private record PersistentAttribute(Object value) {
}
}

Some files were not shown because too many files have changed in this diff Show More