penguin/webhook-freedns

freedns webhook for cert-manager

commit d22266fd9ae0be3ffdab8cd44cf5b8df21067665

author斟酌 鵬兄 <tgckpg@gmail.com>
date2024-10-30T22:00:24Z
subjectMerge from 'cert-manager/webhook-example/master'
commit d22266fd9ae0be3ffdab8cd44cf5b8df21067665
Merge: 4fe54aa 0dcb653
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2024-10-30T22:00:24Z

    Merge from 'cert-manager/webhook-example/master'

 Dockerfile                                       |    4 +-
 Makefile                                         |   50 +-
 OWNERS                                           |    4 +-
 deploy/freedns-webhook/templates/deployment.yaml |    1 +
 deploy/freedns-webhook/templates/service.yaml    |    1 +
 deploy/freedns-webhook/values.yaml               |    2 +-
 freedns/freedns.go                               |    6 +-
 go.mod                                           |  167 ++--
 go.sum                                           | 1155 +++++-----------------
 main.go                                          |    6 +-
 main_test.go                                     |   17 +-
 11 files changed, 355 insertions(+), 1058 deletions(-)

diff --cc Makefile
index c308489,9d3dc55..6fbb534
--- a/Makefile
+++ b/Makefile
@@@ -6,36 -7,39 +7,39 @@@ IMAGE_TAG := "latest
  
  OUT := $(shell pwd)/_out
  
- KUBE_VERSION=1.21.2
+ KUBEBUILDER_VERSION=1.28.0
  
- $(shell mkdir -p "$(OUT)")
- export TEST_ASSET_ETCD=_test/kubebuilder/bin/etcd
- export TEST_ASSET_KUBE_APISERVER=_test/kubebuilder/bin/kube-apiserver
- export TEST_ASSET_KUBECTL=_test/kubebuilder/bin/kubectl
 -HELM_FILES := $(shell find deploy/example-webhook)
++HELM_FILES := $(shell find deploy/freedns-webhook)
  
- test: _test/kubebuilder
- 	go test -v .
+ test: _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl
+ 	TEST_ASSET_ETCD=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd \
+ 	TEST_ASSET_KUBE_APISERVER=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver \
+ 	TEST_ASSET_KUBECTL=_test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl \
+ 	$(GO) test -v .
  
- _test/kubebuilder:
- 	curl -fsSL https://go.kubebuilder.io/test-tools/$(KUBE_VERSION)/$(OS)/$(ARCH) -o kubebuilder-tools.tar.gz
- 	mkdir -p _test/kubebuilder
- 	tar -xvf kubebuilder-tools.tar.gz
- 	mv kubebuilder/bin _test/kubebuilder/
- 	rm kubebuilder-tools.tar.gz
- 	rm -R kubebuilder
+ _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH).tar.gz: | _test
+ 	curl -fsSL https://go.kubebuilder.io/test-tools/$(KUBEBUILDER_VERSION)/$(OS)/$(ARCH) -o $@
  
- clean: clean-kubebuilder
+ _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/etcd _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kube-apiserver _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)/kubectl: _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH).tar.gz | _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH)
+ 	tar xfO $< kubebuilder/bin/$(notdir $@) > $@ && chmod +x $@
  
- clean-kubebuilder:
- 	rm -Rf _test/kubebuilder
+ .PHONY: clean
+ clean:
+ 	rm -r _test $(OUT)
  
+ .PHONY: build
  build:
  	docker build -t "$(IMAGE_NAME):$(IMAGE_TAG)" .
  
  .PHONY: rendered-manifest.yaml
- rendered-manifest.yaml:
+ rendered-manifest.yaml: $(OUT)/rendered-manifest.yaml
+ 
+ $(OUT)/rendered-manifest.yaml: $(HELM_FILES) | $(OUT)
  	helm template \
 -	    --name example-webhook \
 +	    --name freedns-webhook \
-         --set image.repository=$(IMAGE_NAME) \
-         --set image.tag=$(IMAGE_TAG) \
-         deploy/freedns-webhook > "$(OUT)/rendered-manifest.yaml"
+             --set image.repository=$(IMAGE_NAME) \
+             --set image.tag=$(IMAGE_TAG) \
 -            deploy/example-webhook > $@
