From c1f208ef659d8ded195fcaf9bd1facfab7fd29be Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 15 Jul 2026 08:44:11 +0000 Subject: [PATCH 1/6] Pull request 2714: AGDNS-3548-new-client-ci Squashed commit of the following: commit 40dcae233137095452b49a283e81cfa4ac26c442 Author: Ainar Garipov Date: Tue Jul 14 21:17:00 2026 +0300 bamboo-specs: fix e2e commit 6fa4a7f5fec1f141ddb7826692e3d6da0e7a4388 Author: Ainar Garipov Date: Tue Jul 14 21:03:25 2026 +0300 all: support new client in ci --- bamboo-specs/release.yaml | 22 +++++++++++++--------- bamboo-specs/test.yaml | 13 +++++++++---- docker/frontend.Dockerfile | 16 ++++++++++++++-- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/bamboo-specs/release.yaml b/bamboo-specs/release.yaml index 82b2dcd6934..d7e6ca3ab20 100644 --- a/bamboo-specs/release.yaml +++ b/bamboo-specs/release.yaml @@ -10,6 +10,7 @@ # flaky test suite. 'cacheBuster': '0' 'channel': 'edge' + 'clientDir': 'client' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' @@ -67,8 +68,9 @@ docker info docker build \ - --build-arg "BASE_IMAGE=${bamboo.dockerFrontend}" \ + --build-arg "BASE_IMAGE=${bamboo_dockerFrontend}" \ --build-arg "CACHE_BUSTER=${bamboo_cacheBuster}" \ + --build-arg "CLIENT_DIR=${bamboo_clientDir}" \ --output '.' \ --progress 'plain' \ --target 'builder-exporter' \ @@ -104,7 +106,7 @@ set -e -f -u -x # Explicitly checkout the revision that we need. - git checkout "${bamboo.repository.revision.number}" + git checkout "${bamboo_repository_revision_number}" version="$(env CHANNEL=${bamboo_channel} sh ./scripts/make/version.sh)" readonly version @@ -160,8 +162,8 @@ # Login to DockerHub. docker login \ - -u="${bamboo.dockerHubUsername}" \ - -p="${bamboo.dockerHubPassword}" + -u="${bamboo_dockerHubUsername}" \ + -p="${bamboo_dockerHubPassword}" # Boot the builder. docker buildx inspect --bootstrap @@ -172,8 +174,8 @@ # Prepare and push the build. env \ - CHANNEL="${bamboo.channel}" \ - REVISION="${bamboo.repository.revision.number}" \ + CHANNEL="${bamboo_channel}" \ + REVISION="${bamboo_repository_revision_number}" \ DIST_DIR='dist' \ DOCKER_IMAGE_NAME='adguard/adguardhome' \ DOCKER_PUSH='1' \ @@ -202,7 +204,7 @@ cd ./dist/ - CHANNEL="${bamboo.channel}" + CHANNEL="${bamboo_channel}" export CHANNEL ../bamboo-deploy-publisher/deploy.sh adguard-home-"$CHANNEL" @@ -227,7 +229,7 @@ set -e -f -u -x - channel="${bamboo.channel}" + channel="${bamboo_channel}" readonly channel if [ "$channel" != 'release' ] && [ "${channel}" != 'beta' ] @@ -240,7 +242,7 @@ cd ./dist/ env\ - GITHUB_TOKEN="${bamboo.githubPublicRepoPassword}"\ + GITHUB_TOKEN="${bamboo_githubPublicRepoPassword}"\ ../bamboo-deploy-publisher/deploy.sh adguard-home-github 'triggers': @@ -279,6 +281,7 @@ # need to build a few of these. 'variables': 'channel': 'beta' + 'clientDir': 'client' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' # release-vX.Y.Z branches are the branches from which the actual final @@ -295,5 +298,6 @@ # are the ones that actually get released. 'variables': 'channel': 'release' + 'clientDir': 'client' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' diff --git a/bamboo-specs/test.yaml b/bamboo-specs/test.yaml index faedf10e39c..db9e8cd3d72 100644 --- a/bamboo-specs/test.yaml +++ b/bamboo-specs/test.yaml @@ -9,6 +9,7 @@ # flaky test suite. 'cacheBuster': '0' 'channel': 'development' + 'clientDir': 'client' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' @@ -58,8 +59,9 @@ docker info docker build \ - --build-arg "BASE_IMAGE=${bamboo.dockerFrontend}" \ + --build-arg "BASE_IMAGE=${bamboo_dockerFrontend}" \ --build-arg "CACHE_BUSTER=${bamboo_cacheBuster}" \ + --build-arg "CLIENT_DIR=${bamboo_clientDir}" \ --output '.' \ --progress 'plain' \ --target 'tester' \ @@ -127,8 +129,9 @@ docker info docker build \ - --build-arg "BASE_IMAGE=${bamboo.dockerFrontend}" \ + --build-arg "BASE_IMAGE=${bamboo_dockerFrontend}" \ --build-arg "CACHE_BUSTER=${bamboo_cacheBuster}" \ + --build-arg "CLIENT_DIR=${bamboo_clientDir}" \ --output '.' \ --progress 'plain' \ --target 'builder-exporter' \ @@ -216,8 +219,9 @@ docker info docker build \ - --build-arg "BASE_IMAGE=${bamboo.dockerFrontend}" \ + --build-arg "BASE_IMAGE=${bamboo_dockerFrontend}" \ --build-arg "CACHE_BUSTER=${bamboo_cacheBuster}" \ + --build-arg "CLIENT_DIR=${bamboo_clientDir}" \ --output '.' \ --progress 'plain' \ --target 'e2etester' \ @@ -254,6 +258,7 @@ # Set the default release channel on the release branch to beta, as we # may need to build a few of these. 'variables': + 'channel': 'candidate' + 'clientDir': 'client' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' - 'channel': 'candidate' diff --git a/docker/frontend.Dockerfile b/docker/frontend.Dockerfile index 0f4d3a9f38e..d37bdab7def 100644 --- a/docker/frontend.Dockerfile +++ b/docker/frontend.Dockerfile @@ -29,6 +29,7 @@ # NOTE: Keep in sync with bamboo-specs/bamboo.yaml. ARG BASE_IMAGE=adguard/home-js-builder:4.0 +ARG CLIENT_DIR=client # The dependencies stage is needed to install packages and tool dependencies. # This is also where binaries like osslsigncode, which may be required for tests @@ -38,13 +39,15 @@ ARG BASE_IMAGE=adguard/home-js-builder:4.0 FROM "$BASE_IMAGE" AS dependencies ADD Makefile /app/ ADD scripts /app/scripts -ADD client /app/client +ARG CLIENT_DIR +ADD "${CLIENT_DIR}" "/app/${CLIENT_DIR}" WORKDIR /app RUN \ --mount=type=cache,id=npm-root-cache,target=/root/.npm \ <<-'EOF' set -e -f -u -x make \ + CLIENT_DIR="${CLIENT_DIR}" \ VERBOSE=1 \ js-deps \ ; @@ -53,14 +56,16 @@ EOF # The linter stage is separated from the tester stage to make catching test # failures easier. FROM dependencies AS linter -ARG CACHE_BUSTER=0 ADD . /app +ARG CACHE_BUSTER=0 +ARG CLIENT_DIR WORKDIR /app RUN \ --mount=type=cache,id=npm-root-cache,target=/root/.npm \ <<-'EOF' set -e -f -u -x make \ + CLIENT_DIR="${CLIENT_DIR}" \ VERBOSE=1 \ js-typecheck \ js-lint \ @@ -70,11 +75,13 @@ EOF # The test stage. FROM linter AS tester ARG CACHE_BUSTER=0 +ARG CLIENT_DIR RUN \ --mount=type=cache,id=npm-root-cache,target=/root/.npm \ <<-'EOF' set -e -f -u -x make \ + CLIENT_DIR="${CLIENT_DIR}" \ VERBOSE=1 \ js-test \ ; @@ -83,6 +90,7 @@ EOF # The e2e test stage. FROM dependencies AS e2etester ARG CACHE_BUSTER=0 +ARG CLIENT_DIR ADD . /app WORKDIR /app RUN \ @@ -90,6 +98,7 @@ RUN \ <<-'EOF' set -e -f -u -x make \ + CLIENT_DIR="${CLIENT_DIR}" \ CI='true' \ VERBOSE=1 \ js-test-e2e \ @@ -99,6 +108,7 @@ EOF # The builder stage. FROM dependencies AS builder ARG CACHE_BUSTER=0 +ARG CLIENT_DIR ADD . /app WORKDIR /app RUN \ @@ -106,6 +116,7 @@ RUN \ <<-'EOF' set -e -f -u -x make \ + CLIENT_DIR="${CLIENT_DIR}" \ VERBOSE=1 \ js-build \ ; @@ -115,4 +126,5 @@ EOF # could be published. This stage should only be used in a CI. FROM scratch AS builder-exporter ARG CACHE_BUSTER=0 +ARG CLIENT_DIR COPY --from=builder /app/build /build From 4da215221ae8a27341681d2bb4fa4b91c0b6a8d6 Mon Sep 17 00:00:00 2001 From: Fedor Setrakov Date: Wed, 15 Jul 2026 09:15:56 +0000 Subject: [PATCH 2/6] Pull request 2700: 8183-include-edns Updates #8183. Squashed commit of the following: commit b6ada16f9121fd2ed3fae5de2446c8c2c42ef183 Author: f.setrakov Date: Wed Jul 15 12:03:19 2026 +0300 all: fix changelog commit c920b48346174d56a83ef69dc02c96ea05a60df3 Merge: 70a703c31 c1f208ef6 Author: f.setrakov Date: Wed Jul 15 11:47:39 2026 +0300 Merge branch 'master' into 8183-include-edns commit 70a703c31294d94835a319845e6faacc69983532 Author: f.setrakov Date: Mon Jul 13 15:27:07 2026 +0300 all: imp docs commit 941bdabebe8a7368abfeac96a6cf33d39b8d20b4 Author: f.setrakov Date: Thu Jul 9 14:36:41 2026 +0300 all: include edns opt for filtered req --- CHANGELOG.md | 8 ++++++-- internal/dnsforward/msg.go | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 531b9c674f1..0377da1700b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,12 @@ See also the [v0.107.79 GitHub milestone][ms-v0.107.79]. NOTE: Add new changes BELOW THIS COMMENT. --> +### Fixed + +- Blocked requests without an EDNS(0) OPT record ([#8183]). + +[#8183]: https://github.com/AdguardTeam/AdGuardHome/issues/8183 + @@ -62,8 +68,6 @@ See also the [v0.107.78 GitHub milestone][ms-v0.107.78]. - The `filtering` object of the YAML configuration now includes a new property, `max_http_size`, which defines the maximum size of the HTTP request for rulelists. To disable the limitation, set a large size, such as `1 TB`. -### Fixed - - Invalid AA flag in DNS responses ([#7955]). - The parsing of the `ech` parameter in DNS rewrite rules for the HTTPS record type ([#8276]). diff --git a/internal/dnsforward/msg.go b/internal/dnsforward/msg.go index 5dba5927aef..b361f22d7ee 100644 --- a/internal/dnsforward/msg.go +++ b/internal/dnsforward/msg.go @@ -17,10 +17,17 @@ import ( // template. Also extract all the methods to a separate entity. // reply creates a DNS response for req. +// +// NOTE: If req uses EDNS(0), the response copies its UDP size and DO flag. func (*Server) reply(req *dns.Msg, code int) (resp *dns.Msg) { resp = (&dns.Msg{}).SetRcode(req, code) resp.RecursionAvailable = true + opt := req.IsEdns0() + if opt != nil { + resp.SetEdns0(opt.UDPSize(), opt.Do()) + } + return resp } @@ -404,7 +411,11 @@ func (s *Server) NewMsgSERVFAIL(req *dns.Msg) (resp *dns.Msg) { // NewMsgNOTIMPLEMENTED implements the [proxy.MessageConstructor] interface for // *Server. func (s *Server) NewMsgNOTIMPLEMENTED(req *dns.Msg) (resp *dns.Msg) { - resp = s.reply(req, dns.RcodeNotImplemented) + // NOTE: [Server.reply] must not be used there, because it unconditionally + // copies UDP size and DO bit from the request, when in this case we want to + // use constant values. + resp = (&dns.Msg{}).SetRcode(req, dns.RcodeNotImplemented) + resp.RecursionAvailable = true // Most of the Internet and especially the inner core has an MTU of at least // 1500 octets. Maximum DNS/UDP payload size for IPv6 on MTU 1500 ethernet @@ -415,7 +426,10 @@ func (s *Server) NewMsgNOTIMPLEMENTED(req *dns.Msg) (resp *dns.Msg) { // NOTIMPLEMENTED without EDNS is treated as 'we don't support EDNS', so // explicitly set it. - resp.SetEdns0(maxUDPPayload, false) + opt := req.IsEdns0() + if opt != nil { + resp.SetEdns0(maxUDPPayload, false) + } return resp } From 4d0ae0d87bbbdb260671c59348113bfaf6242599 Mon Sep 17 00:00:00 2001 From: Maksim Kazantsev Date: Wed, 15 Jul 2026 09:32:42 +0000 Subject: [PATCH 3/6] Pull request 2707: AGDNS-4231-dont-allow-empty-hostnames-in-static-leases Squashed commit of the following: commit a5f75312023ce3f90f17a6833add37902e7d670a Merge: 05724001c 4da215221 Author: Maksim Kazantsev Date: Wed Jul 15 12:21:15 2026 +0300 Merge branch 'master' into AGDNS-4231-dont-allow-empty-hostnames-in-static-leases commit 05724001c53f7053134ab141e3ca2da0dad06dd9 Author: Maksim Kazantsev Date: Wed Jul 15 12:19:09 2026 +0300 dhcpd: fix duplicated test case; commit 92d557b4bb91afddd36aa7dc936d0f2d5bf1a349 Author: Maksim Kazantsev Date: Tue Jul 14 15:43:06 2026 +0300 all: upd chlog; commit e44ef6c28208191a86138535339d22771af5dd31 Merge: 40e755b57 a8a958a77 Author: Maksim Kazantsev Date: Tue Jul 14 15:40:51 2026 +0300 Merge branch 'master' into AGDNS-4231-dont-allow-empty-hostnames-in-static-leases commit 40e755b5720b1ce4e02a44883fe56471d45ef4d9 Author: Maksim Kazantsev Date: Tue Jul 14 15:37:50 2026 +0300 all: upd chlog; commit f81ef4ec5b2817900e980c46e7e9357137044f68 Author: Maksim Kazantsev Date: Tue Jul 14 13:17:43 2026 +0300 dhcpd: imp tests; imp code; commit c5b3f19b414ad8841a5572ec53bc10b4b124cb5d Author: Maksim Kazantsev Date: Tue Jul 14 12:55:34 2026 +0300 dhcpd: allow empty hostnames; add tests; commit 554615617fe24940ca589a8e8082da9b03b65642 Author: Maksim Kazantsev Date: Mon Jul 13 17:42:37 2026 +0300 dhcpd: don't allow empty hostnames in static leases; --- CHANGELOG.md | 4 ++ internal/dhcpd/http_unix_internal_test.go | 12 +++- internal/dhcpd/v4_unix.go | 36 +++++------- internal/dhcpd/v4_unix_internal_test.go | 71 ++++++++++++++++++++++- 4 files changed, 98 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0377da1700b..9c673067bb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ See also the [v0.107.79 GitHub milestone][ms-v0.107.79]. NOTE: Add new changes BELOW THIS COMMENT. --> +### Added + +- The user is able to remove the static lease's hostname via the HTTP API. + ### Fixed - Blocked requests without an EDNS(0) OPT record ([#8183]). diff --git a/internal/dhcpd/http_unix_internal_test.go b/internal/dhcpd/http_unix_internal_test.go index 059e40ac994..ed5fe2401da 100644 --- a/internal/dhcpd/http_unix_internal_test.go +++ b/internal/dhcpd/http_unix_internal_test.go @@ -209,6 +209,14 @@ func TestServer_HandleUpdateStaticLease(t *testing.T) { IP: leaseV4IP, Hostname: "updated-client-v4", }, + }, { + name: "update_v4_empty_hostname", + pos: leaseV4Pos, + lease: &leaseStatic{ + HWAddr: leaseV4MAC, + IP: leaseV4IP, + Hostname: "", + }, }, { name: "update_v4_ip", pos: leaseV4Pos, @@ -306,7 +314,7 @@ func TestServer_HandleUpdateStaticLease_validation(t *testing.T) { IP: anotherV4IP, Hostname: leaseV4Name, }, - want: "dhcpv4: updating static lease: ip address is not unique\n", + want: "dhcpv4: updating static lease: ip address: duplicated value\n", }, { name: "update_v4_same_name", lease: &leaseStatic{ @@ -314,7 +322,7 @@ func TestServer_HandleUpdateStaticLease_validation(t *testing.T) { IP: leaseV4IP, Hostname: anotherV4Name, }, - want: "dhcpv4: updating static lease: hostname is not unique\n", + want: "dhcpv4: updating static lease: hostname: duplicated value\n", }} for _, tc := range testCases { diff --git a/internal/dhcpd/v4_unix.go b/internal/dhcpd/v4_unix.go index 0350d7f3b51..e5814012e1a 100644 --- a/internal/dhcpd/v4_unix.go +++ b/internal/dhcpd/v4_unix.go @@ -313,16 +313,6 @@ func (s *v4Server) rmDynamicLease(lease *dhcpsvc.Lease) (err error) { return nil } -const ( - // ErrDupHostname is returned by addLease, validateStaticLease when the - // modified lease has a not empty non-unique hostname. - ErrDupHostname = errors.Error("hostname is not unique") - - // ErrDupIP is returned by addLease, validateStaticLease when the modified - // lease has a non-unique IP address. - ErrDupIP = errors.Error("ip address is not unique") -) - // addLease adds a dynamic or static lease. func (s *v4Server) addLease(l *dhcpsvc.Lease) (err error) { r := s.conf.ipRange @@ -342,7 +332,7 @@ func (s *v4Server) addLease(l *dhcpsvc.Lease) (err error) { // TODO(e.burkov): l must have a valid hostname here, investigate. if l.Hostname != "" { if _, ok := s.hostsIndex[l.Hostname]; ok { - return ErrDupHostname + return fmt.Errorf("hostname: %w", errors.ErrDuplicated) } s.hostsIndex[l.Hostname] = l @@ -485,23 +475,25 @@ func (s *v4Server) validateStaticLease(l *dhcpsvc.Lease) (err error) { return err } - err = netutil.ValidateHostname(hostname) - if err != nil { - return fmt.Errorf("validating hostname: %w", err) - } + if hostname != "" { + err = netutil.ValidateHostname(hostname) + if err != nil { + return fmt.Errorf("hostname: %w", err) + } - dup, ok := s.hostsIndex[hostname] - if ok && !bytes.Equal(dup.HWAddr, l.HWAddr) { - return ErrDupHostname + dup, ok := s.hostsIndex[hostname] + if ok && !bytes.Equal(dup.HWAddr, l.HWAddr) { + return fmt.Errorf("hostname: %w", errors.ErrDuplicated) + } } - dup, ok = s.ipIndex[l.IP] + l.Hostname = hostname + + dup, ok := s.ipIndex[l.IP] if ok && !bytes.Equal(dup.HWAddr, l.HWAddr) { - return ErrDupIP + return fmt.Errorf("ip address: %w", errors.ErrDuplicated) } - l.Hostname = hostname - if gwIP := s.conf.GatewayIP; gwIP == l.IP { return fmt.Errorf("can't assign the gateway IP %q to the lease", gwIP) } diff --git a/internal/dhcpd/v4_unix_internal_test.go b/internal/dhcpd/v4_unix_internal_test.go index ae80b5bdcb4..9d09687f2ba 100644 --- a/internal/dhcpd/v4_unix_internal_test.go +++ b/internal/dhcpd/v4_unix_internal_test.go @@ -12,6 +12,7 @@ import ( "github.com/AdguardTeam/AdGuardHome/internal/aghnet" "github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc" + "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/stringutil" "github.com/AdguardTeam/golibs/testutil" @@ -83,7 +84,7 @@ func TestV4Server_leasing(t *testing.T) { IP: anotherIP, IsStatic: true, }) - assert.ErrorIs(t, err, ErrDupHostname) + assert.ErrorIs(t, err, errors.ErrDuplicated) }) t.Run("same_mac", func(t *testing.T) { @@ -914,3 +915,71 @@ func TestV4Server_handleRelease(t *testing.T) { require.Equal(t, wantResp, resp) } + +func TestV4Server_validateStaticLease_emptyHostname(t *testing.T) { + t.Parallel() + + const ( + existingHostname = "existing-client" + ) + + existingIP := netip.MustParseAddr("192.168.10.150") + nonExistingIP := existingIP.Next() + existingMAC := net.HardwareAddr{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA} + otherMAC := net.HardwareAddr{0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB} + + s := defaultSrv(t) + + s4, ok := s.(*v4Server) + require.True(t, ok) + + existingLease := &dhcpsvc.Lease{ + Hostname: existingHostname, + HWAddr: existingMAC, + IP: existingIP, + IsStatic: true, + } + err := s4.addLease(existingLease) + require.NoError(t, err) + + testCases := []struct { + name string + wantErr string + lease *dhcpsvc.Lease + }{{ + name: "empty_hostname_allowed", + lease: &dhcpsvc.Lease{ + Hostname: "", + HWAddr: otherMAC, + IP: nonExistingIP, + IsStatic: true, + }, + }, { + name: "non_empty_hostname_duplicate_hostname", + wantErr: "hostname: duplicated value", + lease: &dhcpsvc.Lease{ + Hostname: existingHostname, + HWAddr: otherMAC, + IP: nonExistingIP, + IsStatic: true, + }, + }, { + name: "non_empty_hostname_duplicate_ip", + wantErr: "ip address: duplicated value", + lease: &dhcpsvc.Lease{ + Hostname: "new-client", + HWAddr: otherMAC, + IP: existingIP, + IsStatic: true, + }, + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Don't run subtests in parallel because they modify the server's + // leases. + err = s4.validateStaticLease(tc.lease) + testutil.AssertErrorMsg(t, tc.wantErr, err) + }) + } +} From 5b864cefc21f36083c752f2a73e16d813f315052 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 15 Jul 2026 10:34:17 +0000 Subject: [PATCH 4/6] Pull request 2713: AGDNS-4240-install-lang Squashed commit of the following: commit 1baf3ec81abb8f90cc2e9789945d1c10fcc23225 Merge: f8eaf24cb 4d0ae0d87 Author: Ainar Garipov Date: Wed Jul 15 13:18:02 2026 +0300 Merge branch 'master' into AGDNS-4240-install-lang commit f8eaf24cbe91bdf825b58be6b0b565310767c001 Author: Ainar Garipov Date: Wed Jul 15 13:17:16 2026 +0300 openapi: imp language codes commit f811b3f5c2206c0324808e89bcc060d661fa7b9e Author: Ainar Garipov Date: Tue Jul 14 18:56:28 2026 +0300 home: use validation more commit 7e8fd77aa873fb3d5045aca2a83120004058060a Author: Ainar Garipov Date: Tue Jul 14 18:49:38 2026 +0300 home: fix copying install properties commit 2178b01e9f17e2e76be0a1e400d1090bfea34198 Author: Ainar Garipov Date: Tue Jul 14 18:43:07 2026 +0300 home: rm unnecessary validation commit 407ef86aa9dc4520ad9791ca72302639ccf68dea Author: Ainar Garipov Date: Tue Jul 14 17:53:23 2026 +0300 home: add language to install api --- CHANGELOG.md | 4 +- internal/home/controlinstall.go | 36 ++++++++++++--- internal/home/i18n.go | 20 ++++++++- internal/home/profilehttp.go | 5 ++- openapi/CHANGELOG.md | 8 +++- openapi/openapi.yaml | 77 ++++++++++++++++++++++++++------- 6 files changed, 121 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c673067bb3..ee65452bc7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,13 +20,15 @@ NOTE: Add new changes BELOW THIS COMMENT. ### Added +- New property `"language"` in `POST /control/install/check_config` and `POST /control/install/configure` HTTP APIs. + - The user is able to remove the static lease's hostname via the HTTP API. ### Fixed - Blocked requests without an EDNS(0) OPT record ([#8183]). -[#8183]: https://github.com/AdguardTeam/AdGuardHome/issues/8183 +[#8183]: https://github.com/AdguardTeam/AdGuardHome/issues/8183 -## v0.107.78: API changes +## v0.107.79: API changes + +### Setting the UI language through the install API -### New `interval` values in `GET /control/filtering/status` and `POST /control/filtering/config` APIs +- New property `"language"` in `POST /control/install/check_config` and `POST /control/install/configure` HTTP APIs defines the language to use once AdGuard Home is installed. + +## v0.107.78: API changes The property `interval` of the objects returned from and accepted by the aforementioned APIs can now be any integer between 0 and 8760 (365 days). diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index c214be1cdd9..c190efbd099 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -1,4 +1,4 @@ -'openapi': '3.0.3' +'openapi': '3.2.0' 'info': 'title': 'AdGuard Home' 'description': > @@ -1543,8 +1543,7 @@ 'type': 'string' 'example': 'v0.123.4' 'language': - 'type': 'string' - 'example': 'en' + '$ref': '#/components/schemas/Lang' 'start_time': 'type': 'number' 'format': 'double' @@ -2685,7 +2684,7 @@ 'name': 'type': 'string' 'language': - 'type': 'string' + '$ref': '#/components/schemas/Lang' 'theme': 'type': 'string' 'description': 'Interface theme' @@ -3159,11 +3158,13 @@ 'properties': 'dns': '$ref': '#/components/schemas/CheckConfigRequestInfo' - 'web': - '$ref': '#/components/schemas/CheckConfigRequestInfo' + 'language': + '$ref': '#/components/schemas/Lang' 'set_static_ip': 'type': 'boolean' 'example': false + 'web': + '$ref': '#/components/schemas/CheckConfigRequestInfo' 'CheckConfigRequestInfo': 'type': 'object' 'properties': @@ -3181,15 +3182,18 @@ 'type': 'object' 'required': - 'dns' - - 'web' + - 'language' - 'static_ip' + - 'web' 'properties': 'dns': '$ref': '#/components/schemas/CheckConfigResponseInfo' - 'web': + 'language': '$ref': '#/components/schemas/CheckConfigResponseInfo' 'static_ip': '$ref': '#/components/schemas/CheckConfigStaticIpInfo' + 'web': + '$ref': '#/components/schemas/CheckConfigResponseInfo' 'CheckConfigResponseInfo': 'type': 'object' 'required': @@ -3231,21 +3235,23 @@ 'required': - 'dns' - 'web' - - 'username' - 'password' + - 'username' 'properties': 'dns': '$ref': '#/components/schemas/AddressInfo' 'web': '$ref': '#/components/schemas/AddressInfo' - 'username': + 'language': + '$ref': '#/components/schemas/Lang' + 'password': + 'description': 'Basic auth password' + 'example': 'password' 'type': 'string' + 'username': 'description': 'Basic auth username' 'example': 'admin' - 'password': 'type': 'string' - 'description': 'Basic auth password' - 'example': 'password' 'Login': 'type': 'object' 'description': 'Login request data' @@ -3267,11 +3273,52 @@ 'description': 'Language settings object.' 'properties': 'language': - 'description': 'The current language or the language to set.' - 'type': 'string' + '$ref': '#/components/schemas/Lang' 'required': - 'language' 'type': 'object' + 'Lang': + 'description': > + Language code. + # Hold the enum in sync with .twosky.json. + 'enum': + - 'ar' + - 'be' + - 'bg' + - 'cs' + - 'da' + - 'de' + - 'en' + - 'es' + - 'fa' + - 'fi' + - 'fr' + - 'hr' + - 'hu' + - 'id' + - 'it' + - 'ja' + - 'ko' + - 'nl' + - 'no' + - 'pl' + - 'pt-br' + - 'pt-pt' + - 'ro' + - 'ru' + - 'si-lk' + - 'sk' + - 'sl' + - 'sr-cs' + - 'sv' + - 'th' + - 'tr' + - 'uk' + - 'vi' + - 'zh-cn' + - 'zh-hk' + - 'zh-tw' + 'type': 'string' 'securitySchemes': 'basicAuth': 'type': 'http' From 09ae3ccddbba57d11c351cbae4946274c7389d87 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 15 Jul 2026 10:43:57 +0000 Subject: [PATCH 5/6] Pull request 2715: AGDNS-3549-new-ui-edge Squashed commit of the following: commit fab8b1067d134146b9980741ba2b181174dd353c Author: Ainar Garipov Date: Wed Jul 15 13:37:23 2026 +0300 all: upd chlog commit 3f9d510699d5434dd3466d1df76066784922bb90 Merge: 4079ad35b 5b864cefc Author: Ainar Garipov Date: Wed Jul 15 13:34:58 2026 +0300 Merge branch 'master' into AGDNS-3549-new-ui-edge commit 4079ad35b1839feda3187d54ac2393b9b536ad34 Author: Ainar Garipov Date: Wed Jul 15 13:23:40 2026 +0300 bamboo-specs: return to dev commit 49f74ae115c12c80d8b5a368e35b315328d6b8bf Author: Ainar Garipov Date: Wed Jul 15 12:54:59 2026 +0300 all: use new ui on the edge channel --- CHANGELOG.md | 4 ++++ Makefile | 3 +-- bamboo-specs/release.yaml | 2 +- bamboo-specs/test.yaml | 2 +- scripts/make/version.sh | 13 +++++++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee65452bc7a..0ce0805ee21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,10 @@ NOTE: Add new changes BELOW THIS COMMENT. - The user is able to remove the static lease's hostname via the HTTP API. +### Changed + +- The `edge` channel has been switched to the new UI and versioning scheme. + ### Fixed - Blocked requests without an EDNS(0) OPT record ([#8183]). diff --git a/Makefile b/Makefile index 935932ecf14..e947fcefa0a 100644 --- a/Makefile +++ b/Makefile @@ -19,8 +19,7 @@ GO.MACRO = $${GO:-go} VERBOSE.MACRO = $${VERBOSE:-0} CHANNEL = development -# TODO(ik): Update CLIENT_DIR to client_v2 for new frontend migration -CLIENT_DIR = client +CLIENT_DIR = client_v2 DEPLOY_SCRIPT_PATH = not/a/real/path DIST_DIR = dist GOAMD64 = v1 diff --git a/bamboo-specs/release.yaml b/bamboo-specs/release.yaml index d7e6ca3ab20..cbb3fc9f5fc 100644 --- a/bamboo-specs/release.yaml +++ b/bamboo-specs/release.yaml @@ -10,7 +10,7 @@ # flaky test suite. 'cacheBuster': '0' 'channel': 'edge' - 'clientDir': 'client' + 'clientDir': 'client_v2' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' diff --git a/bamboo-specs/test.yaml b/bamboo-specs/test.yaml index db9e8cd3d72..f78992e0a15 100644 --- a/bamboo-specs/test.yaml +++ b/bamboo-specs/test.yaml @@ -9,7 +9,7 @@ # flaky test suite. 'cacheBuster': '0' 'channel': 'development' - 'clientDir': 'client' + 'clientDir': 'client_v2' 'dockerFrontend': 'adguard/home-js-builder:4.0' 'dockerGo': 'adguard/go-builder:1.26.5--1' diff --git a/scripts/make/version.sh b/scripts/make/version.sh index 46382740fd6..32e38170d17 100644 --- a/scripts/make/version.sh +++ b/scripts/make/version.sh @@ -85,6 +85,19 @@ case "$channel" in version="v0.0.0-dev.${commit_number}+$(git rev-parse --short HEAD)" ;; 'edge') + # TODO(a.garipov): Remove this and use edge_todo below instead once v1.0.0 + # is out. + + # Temporarily, use the last v0.108.0 beta as the starting point for the + # v1.0.0 alpha (edge, nightly) releases. + num_commits="$(git rev-list --count "v0.108.0-b.89..HEAD")" + readonly num_commits + + version="v1.0.0-a.${num_commits}+$(git rev-parse --short HEAD)" + ;; +'edge_todo') + # TODO(a.garipov): Use this again once v1.0.0 is out. + # last_minor_zero is the last new minor release. last_minor_zero="$(get_last_minor_zero)" readonly last_minor_zero From d9a7219d4d0da23c1f1ed0cec785a87c23556380 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 15 Jul 2026 11:14:54 +0000 Subject: [PATCH 6/6] Pull request 2716: AGDNS-3549-fix-github Squashed commit of the following: commit 91560d825973aa384806c8bf28487213e1a9feb7 Author: Ainar Garipov Date: Wed Jul 15 13:47:44 2026 +0300 .github: fix windows build --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e64c854620f..e4399ad40d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,3 +1,5 @@ +# TODO(a.garipov): Use client_v2 for the frontend tests once Windows build is +# fixed. 'name': 'build' # Permissions are disabled for all the jobs by default, and then overridden for # specific jobs if needed. This is a recommended practice for security reasons, @@ -64,7 +66,7 @@ 'restore-keys': '${{ runner.os }}-node-' - 'name': 'Run tests' 'shell': 'bash' - 'run': 'make VERBOSE=1 deps test go-bench go-fuzz' + 'run': 'make CLIENT_DIR=client VERBOSE=1 deps test go-bench go-fuzz' - 'name': 'Upload coverage' 'uses': 'codecov/codecov-action@v1' 'if': "success() && matrix.os == 'ubuntu-latest'"