diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 75e890abc..3f0ecd84c 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -43,13 +43,13 @@ jobs: verbose: true - run: yarn test:e2e:ci - - name: Build and Push Staging Docker Image + - name: Build and Push Development Docker Image # Only run on push if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }} run: | docker login -u $DOCKER_USER -p $DOCKER_PASSWORD yarn build - yarn build:docker:staging + yarn build:docker:develop env: DOCKER_USER: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }} diff --git a/hosting/envoy.dev.yaml.hbs b/hosting/envoy.dev.yaml.hbs index 080311ee4..76417b3e0 100644 --- a/hosting/envoy.dev.yaml.hbs +++ b/hosting/envoy.dev.yaml.hbs @@ -38,6 +38,11 @@ static_resources: route: cluster: server-dev + - match: { prefix: "/app/" } + route: + cluster: server-dev + prefix_rewrite: "/" + # the below three cases are needed to make sure # all traffic prefixed for the builder is passed through # correctly. diff --git a/hosting/envoy.yaml b/hosting/envoy.yaml index 20e912434..d7b34f4d5 100644 --- a/hosting/envoy.yaml +++ b/hosting/envoy.yaml @@ -139,5 +139,5 @@ static_resources: address: socket_address: address: watchtower-service - port_value: 6161 + port_value: 8080 diff --git a/hosting/scripts/linux/release-to-docker-hub.sh b/hosting/scripts/linux/release-to-docker-hub.sh index b1a79c964..b3c380f72 100755 --- a/hosting/scripts/linux/release-to-docker-hub.sh +++ b/hosting/scripts/linux/release-to-docker-hub.sh @@ -8,9 +8,5 @@ echo "Tagging images with SHA: $GITHUB_SHA and tag: $tag" docker tag app-service budibase/apps:$tag docker tag worker-service budibase/worker:$tag -# Tag with git sha -docker tag app-service budibase/apps:$GITHUB_SHA -docker tag worker-service budibase/worker:$GITHUB_SHA - -docker push budibase/apps -docker push budibase/worker +docker push budibase/apps:$tag +docker push budibase/worker:$tag diff --git a/lerna.json b/lerna.json index de9808a22..297aaa41b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.9.51", + "version": "0.9.53", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/package.json b/package.json index aa4cc3e79..5a0a0d749 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,6 @@ "test:e2e": "lerna run cy:test", "test:e2e:ci": "lerna run cy:ci", "build:docker": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -", - "build:docker:staging": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh staging && cd -" + "build:docker:develop": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh develop && cd -" } } diff --git a/packages/auth/package.json b/packages/auth/package.json index 0cf7ae32e..5fbde7f1b 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "0.9.51", + "version": "0.9.53", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js index 5d9056b19..64494f709 100644 --- a/packages/auth/src/middleware/authenticated.js +++ b/packages/auth/src/middleware/authenticated.js @@ -22,6 +22,12 @@ function buildNoAuthRegex(patterns) { }) } +function finalise(ctx, { authenticated, user, internal } = {}) { + ctx.isAuthenticated = authenticated || false + ctx.user = user + ctx.internal = internal || false +} + module.exports = (noAuthPatterns = [], opts) => { const noAuthOptions = noAuthPatterns ? buildNoAuthRegex(noAuthPatterns) : [] return async (ctx, next) => { @@ -36,35 +42,39 @@ module.exports = (noAuthPatterns = [], opts) => { return next() } try { - const apiKey = ctx.request.headers["x-budibase-api-key"] // check the actual user is authenticated first const authCookie = getCookie(ctx, Cookies.Auth) - - // this is an internal request, no user made it - if (apiKey && apiKey === env.INTERNAL_API_KEY) { - ctx.isAuthenticated = true - ctx.internal = true - } else if (authCookie) { + let authenticated = false, + user = null, + internal = false + if (authCookie) { try { const db = database.getDB(StaticDatabases.GLOBAL.name) - const user = await db.get(authCookie.userId) + user = await db.get(authCookie.userId) delete user.password - ctx.isAuthenticated = true - ctx.user = user + authenticated = true } catch (err) { // remove the cookie as the use does not exist anymore clearCookie(ctx, Cookies.Auth) } } + const apiKey = ctx.request.headers["x-budibase-api-key"] + // this is an internal request, no user made it + if (!authenticated && apiKey && apiKey === env.INTERNAL_API_KEY) { + authenticated = true + internal = true + } // be explicit - if (ctx.isAuthenticated !== true) { - ctx.isAuthenticated = false + if (authenticated !== true) { + authenticated = false } + // isAuthenticated is a function, so use a variable to be able to check authed state + finalise(ctx, { authenticated, user, internal }) return next() } catch (err) { // allow configuring for public access if (opts && opts.publicAllowed) { - ctx.isAuthenticated = false + finalise(ctx, { authenticated: false }) } else { ctx.throw(err.status || 403, err) } diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 3325b2308..847a310c9 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "0.9.51", + "version": "0.9.53", "license": "AGPL-3.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/bbui/src/Table/StringRenderer.svelte b/packages/bbui/src/Table/StringRenderer.svelte index 275683961..6fd731f5e 100644 --- a/packages/bbui/src/Table/StringRenderer.svelte +++ b/packages/bbui/src/Table/StringRenderer.svelte @@ -2,7 +2,7 @@ export let value -
{value}
+
{typeof value === "object" ? JSON.stringify(value) : value}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js index 6d469e090..e25159593 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js +++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js @@ -9,8 +9,10 @@ import SqlServer from "./SQLServer.svelte" import MySQL from "./MySQL.svelte" import ArangoDB from "./ArangoDB.svelte" import Rest from "./Rest.svelte" +import Budibase from "./Budibase.svelte" export default { + BUDIBASE: Budibase, POSTGRES: Postgres, DYNAMODB: DynamoDB, MONGODB: MongoDB, diff --git a/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte b/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte index a03f07e74..180d03f7f 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte +++ b/packages/builder/src/components/backend/DatasourceNavigator/modals/CreateDatasourceModal.svelte @@ -23,16 +23,17 @@ } async function saveDatasource() { - const { type, ...config } = integration + const { type, plus, ...config } = integration // Create datasource const response = await datasources.save({ name, source: type, config, + plus, }) notifications.success(`Datasource ${name} created successfully.`) - analytics.captureEvent("Datasource Created", { name }) + analytics.captureEvent("Datasource Created", { name, type }) // Navigate to new datasource $goto(`./datasource/${response._id}`) diff --git a/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte b/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte index fa8733a8b..4291738d3 100644 --- a/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte +++ b/packages/builder/src/components/backend/TableNavigator/TableNavigator.svelte @@ -6,6 +6,8 @@ import EditViewPopover from "./popovers/EditViewPopover.svelte" import NavItem from "components/common/NavItem.svelte" + export let sourceId + $: selectedView = $views.selected && $views.selected.name function selectTable(table) { @@ -31,12 +33,13 @@ {#if $database?._id}
- {#each $tables.list as table, idx} + {#each $tables.list.filter(table => table.sourceId === sourceId) as table, idx} 0} icon={table._id === TableNames.USERS ? "UserGroup" : "Table"} text={table.name} - selected={selectedView === `all_${table._id}`} + selected={$tables.selected?._id === table._id} on:click={() => selectTable(table)} > {#if table._id !== TableNames.USERS} @@ -45,7 +48,7 @@ {#each Object.keys(table.views || {}) as viewName, idx (idx)} diff --git a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte index 17d5aa204..2513c6c7e 100644 --- a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte +++ b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte @@ -1,15 +1,15 @@ + + + + + + diff --git a/packages/builder/src/components/deploy/DeployModal.svelte b/packages/builder/src/components/deploy/DeployModal.svelte index bade2605d..6e1b5f76e 100644 --- a/packages/builder/src/components/deploy/DeployModal.svelte +++ b/packages/builder/src/components/deploy/DeployModal.svelte @@ -1,10 +1,10 @@ + +
+ This action doesn't require any additional settings. +
+ + diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js index a3e43cb04..b8114461f 100644 --- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js +++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/index.js @@ -4,6 +4,7 @@ import DeleteRow from "./DeleteRow.svelte" import ExecuteQuery from "./ExecuteQuery.svelte" import TriggerAutomation from "./TriggerAutomation.svelte" import ValidateForm from "./ValidateForm.svelte" +import LogOut from "./LogOut.svelte" // Defines which actions are available to configure in the front end. // Unfortunately the "name" property is used as the identifier so please don't @@ -37,4 +38,8 @@ export default [ name: "Validate Form", component: ValidateForm, }, + { + name: "Log Out", + component: LogOut, + }, ] diff --git a/packages/builder/src/constants/index.js b/packages/builder/src/constants/index.js index 8a0e8fd60..aefc1fab0 100644 --- a/packages/builder/src/constants/index.js +++ b/packages/builder/src/constants/index.js @@ -31,3 +31,5 @@ export const LAYOUT_NAMES = { PUBLIC: "layout_private_master", }, } + +export const BUDIBASE_INTERNAL_DB = "bb_internal" diff --git a/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte index 6910d3e92..6ce765d42 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/_layout.svelte @@ -1,49 +1,27 @@