nextdns

package
v0.16.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 8, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func HasErrorCode added in v0.3.0

func HasErrorCode(err error, code string) bool

HasErrorCode returns true if the error contains the specified error code.

func IsAuthError added in v0.3.0

func IsAuthError(err error) bool

IsAuthError returns true if the error indicates an authentication failure.

func IsDuplicateError added in v0.3.0

func IsDuplicateError(err error) bool

IsDuplicateError returns true if the error indicates a duplicate resource.

func IsNotFoundError added in v0.3.0

func IsNotFoundError(err error) bool

IsNotFoundError returns true if the error indicates a resource was not found.

func WrapError added in v0.3.0

func WrapError(message string, err error) error

WrapError wraps an error with additional context. Returns nil if the original error is nil.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client wraps the NextDNS API client

func NewClient

func NewClient(apiKey string) (*Client, error)

NewClient creates a new NextDNS API client

func (*Client) AddAllowlistEntry added in v0.3.0

func (c *Client) AddAllowlistEntry(ctx context.Context, profileID string, domain string, active bool) error

AddAllowlistEntry adds a single entry to the allowlist.

func (*Client) AddDenylistEntry added in v0.3.0

func (c *Client) AddDenylistEntry(ctx context.Context, profileID string, domain string, active bool) error

AddDenylistEntry adds a single entry to the denylist.

func (*Client) AddPrivacyNative added in v0.3.0

func (c *Client) AddPrivacyNative(ctx context.Context, profileID string, nativeID string) error

AddPrivacyNative adds a single native tracker protection.

func (*Client) AddSecurityTLD added in v0.3.0

func (c *Client) AddSecurityTLD(ctx context.Context, profileID string, tld string) error

AddSecurityTLD adds a single TLD to the blocked list.

func (*Client) CreateProfile

func (c *Client) CreateProfile(ctx context.Context, name string) (string, error)

CreateProfile creates a new NextDNS profile and returns the profile ID

func (*Client) DeleteAllowlistEntry added in v0.3.0

func (c *Client) DeleteAllowlistEntry(ctx context.Context, profileID string, domain string) error

DeleteAllowlistEntry removes a single entry from the allowlist.

func (*Client) DeleteDenylistEntry added in v0.3.0

func (c *Client) DeleteDenylistEntry(ctx context.Context, profileID string, domain string) error

DeleteDenylistEntry removes a single entry from the denylist.

func (*Client) DeletePrivacyNative added in v0.3.0

func (c *Client) DeletePrivacyNative(ctx context.Context, profileID string, nativeID string) error

DeletePrivacyNative removes a single native tracker protection.

func (*Client) DeleteProfile

func (c *Client) DeleteProfile(ctx context.Context, profileID string) error

DeleteProfile deletes a NextDNS profile

func (*Client) DeleteSecurityTLD added in v0.3.0

func (c *Client) DeleteSecurityTLD(ctx context.Context, profileID string, tld string) error

DeleteSecurityTLD removes a single TLD from the blocked list.

func (*Client) GetAllowlist

func (c *Client) GetAllowlist(ctx context.Context, profileID string) ([]*nextdns.Allowlist, error)

GetAllowlist retrieves the current allowlist for a profile

func (*Client) GetDenylist

func (c *Client) GetDenylist(ctx context.Context, profileID string) ([]*nextdns.Denylist, error)

GetDenylist retrieves the current denylist for a profile

func (*Client) GetParentalControl

func (c *Client) GetParentalControl(ctx context.Context, profileID string) (*nextdns.ParentalControl, error)

GetParentalControl retrieves the current parental control settings for a profile

func (*Client) GetParentalControlCategories added in v0.9.0

func (c *Client) GetParentalControlCategories(ctx context.Context, profileID string) ([]*nextdns.ParentalControlCategories, error)

GetParentalControlCategories retrieves the current parental control categories for a profile

func (*Client) GetParentalControlServices added in v0.9.0

func (c *Client) GetParentalControlServices(ctx context.Context, profileID string) ([]*nextdns.ParentalControlServices, error)

GetParentalControlServices retrieves the current parental control services for a profile

func (*Client) GetPrivacy

func (c *Client) GetPrivacy(ctx context.Context, profileID string) (*nextdns.Privacy, error)