++            deploy/freedns-webhook > $@
+ 
+ _test $(OUT) _test/kubebuilder-$(KUBEBUILDER_VERSION)-$(OS)-$(ARCH):
+ 	mkdir -p $@
diff --cc deploy/freedns-webhook/templates/deployment.yaml
index c2de51f,057cc42..5c49d7b
--- a/deploy/freedns-webhook/templates/deployment.yaml
+++ b/deploy/freedns-webhook/templates/deployment.yaml
@@@ -1,10 -1,11 +1,11 @@@
  apiVersion: apps/v1
  kind: Deployment
  metadata:
 -  name: {{ include "example-webhook.fullname" . }}
 +  name: {{ include "freedns-webhook.fullname" . }}
+   namespace: {{ .Release.Namespace | quote }}
    labels:
 -    app: {{ include "example-webhook.name" . }}
 -    chart: {{ include "example-webhook.chart" . }}
 +    app: {{ include "freedns-webhook.name" . }}
 +    chart: {{ include "freedns-webhook.chart" . }}
      release: {{ .Release.Name }}
      heritage: {{ .Release.Service }}
  spec:
diff --cc deploy/freedns-webhook/templates/service.yaml
index 844933b,a76ddc7..44c49b8
--- a/deploy/freedns-webhook/templates/service.yaml
+++ b/deploy/freedns-webhook/templates/service.yaml
@@@ -1,10 -1,11 +1,11 @@@
  apiVersion: v1
  kind: Service
  metadata:
 -  name: {{ include "example-webhook.fullname" . }}
 +  name: {{ include "freedns-webhook.fullname" . }}
+   namespace: {{ .Release.Namespace | quote }}
    labels:
 -    app: {{ include "example-webhook.name" . }}
 -    chart: {{ include "example-webhook.chart" . }}
 +    app: {{ include "freedns-webhook.name" . }}
 +    chart: {{ include "freedns-webhook.chart" . }}
      release: {{ .Release.Name }}
      heritage: {{ .Release.Service }}
  spec:
diff --cc deploy/freedns-webhook/values.yaml
index 126c186,31eb151..6e3d97c
--- a/deploy/freedns-webhook/values.yaml
+++ b/deploy/freedns-webhook/values.yaml
@@@ -13,8 -13,8 +13,8 @@@ certManager
    serviceAccountName: cert-manager
  
  image:
 -  repository: mycompany/webhook-image
 -  tag: latest
 +  repository: penguinade/cert-manager-webhook-freedns
-   tag: 2022.03.15
++  tag: 2024.10.31.04
    pullPolicy: IfNotPresent
  
  nameOverride: ""
