From 4474e9fcf9073af593df76b4844f4091c1c7946e Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 13 Jan 2021 17:26:57 +0300 Subject: [PATCH] Pull request: all: imp http handlers, imp docs Merge in DNS/adguard-home from fix-openapi to master Squashed commit of the following: commit 0e7530472fb566e5cab73d178c8ec16e5ef11dcb Author: Ainar Garipov Date: Wed Jan 13 17:02:06 2021 +0300 all: imp http handlers, imp docs --- internal/dnsforward/http.go | 10 ++-- internal/home/auth.go | 4 +- internal/home/auth_test.go | 2 +- internal/home/authglinet_test.go | 2 +- internal/home/control.go | 8 +-- openapi/CHANGELOG.md | 2 + openapi/openapi.yaml | 86 ++++++++++++++++++++++++++------ 7 files changed, 87 insertions(+), 27 deletions(-) diff --git a/internal/dnsforward/http.go b/internal/dnsforward/http.go index 1f5780a6..3a6d6578 100644 --- a/internal/dnsforward/http.go +++ b/internal/dnsforward/http.go @@ -522,12 +522,12 @@ func (s *Server) handleDOH(w http.ResponseWriter, r *http.Request) { } func (s *Server) registerHandlers() { - s.conf.HTTPRegister("GET", "/control/dns_info", s.handleGetConfig) - s.conf.HTTPRegister("POST", "/control/dns_config", s.handleSetConfig) - s.conf.HTTPRegister("POST", "/control/test_upstream_dns", s.handleTestUpstreamDNS) + s.conf.HTTPRegister(http.MethodGet, "/control/dns_info", s.handleGetConfig) + s.conf.HTTPRegister(http.MethodPost, "/control/dns_config", s.handleSetConfig) + s.conf.HTTPRegister(http.MethodPost, "/control/test_upstream_dns", s.handleTestUpstreamDNS) - s.conf.HTTPRegister("GET", "/control/access/list", s.handleAccessList) - s.conf.HTTPRegister("POST", "/control/access/set", s.handleAccessSet) + s.conf.HTTPRegister(http.MethodGet, "/control/access/list", s.handleAccessList) + s.conf.HTTPRegister(http.MethodPost, "/control/access/set", s.handleAccessSet) s.conf.HTTPRegister("", "/dns-query", s.handleDOH) } diff --git a/internal/home/auth.go b/internal/home/auth.go index dce17241..26b57787 100644 --- a/internal/home/auth.go +++ b/internal/home/auth.go @@ -369,8 +369,8 @@ func handleLogout(w http.ResponseWriter, r *http.Request) { // RegisterAuthHandlers - register handlers func RegisterAuthHandlers() { - Context.mux.Handle("/control/login", postInstallHandler(ensureHandler("POST", handleLogin))) - httpRegister("GET", "/control/logout", handleLogout) + Context.mux.Handle("/control/login", postInstallHandler(ensureHandler(http.MethodPost, handleLogin))) + httpRegister(http.MethodGet, "/control/logout", handleLogout) } func parseCookie(cookie string) string { diff --git a/internal/home/auth_test.go b/internal/home/auth_test.go index 3811b170..4a4a21c8 100644 --- a/internal/home/auth_test.go +++ b/internal/home/auth_test.go @@ -119,7 +119,7 @@ func TestAuthHTTP(t *testing.T) { w.hdr = make(http.Header) r := http.Request{} r.Header = make(http.Header) - r.Method = "GET" + r.Method = http.MethodGet // get / - we're redirected to login page r.URL = &url.URL{Path: "/"} diff --git a/internal/home/authglinet_test.go b/internal/home/authglinet_test.go index df5e3342..70bb6636 100644 --- a/internal/home/authglinet_test.go +++ b/internal/home/authglinet_test.go @@ -36,7 +36,7 @@ func TestAuthGL(t *testing.T) { binary.BigEndian.PutUint32(data, tval) } assert.Nil(t, ioutil.WriteFile(glFilePrefix+"test", data, 0o644)) - r, _ := http.NewRequest("GET", "http://localhost/", nil) + r, _ := http.NewRequest(http.MethodGet, "http://localhost/", nil) r.AddCookie(&http.Cookie{Name: glCookieName, Value: "test"}) assert.True(t, glProcessCookie(r)) GLMode = false diff --git a/internal/home/control.go b/internal/home/control.go index 01bf00ce..7caac5e6 100644 --- a/internal/home/control.go +++ b/internal/home/control.go @@ -43,7 +43,7 @@ func addDNSAddress(dnsAddresses *[]string, addr string) { *dnsAddresses = append(*dnsAddresses, addr) } -func handleStatus(w http.ResponseWriter, r *http.Request) { +func handleStatus(w http.ResponseWriter, _ *http.Request) { c := dnsforward.FilteringConfig{} if Context.dnsServer != nil { Context.dnsServer.WriteDiskConfig(&c) @@ -140,7 +140,7 @@ func ensure(method string, handler func(http.ResponseWriter, *http.Request)) fun return } - if method == "POST" || method == "PUT" || method == "DELETE" { + if method == http.MethodPost || method == http.MethodPut || method == http.MethodDelete { Context.controlLock.Lock() defer Context.controlLock.Unlock() } @@ -150,11 +150,11 @@ func ensure(method string, handler func(http.ResponseWriter, *http.Request)) fun } func ensurePOST(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { - return ensure("POST", handler) + return ensure(http.MethodPost, handler) } func ensureGET(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { - return ensure("GET", handler) + return ensure(http.MethodGet, handler) } // Bridge between http.Handler object and Go function diff --git a/openapi/CHANGELOG.md b/openapi/CHANGELOG.md index 133664b1..225d2ead 100644 --- a/openapi/CHANGELOG.md +++ b/openapi/CHANGELOG.md @@ -62,6 +62,8 @@ The old fields will be removed in v0.106.0. +As well as other documentation fixes. + ## v0.103: API changes ### API: replace settings in GET /control/dns_info & POST /control/dns_config diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index 751eb073..fe0c8cb7 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -608,7 +608,7 @@ 'application/json': 'schema': 'type': 'object' - 'parameters': + 'properties': 'enabled': 'type': 'boolean' 'examples': @@ -664,7 +664,7 @@ 'application/json': 'schema': 'type': 'object' - 'parameters': + 'properties': 'enable': 'type': 'boolean' 'sensitivity': @@ -705,7 +705,7 @@ 'application/json': 'schema': 'type': 'object' - 'parameters': + 'properties': 'enabled': 'type': 'boolean' 'examples': @@ -789,6 +789,39 @@ 'application/json': 'schema': '$ref': '#/components/schemas/ClientsFindResponse' + '/access/list': + 'get': + 'operationId': 'accessList' + 'responses': + '200': + 'description': 'OK.' + 'content': + 'application/json': + 'schema': + '$ref': '#/components/schemas/AccessListResponse' + 'summary': 'List (dis)allowed clients, blocked hosts, etc.' + 'tags': + - 'clients' + '/access/set': + 'post': + 'operationId': 'accessSet' + 'requestBody': + 'content': + 'application/json': + 'schema': + '$ref': '#/components/schemas/AccessSetRequest' + 'required': true + 'responses': + '200': + 'description': 'OK.' + '400': + 'description': > + Failed to parse JSON or cannot save the list. + '500': + 'description': 'Internal error.' + 'summary': 'Set (dis)allowed clients, blocked hosts, etc.' + 'tags': + - 'clients' '/blocked_services/list': 'get': 'tags': @@ -1124,31 +1157,35 @@ 'type': 'object' 'description': 'AdGuard Home server status and configuration' 'required': - - 'dns_address' + - 'dns_addresses' - 'dns_port' + - 'http_port' - 'protection_enabled' - - 'querylog_enabled' - 'running' - - 'bootstrap_dns' - - 'upstream_dns' - 'version' - 'language' 'properties': - 'dns_address': - 'type': 'string' - 'example': '127.0.0.1' + 'dns_addresses': + 'example': ['127.0.0.1'] + 'items': + 'type': 'string' + 'type': 'array' 'dns_port': 'type': 'integer' 'format': 'uint16' 'example': 53 'minimum': 1 'maximum': 65535 + 'http_port': + 'type': 'integer' + 'format': 'uint16' + 'example': 80 + 'minimum': 1 + 'maximum': 65535 'protection_enabled': 'type': 'boolean' 'dhcp_available': 'type': 'boolean' - 'querylog_enabled': - 'type': 'boolean' 'running': 'type': 'boolean' 'version': @@ -2077,6 +2114,29 @@ 'description': 'Response to clients find operation' 'items': '$ref': '#/components/schemas/ClientsFindEntry' + 'AccessListResponse': + '$ref': '#/components/schemas/AccessList' + 'AccessSetRequest': + '$ref': '#/components/schemas/AccessList' + 'AccessList': + 'description': 'Client and host access list' + 'properties': + 'allowed_clients': + 'description': 'Allowlist of clients.' + 'items': + 'type': 'string' + 'type': 'array' + 'disallowed_clients': + 'description': 'Blocklist of clients.' + 'items': + 'type': 'string' + 'type': 'array' + 'blocked_hosts': + 'description': 'Blocklist of hosts.' + 'items': + 'type': 'string' + 'type': 'array' + 'type': 'object' 'ClientsFindEntry': 'type': 'object' 'additionalProperties': @@ -2249,7 +2309,6 @@ 'status': 'type': 'string' 'default': '' - 'example': '' 'can_autofix': 'type': 'boolean' 'example': false @@ -2274,7 +2333,6 @@ 'error': 'type': 'string' 'default': '' - 'example': '' 'description': 'Error text. Set if static=error' 'InitialConfigurationBeta': 'type': 'object'