GetPrivacy retrieves the current privacy settings for a profile

func (*Client) GetPrivacyBlocklists added in v0.9.0

func (c *Client) GetPrivacyBlocklists(ctx context.Context, profileID string) ([]*nextdns.PrivacyBlocklists, error)

GetPrivacyBlocklists retrieves the current privacy blocklists for a profile

func (*Client) GetPrivacyNatives added in v0.9.0

func (c *Client) GetPrivacyNatives(ctx context.Context, profileID string) ([]*nextdns.PrivacyNatives, error)

GetPrivacyNatives retrieves the current privacy natives for a profile

func (*Client) GetProfile

func (c *Client) GetProfile(ctx context.Context, profileID string) (*nextdns.Profile, error)

GetProfile retrieves a NextDNS profile by ID

func (*Client) GetRewrites added in v0.8.1

func (c *Client) GetRewrites(ctx context.Context, profileID string) ([]*nextdns.Rewrites, error)

GetRewrites retrieves the current rewrites for a profile

func (*Client) GetSecurity

func (c *Client) GetSecurity(ctx context.Context, profileID string) (*nextdns.Security, error)

GetSecurity retrieves the current security settings for a profile

func (*Client) GetSecurityTLDs

func (c *Client) GetSecurityTLDs(ctx context.Context, profileID string) ([]*nextdns.SecurityTlds, error)

GetSecurityTLDs retrieves the current blocked TLDs for a profile

func (*Client) GetSettings added in v0.9.0

func (c *Client) GetSettings(ctx context.Context, profileID string) (*nextdns.Settings, error)

GetSettings retrieves the current settings for a profile

func (*Client) GetSetup added in v0.12.0

func (c *Client) GetSetup(ctx context.Context, profileID string) (*nextdns.Setup, error)

GetSetup retrieves the current setup/endpoint data for a profile

func (*Client) SyncAllowlist

func (c *Client) SyncAllowlist(ctx context.Context, profileID string, entries []DomainEntry) error

SyncAllowlist synchronizes the allowlist for a profile

func (*Client) SyncDenylist

func (c *Client) SyncDenylist(ctx context.Context, profileID string, entries []DomainEntry) error

SyncDenylist synchronizes the denylist for a profile

func (*Client) SyncPrivacyBlocklists

func (c *Client) SyncPrivacyBlocklists(ctx context.Context, profileID string, blocklists []string) error

SyncPrivacyBlocklists synchronizes privacy blocklists for a profile

func (*Client) SyncPrivacyNatives

func (c *Client) SyncPrivacyNatives(ctx context.Context, profileID string, natives []string) error

SyncPrivacyNatives synchronizes native tracker blocking for a profile

func (*Client) SyncRewrites added in v0.8.1

func (c *Client) SyncRewrites(ctx context.Context, profileID string, entries []RewriteEntry) error

SyncRewrites synchronizes DNS rewrites for a profile using diff-based create/delete. The NextDNS API does not support update for rewrites, so we delete removed entries and create new ones.

func (*Client) SyncSecurityTLDs

func (c *Client) SyncSecurityTLDs(ctx context.Context, profileID string, tlds []string) error

SyncSecurityTLDs synchronizes blocked TLDs for a profile

func (*Client) UpdateParentalControl

func (c *Client) UpdateParentalControl(ctx context.Context, profileID string, config *ParentalControlConfig) error

UpdateParentalControl updates parental control settings for a profile

func (*Client) UpdatePrivacy

func (c *Client) UpdatePrivacy(ctx context.Context, profileID string, config *PrivacyConfig) error

UpdatePrivacy updates privacy settings for a profile

func (*Client) UpdateProfile

func (c *Client) UpdateProfile(ctx context.Context, profileID, name string) error

UpdateProfile updates a NextDNS profile name

func (*Client) UpdateSecurity

func (c *Client) UpdateSecurity(ctx context.Context, profileID string, config *SecurityConfig) error

UpdateSecurity updates security settings for a profile

func (*Client) UpdateSettings

func (c *Client) UpdateSettings(ctx context.Context, profileID string, config *SettingsConfig) error

UpdateSettings updates general settings for a profile

type ClientInterface

