fix: harden DynDNS recovery and publish v1.5.1

This commit is contained in:
admin committed 2026-10-10 02:26:47 +02:00
1 parent 3383b91e49
commit 81def77e3c
37 files changed
+2415 -250

No files matched your search

+14 -7
View File
@@ -28,6 +28,8 @@ type APIError struct {
Message string
}
func (e *APIError) HTTPStatusCode() int { return e.Status }
func (e *APIError) Error() string {
message := strings.TrimSpace(e.Message)
if message == "" {
@@ -98,7 +100,7 @@ func (c *Client) BaseURL() string { return c.baseURL }
func (c *Client) ListHosts(ctx context.Context, password string) ([]string, error) {
var hosts []string
err := c.withSession(ctx, password, func(sid string) error {
err := c.withSession(ctx, password, func(ctx context.Context, sid string) error {
var response struct {
Config struct {
DNS struct {
@@ -116,13 +118,13 @@ func (c *Client) ListHosts(ctx context.Context, password string) ([]string, erro
}
func (c *Client) AddHost(ctx context.Context, password, value string) error {
return c.withSession(ctx, password, func(sid string) error {
return c.withSession(ctx, password, func(ctx context.Context, sid string) error {
return c.addHost(ctx, sid, value)
})
}
func (c *Client) DeleteHost(ctx context.Context, password, value string) error {
return c.withSession(ctx, password, func(sid string) error {
return c.withSession(ctx, password, func(ctx context.Context, sid string) error {
return c.deleteHost(ctx, sid, value)
})
}
@@ -131,7 +133,7 @@ func (c *Client) DeleteHost(ctx context.Context, password, value string) error {
// Pi-hole session. Missing values are accepted so an interrupted deletion can
// safely be retried.
func (c *Client) DeleteHosts(ctx context.Context, password string, values []string) error {
return c.withSession(ctx, password, func(sid string) error {
return c.withSession(ctx, password, func(ctx context.Context, sid string) error {
for _, value := range values {
if err := c.doJSON(ctx, http.MethodDelete, "/config/dns/hosts/"+url.PathEscape(value), sid, nil, nil, http.StatusNoContent, http.StatusNotFound); err != nil {
return fmt.Errorf("Pi-hole-Eintrag %q konnte nicht gelöscht werden: %w", value, err)
@@ -145,7 +147,7 @@ func (c *Client) ReplaceHost(ctx context.Context, password, previous, replacemen
if previous == replacement {
return nil
}
return c.withSession(ctx, password, func(sid string) error {
return c.withSession(ctx, password, func(ctx context.Context, sid string) error {
if err := c.deleteHost(ctx, sid, previous); err != nil {
return err
}
@@ -167,7 +169,12 @@ func (c *Client) deleteHost(ctx context.Context, sid, value string) error {
return c.doJSON(ctx, http.MethodDelete, "/config/dns/hosts/"+url.PathEscape(value), sid, nil, nil, http.StatusNoContent)
}
func (c *Client) withSession(ctx context.Context, password string, operation func(string) error) error {
func (c *Client) withSession(ctx context.Context, password string, operation func(context.Context, string) error) error {
// Authentication and the operation must finish before the web server's
// write deadline, including when a Pi-hole disappears between requests.
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()
defer c.http.CloseIdleConnections()
sid, err := c.authenticate(ctx, password)
if err != nil {
return err
@@ -177,7 +184,7 @@ func (c *Client) withSession(ctx context.Context, password string, operation fun
defer cancel()
_ = c.doJSON(logoutCtx, http.MethodDelete, "/auth", sid, nil, nil, http.StatusNoContent, http.StatusNotFound)
}()
return operation(sid)
return operation(ctx, sid)
}
func (c *Client) authenticate(ctx context.Context, password string) (string, error) {