diff --git a/CHANGELOG.md b/CHANGELOG.md index ef5b3138..aa21c781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,8 +32,16 @@ NOTE: Add new changes BELOW THIS COMMENT. - Private rDNS resolution now also affects `SOA` and `NS` requests ([#6882]). - Rewrite rules mechanics was changed due to improve resolving in safe search. +### Deprecated + +- Currently, AdGuard Home skips persistent clients that have duplicate fields + when reading them from the configuration file. This behaviour is deprecated + and will cause errors on startup in a future release. + ### Fixed +- Acceptance of duplicate UIDs for persistent clients at startup. See also the + section on client settings on the [Wiki page][wiki-config]. - Domain specifications for top-level domains not considered for requests to unqualified domains ([#6744]). - Support for link-local subnets, i.e. `fe80::/16`, as client identifiers diff --git a/internal/client/index.go b/internal/client/index.go index 24ec6e30..18f826de 100644 --- a/internal/client/index.go +++ b/internal/client/index.go @@ -6,6 +6,7 @@ import ( "net/netip" "github.com/AdguardTeam/AdGuardHome/internal/aghalg" + "github.com/AdguardTeam/golibs/errors" ) // macKey contains MAC as byte array of 6, 8, or 20 bytes. @@ -82,15 +83,25 @@ func (ci *Index) Add(c *Persistent) { ci.uidToClient[c.UID] = c } +// ErrDuplicateUID is an error returned by [Index.Clashes] when adding a +// persistent client with a UID that already exists in an index. +const ErrDuplicateUID errors.Error = "duplicate uid" + // Clashes returns an error if the index contains a different persistent client // with at least a single identifier contained by c. c must be non-nil. func (ci *Index) Clashes(c *Persistent) (err error) { + _, ok := ci.uidToClient[c.UID] + if ok { + return ErrDuplicateUID + } + for _, id := range c.ClientIDs { - existing, ok := ci.clientIDToUID[id] + var existing UID + existing, ok = ci.clientIDToUID[id] if ok && existing != c.UID { p := ci.uidToClient[existing] - return fmt.Errorf("another client %q uses the same ID %q", p.Name, id) + return fmt.Errorf("another client %q uses the same ClientID %q", p.Name, id) } } diff --git a/internal/home/clients.go b/internal/home/clients.go index 7a2487ca..9cc210ab 100644 --- a/internal/home/clients.go +++ b/internal/home/clients.go @@ -286,7 +286,13 @@ func (clients *clientsContainer) addFromConfig( _, err = clients.add(cli) if err != nil { - log.Error("clients: adding client at index %d %s: %s", i, cli.Name, err) + if errors.Is(err, client.ErrDuplicateUID) { + return fmt.Errorf("clients: adding client %s at index %d: %w", cli.Name, i, err) + } + + // TODO(s.chzhen): Return an error instead of logging if more + // stringent requirements are implemented. + log.Error("clients: adding client %s at index %d: %s", cli.Name, i, err) } }