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'
+ }
+});