2019-06-10 11:33:19 +03:00
|
|
|
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"
|
2019-04-15 16:21:12 +03:00
|
|
|
"github.com/NYTimes/gziphandler"
|
2018-08-30 17:25:33 +03:00
|
|
|
)
|
|
|
|
|
2019-02-10 20:47:43 +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)
|
2019-02-10 20:47:43 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func httpError(w http.ResponseWriter, code int, format string, args ...interface{}) {
|
|
|
|
text := fmt.Sprintf(format, args...)
|
2019-02-25 16:44:22 +03:00
|
|
|
log.Info(text)
|
2019-02-10 20:47:43 +03:00
|
|
|
http.Error(w, text, code)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------
|
2018-12-05 20:29:00 +03:00
|
|
|
// dns run control
|
2019-02-10 20:47:43 +03:00
|
|
|
// ---------------
|
2018-12-05 20:29:00 +03:00
|
|
|
func writeAllConfigsAndReloadDNS() error {
|
2018-08-30 17:25:33 +03:00
|
|
|
err := writeAllConfigs()
|
|
|
|
if err != nil {
|
2019-02-25 16:44:22 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-07-02 12:19:36 +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)
|
|
|
|
}
|
2019-03-19 14:14:58 +03:00
|
|
|
|
2019-07-02 12:19:36 +03:00
|
|
|
// Get the list of DNS addresses the server is listening on
|
|
|
|
func getDNSAddresses() []string {
|
2019-03-19 14:14:58 +03:00
|
|
|
dnsAddresses := []string{}
|
2019-07-02 12:19:36 +03:00
|
|
|
|
2019-03-19 14:14:58 +03:00
|
|
|
if config.DNS.BindHost == "0.0.0.0" {
|
2019-07-02 12:19:36 +03:00
|
|
|
|
2019-03-19 14:14:58 +03:00
|
|
|
ifaces, e := getValidNetInterfacesForWeb()
|
|
|
|
if e != nil {
|
|
|
|
log.Error("Couldn't get network interfaces: %v", e)
|
2019-07-02 12:19:36 +03:00
|
|
|
return []string{}
|
2019-03-19 14:14:58 +03:00
|
|
|
}
|
2019-07-02 12:19:36 +03:00
|
|
|
|
2019-03-19 14:14:58 +03:00
|
|
|
for _, iface := range ifaces {
|
|
|
|
for _, addr := range iface.Addresses {
|
2019-07-02 12:19:36 +03:00
|
|
|
addDNSAddress(&dnsAddresses, addr)
|
2019-03-19 14:14:58 +03:00
|
|
|
}
|
|
|
|
}
|
2019-07-02 12:19:36 +03:00
|
|
|
|
|
|
|
} else {
|
|
|
|
addDNSAddress(&dnsAddresses, config.DNS.BindHost)
|
2019-03-19 14:14:58 +03:00
|
|
|
}
|
2019-07-02 12:19:36 +03:00
|
|
|
|
2019-07-02 12:27:10 +03:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-02 12:19:36 +03:00
|
|
|
return dnsAddresses
|
|
|
|
}
|
|
|
|
|
|
|
|
func handleStatus(w http.ResponseWriter, r *http.Request) {
|
2019-10-30 11:52:58 +03:00
|
|
|
c := dnsforward.FilteringConfig{}
|
|
|
|
if config.dnsServer != nil {
|
|
|
|
config.dnsServer.WriteDiskConfig(&c)
|
|
|
|
}
|
2018-08-30 17:25:33 +03:00
|
|
|
data := map[string]interface{}{
|
2019-10-30 11:52:58 +03:00
|
|
|
"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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-21 17:44:07 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-02-12 20:02:52 +03:00
|
|
|
// ------------------------
|
|
|
|
// registration of handlers
|
|
|
|
// ------------------------
|
2018-08-30 17:25:33 +03:00
|
|
|
func registerControlHandlers() {
|
2019-08-21 14:39:37 +03:00
|
|
|
httpRegister(http.MethodGet, "/control/status", handleStatus)
|
|
|
|
httpRegister(http.MethodPost, "/control/i18n/change_language", handleI18nChangeLanguage)
|
|
|
|
httpRegister(http.MethodGet, "/control/i18n/current_language", handleI18nCurrentLanguage)
|
2019-01-29 20:41:57 +03:00
|
|
|
http.HandleFunc("/control/version.json", postInstall(optionalAuth(handleGetVersionJSON)))
|
2019-08-21 14:39:37 +03:00
|
|
|
httpRegister(http.MethodPost, "/control/update", handleUpdate)
|
|
|
|
|
2019-10-21 17:44:07 +03:00
|
|
|
httpRegister("GET", "/control/profile", handleGetProfile)
|
2019-05-24 17:15:19 +03:00
|
|
|
|
2019-09-04 14:12:00 +03:00
|
|
|
RegisterFilteringHandlers()
|
2019-02-27 18:53:16 +03:00
|
|
|
RegisterTLSHandlers()
|
2019-07-23 12:16:36 +03:00
|
|
|
RegisterBlockedServicesHandlers()
|
2019-08-29 12:34:07 +03:00
|
|
|
RegisterAuthHandlers()
|
2019-02-22 15:52:12 +03:00
|
|
|
|
|
|
|
http.HandleFunc("/dns-query", postInstall(handleDOH))
|
2018-08-30 17:25:33 +03:00
|
|
|
}
|
2019-08-21 14:39:37 +03:00
|
|
|
|
2019-09-25 15:36:09 +03:00
|
|
|
func httpRegister(method string, url string, handler func(http.ResponseWriter, *http.Request)) {
|
2019-08-21 14:39:37 +03:00
|
|
|
http.Handle(url, postInstallHandler(optionalAuthHandler(gziphandler.GzipHandler(ensureHandler(method, handler)))))
|
|
|
|
}
|