type ClientInterface interface {
	// Profile operations
	CreateProfile(ctx context.Context, name string) (string, error)
	GetProfile(ctx context.Context, profileID string) (*nextdns.Profile, error)
	UpdateProfile(ctx context.Context, profileID, name string) error
	DeleteProfile(ctx context.Context, profileID string) error

	// Security operations
	UpdateSecurity(ctx context.Context, profileID string, config *SecurityConfig) error
	GetSecurity(ctx context.Context, profileID string) (*nextdns.Security, error)

	// Privacy operations
	UpdatePrivacy(ctx context.Context, profileID string, config *PrivacyConfig) error
	GetPrivacy(ctx context.Context, profileID string) (*nextdns.Privacy, error)
	SyncPrivacyBlocklists(ctx context.Context, profileID string, blocklists []string) error
	SyncPrivacyNatives(ctx context.Context, profileID string, natives []string) error

	// Parental control operations
	UpdateParentalControl(ctx context.Context, profileID string, config *ParentalControlConfig) error
	GetParentalControl(ctx context.Context, profileID string) (*nextdns.ParentalControl, error)

	// List operations
	SyncDenylist(ctx context.Context, profileID string, entries []DomainEntry) error
	SyncAllowlist(ctx context.Context, profileID string, entries []DomainEntry) error
	SyncSecurityTLDs(ctx context.Context, profileID string, tlds []string) error
	GetDenylist(ctx context.Context, profileID string) ([]*nextdns.Denylist, error)
	GetAllowlist(ctx context.Context, profileID string) ([]*nextdns.Allowlist, error)
	GetSecurityTLDs(ctx context.Context, profileID string) ([]*nextdns.SecurityTlds, error)

	// Individual list entry operations (for optimized sync)
	AddAllowlistEntry(ctx context.Context, profileID string, domain string, active bool) error
	DeleteAllowlistEntry(ctx context.Context, profileID string, domain string) error
	AddDenylistEntry(ctx context.Context, profileID string, domain string, active bool) error
	DeleteDenylistEntry(ctx context.Context, profileID string, domain string) error

	// Individual TLD operations
	AddSecurityTLD(ctx context.Context, profileID string, tld string) error
	DeleteSecurityTLD(ctx context.Context, profileID string, tld string) error

	// Individual privacy native operations
	AddPrivacyNative(ctx context.Context, profileID string, nativeID string) error
	DeletePrivacyNative(ctx context.Context, profileID string, nativeID string) error

	// Rewrite operations
	SyncRewrites(ctx context.Context, profileID string, entries []RewriteEntry) error
	GetRewrites(ctx context.Context, profileID string) ([]*nextdns.Rewrites, error)

	// Settings operations
	UpdateSettings(ctx context.Context, profileID string, config *SettingsConfig) error

	// Setup operations
	GetSetup(ctx context.Context, profileID string) (*nextdns.Setup, error)

	// Read-only operations for observe mode
	GetSettings(ctx context.Context, profileID string) (*nextdns.Settings, error)
	GetPrivacyBlocklists(ctx context.Context, profileID string) ([]*nextdns.PrivacyBlocklists, error)
	GetPrivacyNatives(ctx context.Context, profileID string) ([]*nextdns.PrivacyNatives, error)
	GetParentalControlCategories(ctx context.Context, profileID string) ([]*nextdns.ParentalControlCategories, error)
	GetParentalControlServices(ctx context.Context, profileID string) ([]*nextdns.ParentalControlServices, error)
}

ClientInterface defines the interface for NextDNS operations This allows for mocking in tests

type DomainEntry added in v0.1.2

type DomainEntry struct {
	Domain string
	Active bool
}

DomainEntry represents a domain with its active state for syncing to NextDNS

type MockCall

type MockCall struct {
	Method string
	Args   []interface{}
}

MockCall records a method call for verification

type MockClient