diff --cc freedns/freedns.go
index 2ddb547,0000000..9ec48ff
mode 100755,000000..100755
--- a/freedns/freedns.go
+++ b/freedns/freedns.go
@@@ -1,406 -1,0 +1,406 @@@
 +package freedns
 +
 +import (
 +	"errors"
 +	"fmt"
 +	"io/ioutil"
 +	"net/http"
 +	"net/url"
 +	"strconv"
 +	"strings"
 +
- 	logf "github.com/jetstack/cert-manager/pkg/logs"
++	logf "github.com/cert-manager/cert-manager/pkg/logs"
 +	"golang.org/x/net/html"
 +)
 +
 +type FreeDNSOperations interface {
 +	Login()
 +	SelectDomain()
 +	AddRecord()
 +	FindRecord()
 +	DeleteRecord()
 +}
 +
 +type FreeDNS struct {
 +	AuthCookie *http.Cookie
 +	DomainId   string
 +	LoggedOut  bool
 +}
 +
 +const URI_LOGIN = "https://freedns.afraid.org/zc.php?step=2"
 +const URI_DOMAIN = "https://freedns.afraid.org/domain/"
 +const URI_ADD_RECORD = "https://freedns.afraid.org/subdomain/save.php?step=2"
 +const URI_SUBDOMAIN = "https://freedns.afraid.org/subdomain/?limit="
 +const URI_SUBDOMAIN_EDIT = "https://freedns.afraid.org/subdomain/edit.php?data_id="
 +const URI_LOGOUT = "https://freedns.afraid.org/logout/"
 +const URI_DELETE_RECORD = "https://freedns.afraid.org/subdomain/delete2.php?data_id[]=%s&submit=delete%%20selected"
 +
 +func LogInfo(Mesg string) {
- 	// fmt.Println(Mesg)
++	//fmt.Println(Mesg)
 +	logf.V(logf.InfoLevel).Info(Mesg)
 +}
 +
 +func LogDebug(Mesg string) {
- 	// fmt.Println(Mesg)
++	//fmt.Println(Mesg)
 +	logf.V(logf.DebugLevel).Info(Mesg)
 +}
 +
 +func GetDomainFromZone(Zone string) string {
 +	_segs := strings.Split(strings.TrimSuffix(Zone, "."), ".")
 +	_segs = _segs[len(_segs)-2:]
 +	return strings.Join(_segs, ".")
 +}
 +
 +func _HttpRequest(method string, url string, PostData url.Values, ExCookie *http.Cookie) (*http.Response, string, error) {
 +	client := http.Client{
 +		CheckRedirect: func(req *http.Request, via []*http.Request) error {
 +			return http.ErrUseLastResponse
 +		},
 +	}
 +
 +	var req *http.Request
 +	var err error
 +
 +	if method == "GET" {
 +		req, err = http.NewRequest(method, url, nil)
 +	} else if method == "POST" {
 +		req, err = http.NewRequest(method, url, strings.NewReader(PostData.Encode()))
 +		req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
 +	} else {
 +		return nil, "", errors.New("Method + \"" + method + "\" is not supported")
 +	}
 +
 +	if err != nil {
 +		return nil, "", err
 +	}
 +
 +	req.Header.Set("User-Agent", "github.com/tgckpg/cert-manager-webhook-freedns (2022.03.15)")
 +
 +	if ExCookie != nil {
 +		req.AddCookie(ExCookie)
 +	}
 +
 +	resp, err := client.Do(req)
 +	if err != nil {
 +		return resp, "", err
 +	}
 +
 +	respData, err := ioutil.ReadAll(resp.Body)
 +	resp.Body.Close()
 +
 +	if err != nil {
 +		return resp, "", err
 +	}
 +
 +	return resp, string(respData), nil
 +}
 +
 +func (dnsObj *FreeDNS) Login(Username string, Password string) error {
 +
 +	authData := url.Values{}
 +	authData.Set("username", Username)
 +	authData.Set("password", Password)
 +	authData.Set("submit", "Login")
 +	authData.Set("action", "auth")
 +
 +	resp, respString, err := _HttpRequest("POST", URI_LOGIN, authData, nil)
 +	if err != nil {
 +		return err
 +	}
 +
 +	if strings.Contains(respString, "Invalid UserID/Pass") {
 +		return errors.New("Invalid UserID/Pass")
 +	}
 +
 +	for _, cookie := range resp.Cookies() {
 +		if cookie.Name == "dns_cookie" {
 +			dnsObj.AuthCookie = cookie
 +			dnsObj.LoggedOut = false
 +		}
 +	}
 +
 +	return nil
 +}
 +
 +func (dnsObj *FreeDNS) Logout() error {
 +	if dnsObj.LoggedOut {
 +		return nil
 +	}
 +
 +	_, _, err := _HttpRequest("GET", URI_LOGOUT, nil, dnsObj.AuthCookie)
 +	if err != nil {
 +		return err
 +	}
 +
 +	dnsObj.LoggedOut = true
 +	return nil
 +}
 +
 +func (dnsObj *FreeDNS) SelectDomain(DomainName string) error {
 +	if dnsObj.AuthCookie == nil {
 +		return errors.New("Not logged in")
 +	}
 +
 +	resp, respStr, err := _HttpRequest("GET", URI_DOMAIN, nil, dnsObj.AuthCookie)
 +	if err != nil {
 +		return err
 +	}
 +
 +	if resp.StatusCode == 302 {
 +		return errors.New("dns_cookie maybe expired")
 +	}
 +
 +	htmlTokens := html.NewTokenizer(strings.NewReader(respStr))
 +
 +	inBold := false
 +	lookForA := false
 +	dnsObj.DomainId = ""
 +
 +	// Begin search for domain id
 +loop:
 +	for {
 +		tt := htmlTokens.Next()
 +		switch tt {
 +		case html.ErrorToken:
 +			break loop
 +		case html.TextToken:
 +			if inBold && strings.TrimSpace(htmlTokens.Token().Data) == DomainName {
 +				LogInfo("Found " + DomainName + ", looking for domain id")
 +				lookForA = true
 +			}
 +			// The [Manage] anchor is next to the bold tag
 +			//    <b>DOMAIN_NAME</b> <a href="">[Manage]</a>
 +		case html.StartTagToken:
 +			_t, hasAttr := htmlTokens.TagName()
 +			tagName := string(_t)
 +			inBold = tagName == "b"
 +			if lookForA && tagName == "a" && hasAttr {
 +				for {
 +					attrKey, attrValue, moreAttr := htmlTokens.TagAttr()
 +					_href := string(attrValue)
 +					if string(attrKey) == "href" && strings.HasPrefix(_href, "/subdomain/?limit=") {
 +						dnsObj.DomainId = strings.TrimPrefix(_href, "/subdomain/?limit=")
 +						LogDebug(fmt.Sprintf("Domain id for \"%s\" is %s\n", DomainName, dnsObj.DomainId))
 +						break loop
 +					}
 +					if !moreAttr {
 +						break
 +					}
 +				}
 +			}
 +		}
 +	}
 +
 +	if dnsObj.DomainId == "" {
 +		return errors.New(fmt.Sprintf("Unable to locate domain id for \"%s\" under /domain/ page", DomainName))
 +	}
 +
 +	return nil
 +}
 +
 +func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address string, Wildcard bool, ttl string) error {
 +	if dnsObj.DomainId == "" {
 +		return errors.New("No domain selected")
 +	}
 +	recordData := url.Values{}
 +	recordData.Set("type", RecordType)
 +	recordData.Set("domain_id", dnsObj.DomainId)
 +	recordData.Set("subdomain", Subdomain)
 +	recordData.Set("address", Address)
 +	recordData.Set("send", "Save!")
 +	if Wildcard {
 +		recordData.Set("wildcard", "1")
 +	}
 +
 +	resp, respStr, err := _HttpRequest("POST", URI_ADD_RECORD, recordData, dnsObj.AuthCookie)
 +	if err != nil {
 +		return err
 +	}
 +
 +	if resp.StatusCode != 302 {
 +
 +		// Record already exists, treat this as success
 +		if strings.Contains(respStr, "already have another already existent") {
 +			LogInfo("Record already exists")
 +			return nil
 +		}
 +
 +		// Try get a sense of the problem
 +		var errorMesgs []string
 +		lookForNextEl := 0
 +		lookForText := false
 +		_strBuffer := ""
 +		htmlTokens := html.NewTokenizer(strings.NewReader(respStr))
 +	loop:
 +		for {
 +			tt := htmlTokens.Next()
 +			switch tt {
 +			case html.ErrorToken:
 +				break loop
 +			case html.TextToken:
 +				_text := strings.TrimSpace(string(htmlTokens.Text()))
 +				// Search for the "1 error" / "N errors" message
 +				if strings.HasSuffix(_text, "error") || strings.HasSuffix(_text, "errors") {
 +					_text = strings.TrimSpace(strings.TrimSuffix(strings.TrimSuffix(_text, "s"), "error"))
 +					_n, _ := strconv.ParseInt(_text, 10, 8)
 +					// + 1 because we are already inside a font tag
 +					// The next closing </font> is ourself
 +					lookForNextEl = int(_n) + 1
 +				} else if lookForText {
 +					_strBuffer = _strBuffer + _text
 +				}
 +
 +			case html.StartTagToken:
 +				_t, _ := htmlTokens.TagName()
 +				tagName := string(_t)
 +				if tagName == "font" && 0 < lookForNextEl {
 +					lookForText = true
 +					_strBuffer = ""
 +				}
 +			case html.EndTagToken:
 +				_t, _ := htmlTokens.TagName()
 +				tagName := string(_t)
 +				if tagName == "font" && 0 < lookForNextEl {
 +					lookForText = false
 +					errorMesgs = append(errorMesgs, strings.TrimSpace(_strBuffer))
 +					lookForNextEl--
 +				}
 +			}
 +		}
 +
 +		if 0 < len(errorMesgs) {
 +			return errors.New(strings.Join(errorMesgs, ", "))
 +		}
 +
 +		return errors.New("Unknown error while submitting record")
 +	}
 +
 +	_Location, err := resp.Location()
 +	if err != nil {
 +		return err
 +	}
 +
 +	if strings.HasPrefix(_Location.Path, "/zc.php") {
 +		LogDebug("Error on AddRecord: Cookie expired")
 +		return errors.New("dns_cookie maybe expired")
 +	}
 +
 +	return nil
 +}
 +
 +func (dnsObj *FreeDNS) DeleteRecord(RecordId string) error {
 +	resp, _, err := _HttpRequest("GET", fmt.Sprintf(URI_DELETE_RECORD, RecordId), nil, dnsObj.AuthCookie)
 +	if err != nil {
 +		return err
 +	}
 +
 +	if resp.StatusCode != 302 {
 +		return errors.New("Unexpected " + fmt.Sprint(resp.StatusCode) + " from remote while deleting record")
 +	}
 +
 +	_Location, err := resp.Location()
 +	if err != nil {
 +		return err
 +	}
 +
 +	if strings.HasPrefix(_Location.Path, "/zc.php") {
 +		return errors.New("dns_cookie maybe expired")
 +	}
 +
 +	return nil
 +}
 +
 +func (dnsObj *FreeDNS) FindRecord(Subdomain string, RecordType string, Address string) (string, error) {
 +	if dnsObj.DomainId == "" {
 +		return "", errors.New("No domain selected")
 +	}
 +
 +	resp, respStr, err := _HttpRequest("GET", URI_SUBDOMAIN+dnsObj.DomainId, nil, dnsObj.AuthCookie)
 +	if err != nil {
 +		return "", err
 +	}
 +
 +	if resp.StatusCode == 302 {
 +		return "", errors.New("dns_cookie maybe expired")
 +	}
 +
 +	var DeepSearchCandidates []string
 +	CurrRecordId := ""
 +	CurrRecordType := ""
 +	CurrRecordAddr := ""
 +	CurrTagName := ""
 +	lookForNextEl := 0
 +
 +	htmlTokens := html.NewTokenizer(strings.NewReader(respStr))
 +loop:
 +	for {
 +		tt := htmlTokens.Next()
 +		switch tt {
 +		case html.ErrorToken:
 +			break loop
 +		case html.TextToken:
 +			if CurrTagName == "a" && lookForNextEl == 1 && CurrRecordAddr == "" {
 +				CurrRecordAddr = strings.TrimSpace(string(htmlTokens.Text()))
 +			} else if CurrTagName == "td" {
 +				if lookForNextEl == 1 {
 +					CurrRecordType = string(htmlTokens.Text())
 +					lookForNextEl = 2
 +				} else if lookForNextEl == 2 {
 +					_Addr := string(htmlTokens.Text())
 +					if CurrRecordType == RecordType && CurrRecordAddr == Subdomain {
 +						if _Addr == Address {
 +							return CurrRecordId, nil
 +						} else if strings.HasSuffix(_Addr, "...") && strings.HasPrefix(Address, strings.TrimSuffix(_Addr, "...")) {
 +							DeepSearchCandidates = append(DeepSearchCandidates, CurrRecordId)
 +						}
 +					}
 +					lookForNextEl = 0
 +				}
 +			}
 +		/** Each record is displayed with the following structure
 +		 *   <td bgcolor="#eeeeee">
 +		 *       <a href="edit.php?data_id=0000000">
 +		 *          [DOMAIN_NAME]
 +		 *       </a> (<b><font color="blue">G</font></b>)
 +		 *   </td>
 +		 *   <td bgcolor="#eeeeee">TXT</td>
 +		 *   <td bgcolor="#eeeeee">"google-site-verification=truncated_text...</td>
 +		 */
 +		case html.StartTagToken:
 +			_t, hasAttr := htmlTokens.TagName()
 +			CurrTagName = string(_t)
 +			if CurrTagName == "a" && hasAttr {
 +				for {
 +					attrKey, attrValue, moreAttr := htmlTokens.TagAttr()
 +					_href := string(attrValue)
 +					if string(attrKey) == "href" && strings.Contains(_href, "edit.php?data_id=") {
 +						lookForNextEl = 1
 +						CurrRecordAddr = ""
 +						CurrRecordId = strings.TrimPrefix(_href, "edit.php?data_id=")
 +						break
 +					}
 +					if !moreAttr {
 +						break
 +					}
 +				}
 +			}
 +
 +		}
 +	}
 +
 +	// Begin deep search for truncated records
 +	htmlAddr := strings.ReplaceAll(html.EscapeString(Address), "&#34;", "&quot;")
 +	for _, RecordId := range DeepSearchCandidates {
 +		LogDebug("Searching in " + RecordId)
 +		_, respStr, err := _HttpRequest("GET", URI_SUBDOMAIN_EDIT+RecordId, nil, dnsObj.AuthCookie)
 +		if err != nil {
 +			continue
 +		}
 +
 +		if strings.Contains(respStr, htmlAddr) {
 +			return RecordId, nil
 +		}
 +	}
 +
 +	return "", errors.New("No such record")
 +}
