From e44decb9c2c0c657312a8f79d71262001bce7813 Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 8 Oct 2024 20:08:29 +0200 Subject: [PATCH 1/5] BYPASSRLS admin policy falllback (#4493) * BYPASSRLS admin policy falllback * use fixed list instead --------- Co-authored-by: Ruben Fiszel --- ...d41037de4bc69dd434232029c731cbbcbc22f.json | 12 ------- ...05d0cfb0d6cdba9cc56c6139f57e46345f843.json | 20 ------------ backend/custom_migrations/bypassrls_1.sql | 14 -------- .../20241006144414_admin_policy.down.sql | 1 + .../20241006144414_admin_policy.up.sql | 24 ++++++++++++++ backend/windmill-api/src/db.rs | 32 ------------------- 6 files changed, 25 insertions(+), 78 deletions(-) delete mode 100644 backend/.sqlx/query-722a3096f03d25ef94292d53801d41037de4bc69dd434232029c731cbbcbc22f.json delete mode 100644 backend/.sqlx/query-eb1f916f9beea3eea83ce359f5305d0cfb0d6cdba9cc56c6139f57e46345f843.json delete mode 100644 backend/custom_migrations/bypassrls_1.sql create mode 100644 backend/migrations/20241006144414_admin_policy.down.sql create mode 100644 backend/migrations/20241006144414_admin_policy.up.sql diff --git a/backend/.sqlx/query-722a3096f03d25ef94292d53801d41037de4bc69dd434232029c731cbbcbc22f.json b/backend/.sqlx/query-722a3096f03d25ef94292d53801d41037de4bc69dd434232029c731cbbcbc22f.json deleted file mode 100644 index 2e4dee2a30..0000000000 --- a/backend/.sqlx/query-722a3096f03d25ef94292d53801d41037de4bc69dd434232029c731cbbcbc22f.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO windmill_migrations (name) VALUES ('bypassrls_1-2')", - "describe": { - "columns": [], - "parameters": { - "Left": [] - }, - "nullable": [] - }, - "hash": "722a3096f03d25ef94292d53801d41037de4bc69dd434232029c731cbbcbc22f" -} diff --git a/backend/.sqlx/query-eb1f916f9beea3eea83ce359f5305d0cfb0d6cdba9cc56c6139f57e46345f843.json b/backend/.sqlx/query-eb1f916f9beea3eea83ce359f5305d0cfb0d6cdba9cc56c6139f57e46345f843.json deleted file mode 100644 index ecd83ae2e3..0000000000 --- a/backend/.sqlx/query-eb1f916f9beea3eea83ce359f5305d0cfb0d6cdba9cc56c6139f57e46345f843.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = 'bypassrls_1-2')", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "eb1f916f9beea3eea83ce359f5305d0cfb0d6cdba9cc56c6139f57e46345f843" -} diff --git a/backend/custom_migrations/bypassrls_1.sql b/backend/custom_migrations/bypassrls_1.sql deleted file mode 100644 index 1918b26b0b..0000000000 --- a/backend/custom_migrations/bypassrls_1.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE POLICY admin_policy ON account TO windmill_admin USING (true); -CREATE POLICY admin_policy ON app TO windmill_admin USING (true); -CREATE POLICY admin_policy ON audit TO windmill_admin USING (true); -CREATE POLICY admin_policy ON capture TO windmill_admin USING (true); -CREATE POLICY admin_policy ON completed_job TO windmill_admin USING (true); -CREATE POLICY admin_policy ON flow TO windmill_admin USING (true); -CREATE POLICY admin_policy ON folder TO windmill_admin USING (true); -CREATE POLICY admin_policy ON queue TO windmill_admin USING (true); -CREATE POLICY admin_policy ON raw_app TO windmill_admin USING (true); -CREATE POLICY admin_policy ON resource TO windmill_admin USING (true); -CREATE POLICY admin_policy ON schedule TO windmill_admin USING (true); -CREATE POLICY admin_policy ON script TO windmill_admin USING (true); -CREATE POLICY admin_policy ON usr_to_group TO windmill_admin USING (true); -CREATE POLICY admin_policy ON variable TO windmill_admin USING (true); \ No newline at end of file diff --git a/backend/migrations/20241006144414_admin_policy.down.sql b/backend/migrations/20241006144414_admin_policy.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20241006144414_admin_policy.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20241006144414_admin_policy.up.sql b/backend/migrations/20241006144414_admin_policy.up.sql new file mode 100644 index 0000000000..e6a3f3807e --- /dev/null +++ b/backend/migrations/20241006144414_admin_policy.up.sql @@ -0,0 +1,24 @@ +-- Add up migration script here +DO +$$ +DECLARE + tbl_name text; + policy_exists boolean; + tbl_names text[] := ARRAY['account', 'app', 'audit', 'capture', 'completed_job', 'flow', 'folder', 'http_trigger', 'queue', 'raw_app', 'resource', 'schedule', 'script', 'usr_to_group', 'variable']; +BEGIN + FOR tbl_name IN SELECT unnest(tbl_names) + LOOP + SELECT EXISTS ( + SELECT 1 + FROM pg_policies + WHERE schemaname = 'public' + AND tablename = tbl_name + AND policyname = 'admin_policy' + ) INTO policy_exists; + + IF NOT policy_exists THEN + EXECUTE format('CREATE POLICY admin_policy ON %I TO windmill_admin USING (true);', tbl_name); + END IF; + END LOOP; +END; +$$; \ No newline at end of file diff --git a/backend/windmill-api/src/db.rs b/backend/windmill-api/src/db.rs index d6e6ed1a1d..c44b8c18e6 100644 --- a/backend/windmill-api/src/db.rs +++ b/backend/windmill-api/src/db.rs @@ -199,11 +199,6 @@ pub async fn migrate(db: &DB) -> Result<(), Error> { Err(err) => Err(err), }?; - #[cfg(feature = "enterprise")] - if let Err(e) = windmill_migrations(&mut custom_migrator, db).await { - tracing::error!("Could not apply windmill custom migrations: {e:#}") - } - Ok(()) } @@ -497,33 +492,6 @@ async fn fix_job_completed_index(db: &DB) -> Result<(), Error> { Ok(()) } -#[cfg(feature = "enterprise")] -async fn windmill_migrations(migrator: &mut CustomMigrator, db: &DB) -> Result<(), Error> { - if std::env::var("MIGRATION_NO_BYPASSRLS").is_ok() { - migrator.lock().await?; - let has_done_migration = sqlx::query_scalar!( - "SELECT EXISTS(SELECT name FROM windmill_migrations WHERE name = 'bypassrls_1-2')", - ) - .fetch_one(db) - .await? - .unwrap_or(false); - - if !has_done_migration { - let query = include_str!("../../custom_migrations/bypassrls_1.sql"); - tracing::info!("Applying bypassrls_1.sql"); - let mut tx: sqlx::Transaction<'_, Postgres> = db.begin().await?; - tx.execute(query).await?; - tracing::info!("Applied bypassrls_1.sql"); - sqlx::query!("INSERT INTO windmill_migrations (name) VALUES ('bypassrls_1-2')") - .execute(&mut *tx) - .await?; - tx.commit().await?; - } - migrator.unlock().await?; - } - Ok(()) -} - #[derive(Clone, Debug)] pub struct ApiAuthed { pub email: String, From b579db61ec1d54e2ea0e026f576c85cfb707071e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 8 Oct 2024 19:34:54 -0700 Subject: [PATCH 2/5] allow more customisation of frontend (#4508) * all * npm check --- frontend/package.json | 22 ++ ...ppConnectLightweightResourcePicker.svelte} | 16 +- frontend/src/lib/components/ArgInput.svelte | 8 +- .../src/lib/components/CustomPopover.svelte | 2 +- .../src/lib/components/DisplayResult.svelte | 2 +- .../src/lib/components/FlowBuilder.svelte | 2 + .../src/lib/components/FlowInputViewer.svelte | 29 +++ .../src/lib/components/FlowMetadata.svelte | 4 +- frontend/src/lib/components/FlowViewer.svelte | 24 +- .../LightweightResourcePicker.svelte | 66 ++--- .../src/lib/components/ManualPopover.svelte | 2 +- .../lib/components/ObjectResourceInput.svelte | 8 +- frontend/src/lib/components/Popover.svelte | 2 +- frontend/src/lib/components/Portal.svelte | 15 +- .../src/lib/components/ResourceEditor.svelte | 9 +- .../src/lib/components/ResourcePicker.svelte | 26 +- frontend/src/lib/components/RunForm.svelte | 2 +- .../src/lib/components/SavedInputs.svelte | 4 +- .../components/ScriptVersionHistory.svelte | 113 +++++---- frontend/src/lib/components/TimeAgo.svelte | 11 +- .../apps/components/buttons/AppButton.svelte | 2 +- .../display/dbtable/AppDbExplorer.svelte | 2 +- .../components/inputs/AppMultiSelect.svelte | 2 +- .../components/inputs/AppMultiSelectV2.svelte | 2 +- .../apps/components/layout/AppDrawer.svelte | 2 +- .../apps/components/layout/AppModal.svelte | 2 +- .../apps/editor/GridEditorMenu.svelte | 2 +- .../lib/ConditionalPortal.svelte | 2 +- .../lib/ConditionalPortalGlobal.svelte | 2 +- .../common/button/ButtonDropdown.svelte | 2 +- .../common/drawer/ConditionalPortal.svelte | 2 +- .../lib/components/common/menu/MenuV2.svelte | 2 +- .../common/modal/AlwaysMountedModal.svelte | 2 +- .../components/common/popup/PopupV2.svelte | 2 +- .../src/lib/components/details/Menu.svelte | 2 +- .../lib/components/flows/FlowEditor.svelte | 3 +- .../lib/components/flows/FlowHistory.svelte | 214 +---------------- .../components/flows/FlowHistoryInner.svelte | 212 +++++++++++++++++ .../flows/content/FlowEditorPanel.svelte | 3 +- .../components/flows/content/FlowInput.svelte | 128 +++++----- .../flows/content/FlowModuleScript.svelte | 2 +- .../flows/map/FlowModuleSchemaMap.svelte | 2 +- .../lib/components/icons/WindmillIcon.svelte | 225 ++++++++++-------- frontend/src/lib/components/icons/store.ts | 1 + .../multiselect/MultiSelectWrapper.svelte | 2 +- .../propertyPicker/ObjectViewer.svelte | 2 +- .../src/lib/components/runs/RunRow.svelte | 10 +- .../schema/FlowPropertyEditor.svelte | 1 + .../search/GlobalSearchModal.svelte | 2 +- .../lib/init_scripts/python_failure_module.ts | 8 - .../src/lib/init_scripts/python_init_code.ts | 40 ---- .../init_scripts/python_init_code_clear.ts | 5 - .../init_scripts/python_init_code_trigger.ts | 14 -- frontend/src/lib/script_helpers.ts | 146 ++++++++---- .../(logged)/flows/get/[...path]/+page.svelte | 16 +- .../(root)/(logged)/run/[...run]/+page.svelte | 37 ++- .../scripts/get/[...hash]/+page.svelte | 3 +- .../(logged)/workspace_settings/+page.svelte | 16 +- .../src/routes/(root)/embed_connect/+page.js | 5 - 59 files changed, 786 insertions(+), 708 deletions(-) rename frontend/src/{routes/(root)/embed_connect/+page.svelte => lib/components/AppConnectLightweightResourcePicker.svelte} (77%) create mode 100644 frontend/src/lib/components/FlowInputViewer.svelte create mode 100644 frontend/src/lib/components/flows/FlowHistoryInner.svelte create mode 100644 frontend/src/lib/components/icons/store.ts delete mode 100644 frontend/src/lib/init_scripts/python_failure_module.ts delete mode 100644 frontend/src/lib/init_scripts/python_init_code.ts delete mode 100644 frontend/src/lib/init_scripts/python_init_code_clear.ts delete mode 100644 frontend/src/lib/init_scripts/python_init_code_trigger.ts delete mode 100644 frontend/src/routes/(root)/embed_connect/+page.js diff --git a/frontend/package.json b/frontend/package.json index 4fc20b556a..02a438827a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -300,6 +300,14 @@ "types": "./package/utils.d.ts", "default": "./package/utils.js" }, + "./icons/store": { + "types": "./package/icons/store.d.ts", + "default": "./package/icons/store.js" + }, + "./script_helpers": { + "types": "./package/script_helpers.d.ts", + "default": "./package/script_helpers.js" + }, "./infer": { "types": "./package/infer.d.ts", "default": "./package/infer.js" @@ -341,6 +349,11 @@ "types": "./package/components/DropdownV2.svelte.d.ts", "svelte": "./package/components/DropdownV2.svelte", "default": "./package/components/DropdownV2.svelte" + }, + "./components/flows/FlowHistoryInner.svelte": { + "types": "./package/components/flows/FlowHistoryInner.svelte.d.ts", + "svelte": "./package/components/flows/FlowHistoryInner.svelte", + "default": "./package/components/flows/FlowHistoryInner.svelte" } }, "files": [ @@ -426,6 +439,9 @@ "components/EditableSchemaWrapper.svelte": [ "./package/components/schema/EditableSchemaWrapper.svelte.d.ts" ], + "components/flows/FlowHistoryInner.svelte": [ + "./package/components/flows/FlowHistoryInner.svelte.d.ts" + ], "utils": [ "./package/utils.d.ts" ], @@ -461,6 +477,12 @@ ], "components/DropdownV2.svelte": [ "./package/components/DropdownV2.svelte.d.ts" + ], + "script_helpers": [ + "./package/script_helpers.d.ts" + ], + "icons/store": [ + "./package/icons/store.d.ts" ] } }, diff --git a/frontend/src/routes/(root)/embed_connect/+page.svelte b/frontend/src/lib/components/AppConnectLightweightResourcePicker.svelte similarity index 77% rename from frontend/src/routes/(root)/embed_connect/+page.svelte rename to frontend/src/lib/components/AppConnectLightweightResourcePicker.svelte index 87ae396e55..4e59ea7858 100644 --- a/frontend/src/routes/(root)/embed_connect/+page.svelte +++ b/frontend/src/lib/components/AppConnectLightweightResourcePicker.svelte @@ -1,5 +1,4 @@ + +
    + {#if schema == undefined} +
  • No inputs
  • + {:else} + {#each Object.entries(schema.properties ?? {}) as [inp, v]} +
  • + {v?.default != undefined && v?.default != '' + ? 'default: ' + JSON.stringify(v?.default) + : ''} +
  • + {/each} + {/if} +
diff --git a/frontend/src/lib/components/FlowMetadata.svelte b/frontend/src/lib/components/FlowMetadata.svelte index 46e0a6fda9..3ab5d3d416 100644 --- a/frontend/src/lib/components/FlowMetadata.svelte +++ b/frontend/src/lib/components/FlowMetadata.svelte @@ -26,7 +26,7 @@ {#if job['success'] != undefined} Received job: {displayDate(job.created_at ?? '')} {:else} - Received job + Received job {/if} {job?.created_at} @@ -35,7 +35,7 @@
- Started + Started {job?.started_at}
diff --git a/frontend/src/lib/components/FlowViewer.svelte b/frontend/src/lib/components/FlowViewer.svelte index 66d37704bf..cc1350b75a 100644 --- a/frontend/src/lib/components/FlowViewer.svelte +++ b/frontend/src/lib/components/FlowViewer.svelte @@ -2,11 +2,11 @@ import type { FlowValue } from '$lib/gen' import { Tab, Tabs, TabContent } from './common' import SchemaViewer from './SchemaViewer.svelte' - import FieldHeader from './FieldHeader.svelte' import FlowGraphViewer from './FlowGraphViewer.svelte' import HighlightTheme from './HighlightTheme.svelte' import FlowViewerInner from './FlowViewerInner.svelte' + import FlowInputViewer from './FlowInputViewer.svelte' export let flow: { summary: string @@ -27,10 +27,6 @@ if (initialOpen) { open[initialOpen] = true } - - function toAny(x: unknown): any { - return x as any - } @@ -54,23 +50,7 @@ Flow Input

{#if flow.schema && flow.schema.properties && Object.keys(flow.schema.properties).length > 0 && flow.schema} -
    - {#each Object.entries(flow.schema.properties) as [inp, v]} -
  • - {toAny(v)?.default != undefined - ? 'default: ' + JSON.stringify(toAny(v)?.default) - : ''} -
  • - {/each} -
+ {:else}
No inputs
{/if} diff --git a/frontend/src/lib/components/LightweightResourcePicker.svelte b/frontend/src/lib/components/LightweightResourcePicker.svelte index c5b34f9af9..e0c250f32f 100644 --- a/frontend/src/lib/components/LightweightResourcePicker.svelte +++ b/frontend/src/lib/components/LightweightResourcePicker.svelte @@ -1,6 +1,5 @@ @@ -89,12 +71,15 @@ {#if expressOAuthSetup} {#if open} {#key refreshCount} -