type MockClient struct {

	// Profiles stores mock profiles
	Profiles map[string]*nextdns.Profile

	// Security stores mock security settings per profile
	Security map[string]*nextdns.Security

	// Privacy stores mock privacy settings per profile
	Privacy map[string]*nextdns.Privacy

	// ParentalControl stores mock parental control settings per profile
	ParentalControl map[string]*nextdns.ParentalControl

	// Denylists stores mock denylists per profile
	Denylists map[string][]*nextdns.Denylist

	// Allowlists stores mock allowlists per profile
	Allowlists map[string][]*nextdns.Allowlist

	// SecurityTLDs stores mock security TLDs per profile
	SecurityTLDs map[string][]*nextdns.SecurityTlds

	// PrivacyBlocklists stores mock privacy blocklists per profile
	PrivacyBlocklists map[string][]*nextdns.PrivacyBlocklists

	// PrivacyNatives stores mock privacy natives per profile
	PrivacyNatives map[string][]*nextdns.PrivacyNatives

	// Settings stores mock settings per profile (full Settings struct)
	Settings map[string]*nextdns.Settings

	// SettingsLogs stores mock settings logs per profile
	SettingsLogs map[string]*nextdns.SettingsLogs

	// SettingsBlockPage stores mock block page settings per profile
	SettingsBlockPage map[string]*nextdns.SettingsBlockPage

	// ParentalControlCategories stores categories per profile
	ParentalControlCategories map[string][]*nextdns.ParentalControlCategories

	// ParentalControlServices stores services per profile
	ParentalControlServices map[string][]*nextdns.ParentalControlServices

	// Rewrites stores mock rewrites per profile
	Rewrites map[string][]*nextdns.Rewrites

	// SetupData stores mock setup data per profile
	SetupData map[string]*nextdns.Setup

	// Error injection for testing error paths
	CreateProfileError                error
	GetProfileError                   error
	UpdateProfileError                error
	DeleteProfileError                error
	UpdateSecurityError               error
	GetSecurityError                  error
	UpdatePrivacyError                error
	GetPrivacyError                   error
	SyncPrivacyBlocklistsError        error
	SyncPrivacyNativesError           error
	UpdateParentalControlError        error
	GetParentalControlError           error
	SyncDenylistError                 error
	SyncAllowlistError                error
	SyncSecurityTLDsError             error
	GetDenylistError                  error
	GetAllowlistError                 error
	GetSecurityTLDsError              error
	UpdateSettingsError               error
	SyncRewritesError                 error
	GetSettingsError                  error
	GetPrivacyBlocklistsError         error
	GetPrivacyNativesError            error
	GetParentalControlCategoriesError error
	GetParentalControlServicesError   error
	GetRewritesError                  error
	GetSetupError                     error

	// Call tracking
	Calls []MockCall

	// NextProfileID for auto-generating profile IDs
	NextProfileID int
	// contains filtered or unexported fields
}

MockClient is a mock implementation of ClientInterface for testing

func NewMockClient

func NewMockClient() *MockClient

NewMockClient creates a new mock client with initialized maps

func (*MockClient) AddAllowlistEntry added in v0.3.0

func (m *MockClient) AddAllowlistEntry(ctx context.Context, profileID string, domain string, active bool) error

AddAllowlistEntry adds a single entry to the mock allowlist

func (*MockClient) AddDenylistEntry added in v0.3.0

func (m *MockClient) AddDenylistEntry(ctx context.Context, profileID string, domain string, active bool) error

AddDenylistEntry adds a single entry to the mock denylist

func (*MockClient) AddPrivacyNative added in v0.3.0

func (m *MockClient) AddPrivacyNative(ctx context.Context, profileID string, nativeID string) error

AddPrivacyNative adds a single native tracker to the mock privacy natives

func (*MockClient) AddSecurityTLD added in v0.3.0

func (m *MockClient) AddSecurityTLD(ctx context.Context, profileID string, tld string) error

AddSecurityTLD adds a single TLD to the mock security TLDs

func (*MockClient) CreateProfile

func (m *MockClient) CreateProfile(ctx context.Context, name string) (string, error)

CreateProfile creates a mock profile

func (*MockClient) DeleteAllowlistEntry added in v0.3.0

func (m *MockClient) DeleteAllowlistEntry(ctx context.Context, profileID string, domain string) error

DeleteAllowlistEntry removes a single entry from the mock allowlist

func (*MockClient) DeleteDenylistEntry added in v0.3.0

func (m *MockClient) DeleteDenylistEntry(ctx context.Context, profileID string, domain string) error

DeleteDenylistEntry removes a single entry from the mock denylist