diff --cc go.mod
index df9c028,83744cb..b9b94c0
--- a/go.mod
+++ b/go.mod
@@@ -1,13 -1,13 +1,13 @@@
 -module github.com/cert-manager/webhook-example
 +module github.com/cert-manager/webhook-freedns
  
- go 1.17
+ go 1.22.0
  
  require (
- 	github.com/jetstack/cert-manager v1.7.1
- 	github.com/miekg/dns v1.1.34
- 	github.com/stretchr/testify v1.7.0
- 	k8s.io/apiextensions-apiserver v0.23.1
- 	k8s.io/client-go v0.23.1
+ 	github.com/cert-manager/cert-manager v1.15.1
+ 	github.com/miekg/dns v1.1.61
+ 	github.com/stretchr/testify v1.9.0
+ 	k8s.io/apiextensions-apiserver v0.30.2
+ 	k8s.io/client-go v0.30.2
  )
  
  require (
diff --cc main.go
index 4499da2,969e6d2..118abab
--- a/main.go
+++ b/main.go
@@@ -5,16 -4,12 +5,16 @@@ import 
  	"encoding/json"
  	"fmt"
  	"os"
 +	"strings"
  
  	extapi "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 +	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 +	"k8s.io/client-go/kubernetes"
  	"k8s.io/client-go/rest"
  
 +	"github.com/cert-manager/webhook-freedns/freedns"
- 	"github.com/jetstack/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
- 	"github.com/jetstack/cert-manager/pkg/acme/webhook/cmd"
+ 	"github.com/cert-manager/cert-manager/pkg/acme/webhook/apis/acme/v1alpha1"
+ 	"github.com/cert-manager/cert-manager/pkg/acme/webhook/cmd"
  )
  
  var GroupName = os.Getenv("GROUP_NAME")
