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}
-
+ {#await import('./AppConnectLightweightResourcePicker.svelte')}
+
+ {:then Module}
+
+ {/await}
{/key}
{/if}
{:else}
@@ -105,12 +90,31 @@
tooltip="Resources represent connections to third party systems. Learn more on how to integrate external APIs."
documentationLink="https://www.windmill.dev/docs/integrations/integrations_on_windmill"
>
-
+ {:then Module}
+ {
+ sendUserToast(e.detail, true)
+ }}
+ on:refresh={(e) => {
+ value = e.detail
+ valueSelect = { value, label: value }
+ drawer?.closeDrawer?.()
+ open = false
+ }}
+ />
+ {/await}
+
+
{/if}
@@ -142,13 +146,11 @@