commit d22266fd9ae0be3ffdab8cd44cf5b8df21067665
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2024-10-30T22:00:24Z |
| subject | Merge 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), """, """)
+ 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)
-
}