diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 524702e..24311b3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,10 +5,12 @@ on: branches: ["master"] paths: - "**.go" + - "ui/**" pull_request: branches: ["master"] paths: - "**.go" + - "ui/**" jobs: build: runs-on: ubuntu-latest @@ -17,6 +19,7 @@ jobs: - name: Check out code uses: actions/checkout@v2 + - name: Set up Go 1.x uses: actions/setup-go@v2 with: diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml new file mode 100644 index 0000000..f07e1c2 --- /dev/null +++ b/.github/workflows/ui-tests.yml @@ -0,0 +1,33 @@ +name: UI Tests + +on: + push: + branches: ["master"] + paths: + - "ui/**" + pull_request: + branches: ["master"] + paths: + - "ui/**" + +jobs: + test-ui: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: | + cd ui + npm install + + - name: Run Vitest + run: | + cd ui + npx vitest run diff --git a/README.md b/README.md index 48bc583..bc8e9f8 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,10 @@ This guide now specifically refers to the Gatesentry software and uses the `gate ### DNS Information -Gatesentry ships with a built in DNS server, which can be used to block domains. The server as of now forwards requests to Google DNS for resolution, this can be modified from inside the `application/dns/server/server.go` file. +Gatesentry ships with a built in DNS server which can be used to block domains. +The resolver used for forwarding requests can now be configured via the +application settings ("dns_resolver"). It defaults to Google DNS +(`8.8.8.8:53`). ## Local Development diff --git a/application/dns/server/server.go b/application/dns/server/server.go index fedbf1f..056cdb1 100644 --- a/application/dns/server/server.go +++ b/application/dns/server/server.go @@ -38,6 +38,12 @@ var ( logger *gatesentryLogger.Log ) +func SetExternalResolver(resolver string) { + if resolver != "" { + externalResolver = resolver + } +} + var server *dns.Server var serverRunning bool = false var restartDnsSchedulerChan chan bool @@ -54,6 +60,7 @@ func StartDNSServer(basePath string, ilogger *gatesentryLogger.Log, blockedLists logger = ilogger logsPath = basePath + logsPath + SetExternalResolver(settings.Get("dns_resolver")) go gatesentryDnsHttpServer.StartHTTPServer() // InitializeLogs() // go gatesentryDnsFilter.InitializeBlockedDomains(&blockedDomains, &blockedLists) diff --git a/application/runtime.go b/application/runtime.go index db659c7..f8d6ab2 100644 --- a/application/runtime.go +++ b/application/runtime.go @@ -176,6 +176,7 @@ func (R *GSRuntime) Init() { R.GSSettings.SetDefault("timezone", "Europe/Oslo") R.GSSettings.SetDefault("enable_https_filtering", "false") R.GSSettings.SetDefault("enable_dns_server", "true") + R.GSSettings.SetDefault("dns_resolver", "8.8.8.8:53") R.GSSettings.SetDefault("idemail", "") R.GSSettings.SetDefault("enable_ai_image_filtering", "false") R.GSSettings.SetDefault("ai_scanner_url", "") diff --git a/application/webserver/endpoints/handler_settings.go b/application/webserver/endpoints/handler_settings.go index 8248fee..453ed52 100644 --- a/application/webserver/endpoints/handler_settings.go +++ b/application/webserver/endpoints/handler_settings.go @@ -5,6 +5,7 @@ import ( "log" "time" + gatesentryDnsServer "bitbucket.org/abdullah_irfan/gatesentryf/dns/server" gatesentry2storage "bitbucket.org/abdullah_irfan/gatesentryf/storage" gatesentryWebserverTypes "bitbucket.org/abdullah_irfan/gatesentryf/webserver/types" "github.com/badoux/checkmail" @@ -24,7 +25,7 @@ func GSApiSettingsGET(requestedId string, settings *gatesentry2storage.MapStore) value = string(valueJson) } return struct{ Value string }{Value: value} - case "blocktimes", "strictness", "timezone", "idemail", "enable_https_filtering", "capem", "keypem", "enable_dns_server", "dns_custom_entries", "ai_scanner_url", "enable_ai_image_filtering", "EnableUsers": + case "blocktimes", "strictness", "timezone", "idemail", "enable_https_filtering", "capem", "keypem", "enable_dns_server", "dns_custom_entries", "ai_scanner_url", "enable_ai_image_filtering", "EnableUsers", "dns_resolver": value := settings.Get(requestedId) return struct { Key string @@ -81,12 +82,16 @@ func GSApiSettingsPOST(requestedId string, settings *gatesentry2storage.MapStore requestedId == "enable_dns_server" || requestedId == "enable_https_filtering" || requestedId == "enable_ai_image_filtering" || - requestedId == "ai_scanner_url" || - requestedId == "EnableUsers" || - requestedId == "strictness" || - requestedId == "capem" || - requestedId == "keypem" { + requestedId == "ai_scanner_url" || + requestedId == "EnableUsers" || + requestedId == "strictness" || + requestedId == "capem" || + requestedId == "keypem" || + requestedId == "dns_resolver" { settings.Update(requestedId, temp.Value) + if requestedId == "dns_resolver" { + gatesentryDnsServer.SetExternalResolver(temp.Value) + } } // fmt.Println( temp ); diff --git a/ui/package.json b/ui/package.json index 1206f4d..473ef85 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,20 +8,24 @@ "build": "vite build", "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json", - "format": "npx prettier --write --plugin prettier-plugin-svelte src/*" + "format": "npx prettier --write --plugin prettier-plugin-svelte src/*", + "test": "vitest" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^2.4.2", + "@testing-library/svelte": "^5.2.8", "@tsconfig/svelte": "^5.0.0", "carbon-components-svelte": "^0.79.0", "carbon-icons-svelte": "^12.1.0", + "jsdom": "^22.0.0", "prettier": "^3.0.3", "prettier-plugin-svelte": "^3.0.3", "svelte": "^4.0.5", "svelte-check": "^3.4.6", "tslib": "^2.6.0", "typescript": "^5.0.2", - "vite": "^4.5.3" + "vite": "^4.5.3", + "vitest": "^1.0.0" }, "dependencies": { "@carbon/charts": "^1.11.21", diff --git a/ui/src/components/__tests__/dns_ui.test.ts b/ui/src/components/__tests__/dns_ui.test.ts new file mode 100644 index 0000000..a4488ab --- /dev/null +++ b/ui/src/components/__tests__/dns_ui.test.ts @@ -0,0 +1,11 @@ +import { readFileSync } from 'fs'; +import { compile } from 'svelte/compiler'; +import { test, expect } from 'vitest'; +import path from 'path'; + +test('dns page exposes resolver input', () => { + const file = path.resolve(__dirname, '../../routes/dns/dns.svelte'); + const source = readFileSync(file, 'utf-8'); + const { js } = compile(source, { generate: 'dom' }); + expect(js.code).toMatch('dns_resolver'); +}); diff --git a/ui/src/language/en.json b/ui/src/language/en.json index a4426fa..de8ca09 100644 --- a/ui/src/language/en.json +++ b/ui/src/language/en.json @@ -5,5 +5,6 @@ "Edit": "Edit", "Blocked Keywords": "Blocked Keywords", "Dashboard": "Dashboard", - "Logs": "Logs" + "Logs": "Logs", + "DNS Resolver": "DNS Resolver" } diff --git a/ui/src/routes/dns/dns.svelte b/ui/src/routes/dns/dns.svelte index bb00059..4ab1301 100644 --- a/ui/src/routes/dns/dns.svelte +++ b/ui/src/routes/dns/dns.svelte @@ -13,6 +13,7 @@ import { store } from "../../store/apistore"; import { set } from "lodash"; import { Restart } from "carbon-icons-svelte"; + import ConnectedSettingInput from "../../components/connectedSettingInput.svelte"; let dnsInfo = null; const loadDnsInfo = async () => { @@ -75,6 +76,14 @@ {/if}
+ +
diff --git a/ui/vitest.config.ts b/ui/vitest.config.ts new file mode 100644 index 0000000..2459b6d --- /dev/null +++ b/ui/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + plugins: [svelte()], + test: { + environment: 'jsdom' + } +});