diff --cc main_test.go
index a9df41b,1d7d5ff..924fcfd
--- a/main_test.go
+++ b/main_test.go
@@@ -4,11 -4,13 +4,11 @@@ import 
  	"os"
  	"testing"
  
- 	"github.com/jetstack/cert-manager/test/acme/dns"
+ 	acmetest "github.com/cert-manager/cert-manager/test/acme"
 -
 -	"github.com/cert-manager/webhook-example/example"
  )
  
  var (
--	zone = os.Getenv("TEST_ZONE_NAME")
++	zone = os.Getenv("FREEDNS_DOMAIN")
  )
  
  func TestRunsSuite(t *testing.T) {
@@@ -17,12 -19,23 +17,11 @@@
  	// ChallengeRequest passed as part of the test cases.
  	//
  
--	// Uncomment the below fixture when implementing your custom DNS provider
- 	fixture := dns.NewFixture(&customDNSProviderSolver{},
- 		dns.SetResolvedZone(zone),
- 		dns.SetAllowAmbientCredentials(false),
- 		dns.SetManifestPath("testdata/freedns-solver"),
 -	//fixture := acmetest.NewFixture(&customDNSProviderSolver{},
 -	//	acmetest.SetResolvedZone(zone),
 -	//	acmetest.SetAllowAmbientCredentials(false),
 -	//	acmetest.SetManifestPath("testdata/my-custom-solver"),
 -	//	acmetest.SetBinariesPath("_test/kubebuilder/bin"),
 -	//)
 -	solver := example.New("59351")
 -	fixture := acmetest.NewFixture(solver,
 -		acmetest.SetResolvedZone("example.com."),
 -		acmetest.SetManifestPath("testdata/my-custom-solver"),
 -		acmetest.SetDNSServer("127.0.0.1:59351"),
++	fixture := acmetest.NewFixture(&customDNSProviderSolver{},
++		acmetest.SetResolvedZone(zone),
++		acmetest.SetManifestPath("testdata/freedns-solver"),
+ 		acmetest.SetUseAuthoritative(false),
  	)
- 	fixture.RunConformance(t)
- 
 -	//need to uncomment and  RunConformance delete runBasic and runExtended once https://github.com/cert-manager/cert-manager/pull/4835 is merged
 -	//fixture.RunConformance(t)
+ 	fixture.RunBasic(t)
+ 	fixture.RunExtended(t)
 -
  }