func (*MockClient) DeletePrivacyNative added in v0.3.0

func (m *MockClient) DeletePrivacyNative(ctx context.Context, profileID string, nativeID string) error

DeletePrivacyNative removes a single native tracker from the mock privacy natives

func (*MockClient) DeleteProfile

func (m *MockClient) DeleteProfile(ctx context.Context, profileID string) error

DeleteProfile deletes a mock profile

func (*MockClient) DeleteSecurityTLD added in v0.3.0

func (m *MockClient) DeleteSecurityTLD(ctx context.Context, profileID string, tld string) error

DeleteSecurityTLD removes a single TLD from the mock security TLDs

func (*MockClient) GetAllowlist

func (m *MockClient) GetAllowlist(ctx context.Context, profileID string) ([]*nextdns.Allowlist, error)

GetAllowlist retrieves mock allowlist

func (*MockClient) GetCallCount

func (m *MockClient) GetCallCount(method string) int

GetCallCount returns the number of calls to a specific method

func (*MockClient) GetDenylist

func (m *MockClient) GetDenylist(ctx context.Context, profileID string) ([]*nextdns.Denylist, error)

GetDenylist retrieves mock denylist

func (*MockClient) GetParentalControl

func (m *MockClient) GetParentalControl(ctx context.Context, profileID string) (*nextdns.ParentalControl, error)

GetParentalControl retrieves mock parental control settings

func (*MockClient) GetParentalControlCategories added in v0.9.0

func (m *MockClient) GetParentalControlCategories(ctx context.Context, profileID string) ([]*nextdns.ParentalControlCategories, error)

GetParentalControlCategories retrieves mock parental control categories

func (*MockClient) GetParentalControlServices added in v0.9.0

func (m *MockClient) GetParentalControlServices(ctx context.Context, profileID string) ([]*nextdns.ParentalControlServices, error)

GetParentalControlServices retrieves mock parental control services

func (*MockClient) GetPrivacy

func (m *MockClient) GetPrivacy(ctx context.Context, profileID string) (*nextdns.Privacy, error)

GetPrivacy retrieves mock privacy settings

func (*MockClient) GetPrivacyBlocklists added in v0.9.0

func (m *MockClient) GetPrivacyBlocklists(ctx context.Context, profileID string) ([]*nextdns.PrivacyBlocklists, error)

GetPrivacyBlocklists retrieves mock privacy blocklists

func (*MockClient) GetPrivacyNatives added in v0.9.0

func (m *MockClient) GetPrivacyNatives(ctx context.Context, profileID string) ([]*nextdns.PrivacyNatives, error)

GetPrivacyNatives retrieves mock privacy natives

func (*MockClient) GetProfile

func (m *MockClient) GetProfile(ctx context.Context, profileID string) (*nextdns.Profile, error)

GetProfile retrieves a mock profile

func (*MockClient) GetRewrites added in v0.8.1

func (m *MockClient) GetRewrites(ctx context.Context, profileID string) ([]*nextdns.Rewrites, error)

GetRewrites retrieves mock rewrites

func (*MockClient) GetSecurity

func (m *MockClient) GetSecurity(ctx context.Context, profileID string) (*nextdns.Security, error)

GetSecurity retrieves mock security settings

func (*MockClient) GetSecurityTLDs

func (m *MockClient) GetSecurityTLDs(ctx context.Context, profileID string) ([]*nextdns.SecurityTlds, error)

GetSecurityTLDs retrieves mock security TLDs

func (*MockClient) GetSettings added in v0.9.0

func (m *MockClient) GetSettings(ctx context.Context, profileID string) (*nextdns.Settings, error)

GetSettings retrieves mock settings

func (*MockClient) GetSetup added in v0.12.0

func (m *MockClient) GetSetup(ctx context.Context, profileID string) (*nextdns.Setup, error)

GetSetup retrieves mock setup data

func (*MockClient) Reset

func (m *MockClient) Reset()

Reset clears all mock data and calls

func (*MockClient) SetProfile added in v0.4.0

func (m *MockClient) SetProfile(profileID, name, fingerprint string)

SetProfile pre-configures a profile in the mock with specific ID, name and fingerprint The fingerprint parameter is stored separately for tests to verify This is useful for tests that need a specific profile to already exist

