Documentation ¶
Overview ¶
Package selfcensor contains code that triggers censorship. We use this functionality to implement integration tests.
The self censoring functionality is disabled by default. To enable it, call Enable with a JSON-serialized Spec structure as its argument.
The following example causes NXDOMAIN to be returned for `dns.google`:
selfcensor.Enable(`{"PoisonSystemDNS":{"dns.google":["NXDOMAIN"]}}`)
The following example blocks connecting to `8.8.8.8:443`:
selfcensor.Enable(`{"BlockedEndpoints":{"8.8.8.8:443":"REJECT"}}`)
The following example blocks packets containing dns.google:
selfcensor.Enable(`{"BlockedFingerprints":{"dns.google":"RST"}}`)
The documentation of the Spec structure contains further information on how to populate the JSON. Miniooni uses the `--self-censor-spec flag` to which you are supposed to pass a serialized JSON.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var DefaultDialer = SystemDialer{}
DefaultDialer is the dialer you should use in code that wants to take advantage of selfcensor capabilities.
Functions ¶
func Attempts ¶
func Attempts() int64
Attempts returns the number of self censorship attempts so far. A self censorship attempt is defined as the code entering into the branch that _may_ perform self censorship. We expected to see this counter being equal to zero when Enabled() returns false.
func Enable ¶
Enable turns on the self censorship engine. This function returns an error if we cannot parse a Spec from the serialized JSON inside data. Each time you call Enable you overwrite the previous spec.
func MaybeEnable ¶
MaybeEnable is like enable except that it does nothing in case the string provided as argument is an empty string.
Types ¶
type Spec ¶
type Spec struct { // PoisonSystemDNS allows you to change the behaviour of the system // DNS regarding specific domains. They keys are the domains and the // values are the IP addresses to return. If you set the values for // a domain to `[]string{"NXDOMAIN"}`, the system resolver will return // an NXDOMAIN response. If you set the values for a domain to // `[]string{"TIMEOUT"}` the system resolver will return "i/o timeout". PoisonSystemDNS map[string][]string // BlockedEndpoints allows you to block specific IP endpoints. The key is // `IP:port` to block. The format is the same of net.JoinHostPort. If // the value is "REJECT", then the connection attempt will fail with // ECONNREFUSED. If the value is "TIMEOUT", then the connector will return // claiming "i/o timeout". If the value is anything else, we will // perform a "REJECT". BlockedEndpoints map[string]string // BlockedFingerprints allows you to block packets whose body contains // specific fingerprints. Of course, the key is the fingerprint. If // the value is "RST", then the connection will be reset. If the value // is "TIMEOUT", then the code will return claiming "i/o timeout". If // the value is anything else, we will perform a "RST". BlockedFingerprints map[string]string }
Spec indicates what self censorship techniques to implement.
type SystemDialer ¶
type SystemDialer struct{}
SystemDialer is a self-censoring system dialer. This dialer does not censor anything unless you call selfcensor.Enable().
func (SystemDialer) DialContext ¶
DialContext implements Dialer.DialContext
type SystemResolver ¶
type SystemResolver struct{}
SystemResolver is a self-censoring system resolver. This resolver does not censor anything unless you call selfcensor.Enable().
func (SystemResolver) Address ¶
func (r SystemResolver) Address() string
Address implements Resolver.Address
func (SystemResolver) LookupHost ¶
LookupHost implements Resolver.LookupHost
func (SystemResolver) Network ¶
func (r SystemResolver) Network() string
Network implements Resolver.Network