mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-17 13:11:42 +03:00
06d465b0d1
Merge in DNS/adguard-home from AG-22594-imp-whois to master Squashed commit of the following: commit 093feed53291d02469fb1bd8d99472597ebd5015 Merge: 956d20dc4ca313521d
Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Wed Jun 21 12:42:40 2023 +0300 Merge branch 'master' into AG-22594-imp-whois commit 956d20dc473dcec90895b6f618fc56e96e9ff833 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 20 18:30:48 2023 +0300 whois: imp code more commit c771fd9c5e4d90e76d079a0d25ab097ab5652a42 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 20 15:05:45 2023 +0300 whois: imp code commit 21900fd468e10d9aee22149a6312b8596ff39810 Merge: 8dbe132c0371261b2c
Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 20 11:34:06 2023 +0300 Merge branch 'master' into AG-22594-imp-whois commit 8dbe132c08d3ad4a63b0d4bdb9d00a5bc25971f4 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 20 11:33:26 2023 +0300 whois: imp code more commit f5e761a260237579c67cbd48f01ea90499bff6b0 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Mon Jun 19 16:04:35 2023 +0300 whois: imp code commit 2780f7e16aacddad8736f83b77ef9bfa1271f8b1 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 16 17:33:47 2023 +0300 all: imp code commit 1fc67016068b745a46b3d0d341ab14f9f5bdc9aa Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 16 17:29:19 2023 +0300 whois: imp tests commit 204761870764fb10feea20065d79dee8c321e70b Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 16 11:55:37 2023 +0300 all: upd deps commit ded4f59498c5c544277b9c8e249567626547680e Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Wed Jun 14 20:43:32 2023 +0300 all: imp tests commit 0eed9834ff9dd94d0788ce69d0bb0521fa725410 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Wed Jun 14 19:31:49 2023 +0300 all: imp code commit 9f867587c8ad87363b8c8b061ead536c1ec59c5d Merge: 504e9484d681c604c2
Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 13 14:20:44 2023 +0300 Merge branch 'master' into AG-22594-imp-whois commit 504e9484dd84ab9d7c84a3f8399993d6422d3b67 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Tue Jun 13 14:18:06 2023 +0300 all: imp cache commit c492abe41ace7ad76fcd4e297c22b910a90fec30 Merge: db36adb9c826b314f1
Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 9 16:06:12 2023 +0300 Merge branch 'master' into AG-22594-imp-whois commit db36adb9c14ce92b3971db0d87ec313d5bcd787e Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 9 15:53:33 2023 +0300 all: add todo commit 5cf192de9f93cd0d8521a3a6b4ded7f2bc5e0031 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Thu Jun 8 14:59:26 2023 +0300 all: imp docs commit 021aa3eb5b9476a93b4af5fc90cc9ccf014ca152 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Mon Jun 5 18:35:25 2023 +0300 all: imp naming commit 4626c3a7fa3f2543501806c9fa1a19531547f394 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 2 17:41:00 2023 +0300 all: imp tests commit 1afcc9605ca176e4c7f76a03a2c996cf7d6bde13 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Fri Jun 2 12:44:32 2023 +0300 all: imp docs commit cdd0544ff1a63faed5ced3dae6bfb3b783e45428 Author: Stanislav Chzhen <s.chzhen@adguard.com> Date: Thu Jun 1 17:21:37 2023 +0300 all: add docs ... and 2 more commits
141 lines
3.5 KiB
Go
141 lines
3.5 KiB
Go
package home
|
|
|
|
import (
|
|
"encoding"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/AdguardTeam/AdGuardHome/internal/filtering"
|
|
"github.com/AdguardTeam/AdGuardHome/internal/filtering/safesearch"
|
|
"github.com/AdguardTeam/AdGuardHome/internal/whois"
|
|
"github.com/AdguardTeam/dnsproxy/proxy"
|
|
"github.com/AdguardTeam/golibs/stringutil"
|
|
)
|
|
|
|
// Client contains information about persistent clients.
|
|
type Client struct {
|
|
// upstreamConfig is the custom upstream config for this client. If
|
|
// it's nil, it has not been initialized yet. If it's non-nil and
|
|
// empty, there are no valid upstreams. If it's non-nil and non-empty,
|
|
// these upstream must be used.
|
|
upstreamConfig *proxy.UpstreamConfig
|
|
|
|
safeSearchConf filtering.SafeSearchConfig
|
|
SafeSearch filtering.SafeSearch
|
|
|
|
Name string
|
|
|
|
IDs []string
|
|
Tags []string
|
|
BlockedServices []string
|
|
Upstreams []string
|
|
|
|
UseOwnSettings bool
|
|
FilteringEnabled bool
|
|
SafeBrowsingEnabled bool
|
|
ParentalEnabled bool
|
|
UseOwnBlockedServices bool
|
|
IgnoreQueryLog bool
|
|
IgnoreStatistics bool
|
|
}
|
|
|
|
// ShallowClone returns a deep copy of the client, except upstreamConfig,
|
|
// safeSearchConf, SafeSearch fields, because it's difficult to copy them.
|
|
func (c *Client) ShallowClone() (sh *Client) {
|
|
clone := *c
|
|
|
|
clone.IDs = stringutil.CloneSlice(c.IDs)
|
|
clone.Tags = stringutil.CloneSlice(c.Tags)
|
|
clone.BlockedServices = stringutil.CloneSlice(c.BlockedServices)
|
|
clone.Upstreams = stringutil.CloneSlice(c.Upstreams)
|
|
|
|
return &clone
|
|
}
|
|
|
|
// closeUpstreams closes the client-specific upstream config of c if any.
|
|
func (c *Client) closeUpstreams() (err error) {
|
|
if c.upstreamConfig != nil {
|
|
err = c.upstreamConfig.Close()
|
|
if err != nil {
|
|
return fmt.Errorf("closing upstreams of client %q: %w", c.Name, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setSafeSearch initializes and sets the safe search filter for this client.
|
|
func (c *Client) setSafeSearch(
|
|
conf filtering.SafeSearchConfig,
|
|
cacheSize uint,
|
|
cacheTTL time.Duration,
|
|
) (err error) {
|
|
ss, err := safesearch.NewDefault(conf, fmt.Sprintf("client %q", c.Name), cacheSize, cacheTTL)
|
|
if err != nil {
|
|
// Don't wrap the error, because it's informative enough as is.
|
|
return err
|
|
}
|
|
|
|
c.SafeSearch = ss
|
|
|
|
return nil
|
|
}
|
|
|
|
// clientSource represents the source from which the information about the
|
|
// client has been obtained.
|
|
type clientSource uint
|
|
|
|
// Clients information sources. The order determines the priority.
|
|
const (
|
|
ClientSourceNone clientSource = iota
|
|
ClientSourceWHOIS
|
|
ClientSourceARP
|
|
ClientSourceRDNS
|
|
ClientSourceDHCP
|
|
ClientSourceHostsFile
|
|
ClientSourcePersistent
|
|
)
|
|
|
|
// type check
|
|
var _ fmt.Stringer = clientSource(0)
|
|
|
|
// String returns a human-readable name of cs.
|
|
func (cs clientSource) String() (s string) {
|
|
switch cs {
|
|
case ClientSourceWHOIS:
|
|
return "WHOIS"
|
|
case ClientSourceARP:
|
|
return "ARP"
|
|
case ClientSourceRDNS:
|
|
return "rDNS"
|
|
case ClientSourceDHCP:
|
|
return "DHCP"
|
|
case ClientSourceHostsFile:
|
|
return "etc/hosts"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// type check
|
|
var _ encoding.TextMarshaler = clientSource(0)
|
|
|
|
// MarshalText implements encoding.TextMarshaler for the clientSource.
|
|
func (cs clientSource) MarshalText() (text []byte, err error) {
|
|
return []byte(cs.String()), nil
|
|
}
|
|
|
|
// RuntimeClient is a client information about which has been obtained using the
|
|
// source described in the Source field.
|
|
type RuntimeClient struct {
|
|
// WHOIS is the filtered WHOIS data of a client.
|
|
WHOIS *whois.Info
|
|
|
|
// Host is the host name of a client.
|
|
Host string
|
|
|
|
// Source is the source from which the information about the client has
|
|
// been obtained.
|
|
Source clientSource
|
|
}
|