func (*MockClient) SyncAllowlist

func (m *MockClient) SyncAllowlist(ctx context.Context, profileID string, entries []DomainEntry) error

SyncAllowlist syncs mock allowlist

func (*MockClient) SyncDenylist

func (m *MockClient) SyncDenylist(ctx context.Context, profileID string, entries []DomainEntry) error

SyncDenylist syncs mock denylist

func (*MockClient) SyncPrivacyBlocklists

func (m *MockClient) SyncPrivacyBlocklists(ctx context.Context, profileID string, blocklists []string) error

SyncPrivacyBlocklists syncs mock privacy blocklists

func (*MockClient) SyncPrivacyNatives

func (m *MockClient) SyncPrivacyNatives(ctx context.Context, profileID string, natives []string) error

SyncPrivacyNatives syncs mock privacy natives

func (*MockClient) SyncRewrites added in v0.8.1

func (m *MockClient) SyncRewrites(ctx context.Context, profileID string, entries []RewriteEntry) error

SyncRewrites syncs mock rewrites using diff-based create/delete

func (*MockClient) SyncSecurityTLDs

func (m *MockClient) SyncSecurityTLDs(ctx context.Context, profileID string, tlds []string) error

SyncSecurityTLDs syncs mock security TLDs

func (*MockClient) UpdateParentalControl

func (m *MockClient) UpdateParentalControl(ctx context.Context, profileID string, config *ParentalControlConfig) error

UpdateParentalControl updates mock parental control settings

func (*MockClient) UpdatePrivacy

func (m *MockClient) UpdatePrivacy(ctx context.Context, profileID string, config *PrivacyConfig) error

UpdatePrivacy updates mock privacy settings

func (*MockClient) UpdateProfile

func (m *MockClient) UpdateProfile(ctx context.Context, profileID, name string) error

UpdateProfile updates a mock profile

func (*MockClient) UpdateSecurity

func (m *MockClient) UpdateSecurity(ctx context.Context, profileID string, config *SecurityConfig) error

UpdateSecurity updates mock security settings

func (*MockClient) UpdateSettings

func (m *MockClient) UpdateSettings(ctx context.Context, profileID string, config *SettingsConfig) error

UpdateSettings updates mock settings

func (*MockClient) WasMethodCalled

func (m *MockClient) WasMethodCalled(method string) bool

WasMethodCalled checks if a method was called

type ParentalControlConfig

type ParentalControlConfig struct {
	Categories            []string
	Services              []string
	SafeSearch            bool
	YouTubeRestrictedMode bool
	BlockBypass           bool
}

ParentalControlConfig represents parental control settings

type PrivacyConfig

type PrivacyConfig struct {
	Blocklists        []string
	Natives           []string
	DisguisedTrackers bool
	AllowAffiliate    bool
}

PrivacyConfig represents privacy settings

type ProfileConfig

type ProfileConfig struct {
	Name            string
	Security        *SecurityConfig
	Privacy         *PrivacyConfig
	ParentalControl *ParentalControlConfig
	Denylist        []string
	Allowlist       []string
	BlockedTLDs     []string
	Settings        *SettingsConfig
}

ProfileConfig represents the configuration for a NextDNS profile

type RewriteEntry added in v0.8.1

type RewriteEntry struct {
	Name    string
	Content string
}

RewriteEntry represents a DNS rewrite for syncing to NextDNS

type SecurityConfig

type SecurityConfig struct {
	ThreatIntelligenceFeeds bool
	AIThreatDetection       bool
	GoogleSafeBrowsing      bool
	Cryptojacking           bool
	DNSRebinding            bool
	IDNHomographs           bool
	Typosquatting           bool
	DGA                     bool
	NRD                     bool
	DDNS                    bool
	Parking                 bool
	CSAM                    bool
}

SecurityConfig represents security settings

type SettingsConfig

type SettingsConfig struct {
	LogsEnabled     bool
	LogClientsIPs   bool
	LogDomains      bool
	LogRetention    int
	Location        string
	BlockPageEnable bool
	Web3            bool
	BAV             bool
	// Performance settings
	Ecs             bool
	CacheBoost      bool
	CnameFlattening bool
}

SettingsConfig represents general settings

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL