AdGuardHome/home/control.go

180 lines
4.5 KiB
Go
Raw Normal View History

package home
2018-08-30 17:25:33 +03:00
import (
"encoding/json"
"fmt"
"net/http"
2018-12-05 14:21:25 +03:00
"github.com/AdguardTeam/AdGuardHome/dnsforward"
2019-02-27 18:28:09 +03:00
"github.com/AdguardTeam/golibs/log"
"github.com/NYTimes/gziphandler"
2018-08-30 17:25:33 +03:00
)
// ----------------
// helper functions
// ----------------
func returnOK(w http.ResponseWriter) {
_, err := fmt.Fprintf(w, "OK\n")
if err != nil {
2019-02-27 17:28:10 +03:00
httpError(w, http.StatusInternalServerError, "Couldn't write body: %s", err)
}
}
func httpError(w http.ResponseWriter, code int, format string, args ...interface{}) {
text := fmt.Sprintf(format, args...)
log.Info(text)
http.Error(w, text, code)
}
// ---------------
// dns run control
// ---------------
func writeAllConfigsAndReloadDNS() error {
2018-08-30 17:25:33 +03:00
err := writeAllConfigs()
if err != nil {
log.Error("Couldn't write all configs: %s", err)
2018-08-30 17:25:33 +03:00
return err
}
2019-01-24 20:11:01 +03:00
return reconfigureDNSServer()
2018-08-30 17:25:33 +03:00
}
func addDNSAddress(dnsAddresses *[]string, addr string) {
if config.DNS.Port != 53 {
addr = fmt.Sprintf("%s:%d", addr, config.DNS.Port)
}
*dnsAddresses = append(*dnsAddresses, addr)
}
// Get the list of DNS addresses the server is listening on
func getDNSAddresses() []string {
dnsAddresses := []string{}
if config.DNS.BindHost == "0.0.0.0" {
ifaces, e := getValidNetInterfacesForWeb()
if e != nil {
log.Error("Couldn't get network interfaces: %v", e)
return []string{}
}
for _, iface := range ifaces {
for _, addr := range iface.Addresses {
addDNSAddress(&dnsAddresses, addr)
}
}
} else {
addDNSAddress(&dnsAddresses, config.DNS.BindHost)
}
if config.TLS.Enabled && len(config.TLS.ServerName) != 0 {
if config.TLS.PortHTTPS != 0 {
addr := config.TLS.ServerName
if config.TLS.PortHTTPS != 443 {
addr = fmt.Sprintf("%s:%d", addr, config.TLS.PortHTTPS)
}
addr = fmt.Sprintf("https://%s/dns-query", addr)
dnsAddresses = append(dnsAddresses, addr)
}
if config.TLS.PortDNSOverTLS != 0 {
addr := fmt.Sprintf("tls://%s:%d", config.TLS.ServerName, config.TLS.PortDNSOverTLS)
dnsAddresses = append(dnsAddresses, addr)
}
}
return dnsAddresses
}
func handleStatus(w http.ResponseWriter, r *http.Request) {
c := dnsforward.FilteringConfig{}
if config.dnsServer != nil {
config.dnsServer.WriteDiskConfig(&c)
}
2018-08-30 17:25:33 +03:00
data := map[string]interface{}{
"dns_addresses": getDNSAddresses(),
"http_port": config.BindPort,
"dns_port": config.DNS.Port,
"running": isRunning(),
"version": versionString,
"language": config.Language,
"protection_enabled": c.ProtectionEnabled,
"bootstrap_dns": c.BootstrapDNS,
"upstream_dns": c.UpstreamDNS,
"all_servers": c.AllServers,
2018-08-30 17:25:33 +03:00
}
2018-10-20 19:58:39 +03:00
jsonVal, err := json.Marshal(data)
2018-08-30 17:25:33 +03:00
if err != nil {
2019-02-27 17:28:10 +03:00
httpError(w, http.StatusInternalServerError, "Unable to marshal status json: %s", err)
2018-08-30 17:25:33 +03:00
return
}
w.Header().Set("Content-Type", "application/json")
2018-10-20 19:58:39 +03:00
_, err = w.Write(jsonVal)
2018-08-30 17:25:33 +03:00
if err != nil {
2019-02-27 17:28:10 +03:00
httpError(w, http.StatusInternalServerError, "Unable to write response json: %s", err)
2018-08-30 17:25:33 +03:00
return
}
}
type profileJSON struct {
Name string `json:"name"`
}
func handleGetProfile(w http.ResponseWriter, r *http.Request) {
pj := profileJSON{}
u := config.auth.GetCurrentUser(r)
pj.Name = u.Name
data, err := json.Marshal(pj)
if err != nil {
httpError(w, http.StatusInternalServerError, "json.Marshal: %s", err)
return
}
_, _ = w.Write(data)
}
2019-02-22 15:52:12 +03:00
// --------------
// DNS-over-HTTPS
// --------------
func handleDOH(w http.ResponseWriter, r *http.Request) {
if r.TLS == nil {
httpError(w, http.StatusNotFound, "Not Found")
return
}
if !isRunning() {
httpError(w, http.StatusInternalServerError, "DNS server is not running")
return
}
2019-07-09 19:00:11 +03:00
config.dnsServer.ServeHTTP(w, r)
2019-02-22 15:52:12 +03:00
}
// ------------------------
// registration of handlers
// ------------------------
2018-08-30 17:25:33 +03:00
func registerControlHandlers() {
httpRegister(http.MethodGet, "/control/status", handleStatus)
httpRegister(http.MethodPost, "/control/i18n/change_language", handleI18nChangeLanguage)
httpRegister(http.MethodGet, "/control/i18n/current_language", handleI18nCurrentLanguage)
http.HandleFunc("/control/version.json", postInstall(optionalAuth(handleGetVersionJSON)))
httpRegister(http.MethodPost, "/control/update", handleUpdate)
httpRegister("GET", "/control/profile", handleGetProfile)
RegisterFilteringHandlers()
RegisterTLSHandlers()
2019-07-23 12:16:36 +03:00
RegisterBlockedServicesHandlers()
RegisterAuthHandlers()
2019-02-22 15:52:12 +03:00
http.HandleFunc("/dns-query", postInstall(handleDOH))
2018-08-30 17:25:33 +03:00
}
func httpRegister(method string, url string, handler func(http.ResponseWriter, *http.Request)) {
http.Handle(url, postInstallHandler(optionalAuthHandler(gziphandler.GzipHandler(ensureHandler(method, handler)))))
}