mirror of
https://github.com/AdguardTeam/AdGuardDNS.git
synced 2025-02-20 11:23:36 +08:00
107 lines
3.2 KiB
Go
107 lines
3.2 KiB
Go
package agd
|
|
|
|
import (
|
|
"context"
|
|
"net/netip"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// DeviceFinder finds the user data, such as the profile and a device for a
|
|
// request.
|
|
//
|
|
// TODO(a.garipov): Move device-related stuff to agddevice.
|
|
type DeviceFinder interface {
|
|
// Find returns the profile and device data in ri if it can recognize those.
|
|
// All arguments must not be empty. A nil result means that the profile and
|
|
// device data could not be found.
|
|
Find(ctx context.Context, req *dns.Msg, raddr, laddr netip.AddrPort) (r DeviceResult)
|
|
}
|
|
|
|
// EmptyDeviceFinder is an [DeviceFinder] implementation that does nothing.
|
|
type EmptyDeviceFinder struct{}
|
|
|
|
// type check
|
|
var _ DeviceFinder = EmptyDeviceFinder{}
|
|
|
|
// Find implements the [DeviceFinder] interface for EmptyDeviceFinder. It does
|
|
// nothing and returns nil.
|
|
func (EmptyDeviceFinder) Find(_ context.Context, _ *dns.Msg, _, _ netip.AddrPort) (r DeviceResult) {
|
|
return nil
|
|
}
|
|
|
|
// DeviceResult is the sum type of the results that can be returned by a
|
|
// [DeviceFinder] implementation.
|
|
//
|
|
// The implementations are:
|
|
//
|
|
// - [*DeviceResultAuthenticationFailure]
|
|
// - [*DeviceResultError]
|
|
// - [*DeviceResultOK]
|
|
// - [*DeviceResultUnknownDedicated]
|
|
//
|
|
// A nil result means that the user data was not found.
|
|
type DeviceResult interface {
|
|
isResult()
|
|
}
|
|
|
|
// DeviceResultAuthenticationFailure means that the profile and the device have
|
|
// been found, but the device should have been authenticated but could not. For
|
|
// generic errors, see [DeviceResultError].
|
|
type DeviceResultAuthenticationFailure struct {
|
|
Err error
|
|
}
|
|
|
|
// type check
|
|
var _ DeviceResult = (*DeviceResultAuthenticationFailure)(nil)
|
|
|
|
// isResult implements the [DeviceResult] interface for
|
|
// *DeviceResultAuthenticationFailure.
|
|
func (*DeviceResultAuthenticationFailure) isResult() {}
|
|
|
|
// DeviceResultError is a generic error result. For authentication errors, see
|
|
// [DeviceResultAuthenticationFailure].
|
|
type DeviceResultError struct {
|
|
Err error
|
|
}
|
|
|
|
// type check
|
|
var _ DeviceResult = (*DeviceResultError)(nil)
|
|
|
|
// isResult implements the [DeviceResult] interface for *DeviceResultError.
|
|
func (*DeviceResultError) isResult() {}
|
|
|
|
// DeviceResultOK is a successful result that contains the profile and the
|
|
// device data. If the device requires authentication, DeviceResultOK implies
|
|
// that the authentication has been successful. See also
|
|
// [DeviceResultAuthenticationFailure].
|
|
type DeviceResultOK struct {
|
|
// Device is the device that has been found. It must not be nil and it must
|
|
// belong to the profile.
|
|
Device *Device
|
|
|
|
// Profile is the profile that has been found. It must not be nil or
|
|
// deleted, and the device must belong to it.
|
|
Profile *Profile
|
|
}
|
|
|
|
// type check
|
|
var _ DeviceResult = (*DeviceResultOK)(nil)
|
|
|
|
// isResult implements the [DeviceResult] interface for *DeviceResultOK.
|
|
func (*DeviceResultOK) isResult() {}
|
|
|
|
// DeviceResultUnknownDedicated means that the request has been made for a
|
|
// dedicated IP address with no corresponding profile or device data. For
|
|
// generic errors, see [DeviceResultError].
|
|
type DeviceResultUnknownDedicated struct {
|
|
Err error
|
|
}
|
|
|
|
// type check
|
|
var _ DeviceResult = (*DeviceResultUnknownDedicated)(nil)
|
|
|
|
// isResult implements the [DeviceResult] interface for
|
|
// *DeviceResultUnknownDedicated.
|
|
func (*DeviceResultUnknownDedicated) isResult() {}
|