Full Code of go-acme/lego for AI

master 830768fe2764 cached
2074 files
5.0 MB
1.4M tokens
8972 symbols
1 requests
Download .txt
Showing preview only (5,672K chars total). Download the full file or copy to clipboard to get everything.
Repository: go-acme/lego
Branch: master
Commit: 830768fe2764
Files: 2074
Total size: 5.0 MB

Directory structure:
gitextract_89wpnizv/

├── .dockerignore
├── .gitattributes
├── .gitcookies.enc
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── new_dns_provider.yml
│   ├── PULL_REQUEST_TEMPLATE/
│   │   └── mnp.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── documentation.yml
│       ├── go-cross.yml
│       ├── pr.yml
│       └── release.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── acme/
│   ├── api/
│   │   ├── account.go
│   │   ├── account_test.go
│   │   ├── api.go
│   │   ├── authorization.go
│   │   ├── certificate.go
│   │   ├── certificate_test.go
│   │   ├── challenge.go
│   │   ├── identifier.go
│   │   ├── identifier_test.go
│   │   ├── internal/
│   │   │   ├── nonces/
│   │   │   │   ├── nonce_manager.go
│   │   │   │   └── nonce_manager_test.go
│   │   │   ├── secure/
│   │   │   │   ├── jws.go
│   │   │   │   └── jws_test.go
│   │   │   └── sender/
│   │   │       ├── sender.go
│   │   │       ├── sender_test.go
│   │   │       └── useragent.go
│   │   ├── order.go
│   │   ├── order_test.go
│   │   ├── renewal.go
│   │   ├── service.go
│   │   └── service_test.go
│   ├── commons.go
│   └── errors.go
├── buildx.Dockerfile
├── certcrypto/
│   ├── crypto.go
│   └── crypto_test.go
├── certificate/
│   ├── authorization.go
│   ├── certificates.go
│   ├── certificates_test.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── renewal.go
│   └── renewal_test.go
├── challenge/
│   ├── challenges.go
│   ├── dns01/
│   │   ├── cname.go
│   │   ├── cname_test.go
│   │   ├── dns_challenge.go
│   │   ├── dns_challenge_manual.go
│   │   ├── dns_challenge_test.go
│   │   ├── domain.go
│   │   ├── domain_test.go
│   │   ├── fixtures/
│   │   │   └── resolv.conf.1
│   │   ├── fqdn.go
│   │   ├── fqdn_test.go
│   │   ├── mock_test.go
│   │   ├── nameserver.go
│   │   ├── nameserver_test.go
│   │   ├── nameserver_unix.go
│   │   ├── nameserver_windows.go
│   │   ├── precheck.go
│   │   └── precheck_test.go
│   ├── http01/
│   │   ├── domain_matcher.go
│   │   ├── domain_matcher_test.go
│   │   ├── http_challenge.go
│   │   ├── http_challenge_server.go
│   │   └── http_challenge_test.go
│   ├── provider.go
│   ├── resolver/
│   │   ├── errors.go
│   │   ├── errors_test.go
│   │   ├── prober.go
│   │   ├── prober_mock_test.go
│   │   ├── prober_test.go
│   │   ├── solver_manager.go
│   │   └── solver_manager_test.go
│   └── tlsalpn01/
│       ├── tls_alpn_challenge.go
│       ├── tls_alpn_challenge_server.go
│       └── tls_alpn_challenge_test.go
├── cmd/
│   ├── account.go
│   ├── accounts_storage.go
│   ├── certs_storage.go
│   ├── certs_storage_test.go
│   ├── cmd.go
│   ├── cmd_before.go
│   ├── cmd_dnshelp.go
│   ├── cmd_list.go
│   ├── cmd_renew.go
│   ├── cmd_renew_test.go
│   ├── cmd_revoke.go
│   ├── cmd_run.go
│   ├── flags.go
│   ├── hook.go
│   ├── hook_test.go
│   ├── lego/
│   │   ├── main.go
│   │   └── zz_gen_version.go
│   ├── setup.go
│   ├── setup_challenges.go
│   ├── testdata/
│   │   ├── sleeping_beauty.sh
│   │   └── sleepy.sh
│   └── zz_gen_cmd_dnshelp.go
├── docs/
│   ├── .gitignore
│   ├── Makefile
│   ├── archetypes/
│   │   └── default.md
│   ├── content/
│   │   ├── _index.md
│   │   ├── dns/
│   │   │   ├── _index.md
│   │   │   ├── zz_gen_acme-dns.md
│   │   │   ├── zz_gen_active24.md
│   │   │   ├── zz_gen_alidns.md
│   │   │   ├── zz_gen_aliesa.md
│   │   │   ├── zz_gen_allinkl.md
│   │   │   ├── zz_gen_alwaysdata.md
│   │   │   ├── zz_gen_anexia.md
│   │   │   ├── zz_gen_artfiles.md
│   │   │   ├── zz_gen_arvancloud.md
│   │   │   ├── zz_gen_auroradns.md
│   │   │   ├── zz_gen_autodns.md
│   │   │   ├── zz_gen_axelname.md
│   │   │   ├── zz_gen_azion.md
│   │   │   ├── zz_gen_azure.md
│   │   │   ├── zz_gen_azuredns.md
│   │   │   ├── zz_gen_baiducloud.md
│   │   │   ├── zz_gen_beget.md
│   │   │   ├── zz_gen_binarylane.md
│   │   │   ├── zz_gen_bindman.md
│   │   │   ├── zz_gen_bluecat.md
│   │   │   ├── zz_gen_bluecatv2.md
│   │   │   ├── zz_gen_bookmyname.md
│   │   │   ├── zz_gen_brandit.md
│   │   │   ├── zz_gen_bunny.md
│   │   │   ├── zz_gen_checkdomain.md
│   │   │   ├── zz_gen_civo.md
│   │   │   ├── zz_gen_clouddns.md
│   │   │   ├── zz_gen_cloudflare.md
│   │   │   ├── zz_gen_cloudns.md
│   │   │   ├── zz_gen_cloudru.md
│   │   │   ├── zz_gen_cloudxns.md
│   │   │   ├── zz_gen_com35.md
│   │   │   ├── zz_gen_conoha.md
│   │   │   ├── zz_gen_conohav3.md
│   │   │   ├── zz_gen_constellix.md
│   │   │   ├── zz_gen_corenetworks.md
│   │   │   ├── zz_gen_cpanel.md
│   │   │   ├── zz_gen_czechia.md
│   │   │   ├── zz_gen_ddnss.md
│   │   │   ├── zz_gen_derak.md
│   │   │   ├── zz_gen_desec.md
│   │   │   ├── zz_gen_designate.md
│   │   │   ├── zz_gen_digitalocean.md
│   │   │   ├── zz_gen_directadmin.md
│   │   │   ├── zz_gen_dnsexit.md
│   │   │   ├── zz_gen_dnshomede.md
│   │   │   ├── zz_gen_dnsimple.md
│   │   │   ├── zz_gen_dnsmadeeasy.md
│   │   │   ├── zz_gen_dnspod.md
│   │   │   ├── zz_gen_dode.md
│   │   │   ├── zz_gen_domeneshop.md
│   │   │   ├── zz_gen_dreamhost.md
│   │   │   ├── zz_gen_duckdns.md
│   │   │   ├── zz_gen_dyn.md
│   │   │   ├── zz_gen_dyndnsfree.md
│   │   │   ├── zz_gen_dynu.md
│   │   │   ├── zz_gen_easydns.md
│   │   │   ├── zz_gen_edgecenter.md
│   │   │   ├── zz_gen_edgedns.md
│   │   │   ├── zz_gen_edgeone.md
│   │   │   ├── zz_gen_efficientip.md
│   │   │   ├── zz_gen_epik.md
│   │   │   ├── zz_gen_eurodns.md
│   │   │   ├── zz_gen_excedo.md
│   │   │   ├── zz_gen_exec.md
│   │   │   ├── zz_gen_exoscale.md
│   │   │   ├── zz_gen_f5xc.md
│   │   │   ├── zz_gen_freemyip.md
│   │   │   ├── zz_gen_gandi.md
│   │   │   ├── zz_gen_gandiv5.md
│   │   │   ├── zz_gen_gcloud.md
│   │   │   ├── zz_gen_gcore.md
│   │   │   ├── zz_gen_gigahostno.md
│   │   │   ├── zz_gen_glesys.md
│   │   │   ├── zz_gen_godaddy.md
│   │   │   ├── zz_gen_googledomains.md
│   │   │   ├── zz_gen_gravity.md
│   │   │   ├── zz_gen_hetzner.md
│   │   │   ├── zz_gen_hostingde.md
│   │   │   ├── zz_gen_hostinger.md
│   │   │   ├── zz_gen_hostingnl.md
│   │   │   ├── zz_gen_hosttech.md
│   │   │   ├── zz_gen_httpnet.md
│   │   │   ├── zz_gen_httpreq.md
│   │   │   ├── zz_gen_huaweicloud.md
│   │   │   ├── zz_gen_hurricane.md
│   │   │   ├── zz_gen_hyperone.md
│   │   │   ├── zz_gen_ibmcloud.md
│   │   │   ├── zz_gen_iij.md
│   │   │   ├── zz_gen_iijdpf.md
│   │   │   ├── zz_gen_infoblox.md
│   │   │   ├── zz_gen_infomaniak.md
│   │   │   ├── zz_gen_internetbs.md
│   │   │   ├── zz_gen_inwx.md
│   │   │   ├── zz_gen_ionos.md
│   │   │   ├── zz_gen_ionoscloud.md
│   │   │   ├── zz_gen_ipv64.md
│   │   │   ├── zz_gen_ispconfig.md
│   │   │   ├── zz_gen_ispconfigddns.md
│   │   │   ├── zz_gen_iwantmyname.md
│   │   │   ├── zz_gen_jdcloud.md
│   │   │   ├── zz_gen_joker.md
│   │   │   ├── zz_gen_keyhelp.md
│   │   │   ├── zz_gen_leaseweb.md
│   │   │   ├── zz_gen_liara.md
│   │   │   ├── zz_gen_lightsail.md
│   │   │   ├── zz_gen_limacity.md
│   │   │   ├── zz_gen_linode.md
│   │   │   ├── zz_gen_liquidweb.md
│   │   │   ├── zz_gen_loopia.md
│   │   │   ├── zz_gen_luadns.md
│   │   │   ├── zz_gen_mailinabox.md
│   │   │   ├── zz_gen_manageengine.md
│   │   │   ├── zz_gen_manual.md
│   │   │   ├── zz_gen_metaname.md
│   │   │   ├── zz_gen_metaregistrar.md
│   │   │   ├── zz_gen_mijnhost.md
│   │   │   ├── zz_gen_mittwald.md
│   │   │   ├── zz_gen_myaddr.md
│   │   │   ├── zz_gen_mydnsjp.md
│   │   │   ├── zz_gen_mythicbeasts.md
│   │   │   ├── zz_gen_namecheap.md
│   │   │   ├── zz_gen_namedotcom.md
│   │   │   ├── zz_gen_namesilo.md
│   │   │   ├── zz_gen_namesurfer.md
│   │   │   ├── zz_gen_nearlyfreespeech.md
│   │   │   ├── zz_gen_neodigit.md
│   │   │   ├── zz_gen_netcup.md
│   │   │   ├── zz_gen_netlify.md
│   │   │   ├── zz_gen_nicmanager.md
│   │   │   ├── zz_gen_nicru.md
│   │   │   ├── zz_gen_nifcloud.md
│   │   │   ├── zz_gen_njalla.md
│   │   │   ├── zz_gen_nodion.md
│   │   │   ├── zz_gen_ns1.md
│   │   │   ├── zz_gen_octenium.md
│   │   │   ├── zz_gen_oraclecloud.md
│   │   │   ├── zz_gen_otc.md
│   │   │   ├── zz_gen_ovh.md
│   │   │   ├── zz_gen_pdns.md
│   │   │   ├── zz_gen_plesk.md
│   │   │   ├── zz_gen_porkbun.md
│   │   │   ├── zz_gen_rackspace.md
│   │   │   ├── zz_gen_rainyun.md
│   │   │   ├── zz_gen_rcodezero.md
│   │   │   ├── zz_gen_regfish.md
│   │   │   ├── zz_gen_regru.md
│   │   │   ├── zz_gen_rfc2136.md
│   │   │   ├── zz_gen_rimuhosting.md
│   │   │   ├── zz_gen_route53.md
│   │   │   ├── zz_gen_safedns.md
│   │   │   ├── zz_gen_sakuracloud.md
│   │   │   ├── zz_gen_scaleway.md
│   │   │   ├── zz_gen_selectel.md
│   │   │   ├── zz_gen_selectelv2.md
│   │   │   ├── zz_gen_selfhostde.md
│   │   │   ├── zz_gen_servercow.md
│   │   │   ├── zz_gen_shellrent.md
│   │   │   ├── zz_gen_simply.md
│   │   │   ├── zz_gen_sonic.md
│   │   │   ├── zz_gen_spaceship.md
│   │   │   ├── zz_gen_stackpath.md
│   │   │   ├── zz_gen_syse.md
│   │   │   ├── zz_gen_technitium.md
│   │   │   ├── zz_gen_tencentcloud.md
│   │   │   ├── zz_gen_timewebcloud.md
│   │   │   ├── zz_gen_todaynic.md
│   │   │   ├── zz_gen_transip.md
│   │   │   ├── zz_gen_ultradns.md
│   │   │   ├── zz_gen_uniteddomains.md
│   │   │   ├── zz_gen_variomedia.md
│   │   │   ├── zz_gen_vegadns.md
│   │   │   ├── zz_gen_vercel.md
│   │   │   ├── zz_gen_versio.md
│   │   │   ├── zz_gen_vinyldns.md
│   │   │   ├── zz_gen_virtualname.md
│   │   │   ├── zz_gen_vkcloud.md
│   │   │   ├── zz_gen_volcengine.md
│   │   │   ├── zz_gen_vscale.md
│   │   │   ├── zz_gen_vultr.md
│   │   │   ├── zz_gen_webnames.md
│   │   │   ├── zz_gen_webnamesca.md
│   │   │   ├── zz_gen_websupport.md
│   │   │   ├── zz_gen_wedos.md
│   │   │   ├── zz_gen_westcn.md
│   │   │   ├── zz_gen_yandex.md
│   │   │   ├── zz_gen_yandex360.md
│   │   │   ├── zz_gen_yandexcloud.md
│   │   │   ├── zz_gen_zoneedit.md
│   │   │   ├── zz_gen_zoneee.md
│   │   │   └── zz_gen_zonomi.md
│   │   ├── installation/
│   │   │   └── _index.md
│   │   └── usage/
│   │       ├── _index.md
│   │       ├── cli/
│   │       │   ├── General-Instructions.md
│   │       │   ├── Obtain-a-Certificate.md
│   │       │   ├── Options.md
│   │       │   ├── Renew-a-Certificate.md
│   │       │   ├── _index.md
│   │       │   └── examples.md
│   │       └── library/
│   │           ├── Writing-a-Challenge-Solver.md
│   │           └── _index.md
│   ├── data/
│   │   └── zz_cli_help.toml
│   ├── go.mod
│   ├── go.sum
│   ├── hugo.toml
│   ├── layouts/
│   │   ├── partials/
│   │   │   └── logo.html
│   │   └── shortcodes/
│   │       ├── clihelp.html
│   │       └── tableofdnsproviders.html
│   └── static/
│       ├── .nojekyll
│       └── css/
│           └── theme-custom.css
├── e2e/
│   ├── challenges_test.go
│   ├── dnschallenge/
│   │   └── dns_challenges_test.go
│   ├── fixtures/
│   │   ├── certs/
│   │   │   ├── README.md
│   │   │   ├── localhost/
│   │   │   │   ├── README.md
│   │   │   │   ├── cert.pem
│   │   │   │   └── key.pem
│   │   │   ├── pebble.minica.key.pem
│   │   │   └── pebble.minica.pem
│   │   ├── pebble-config-dns.json
│   │   ├── pebble-config.json
│   │   └── update-dns.sh
│   ├── loader/
│   │   └── loader.go
│   └── readme.md
├── go.mod
├── go.sum
├── internal/
│   ├── clihelp/
│   │   └── generator.go
│   ├── dns/
│   │   ├── descriptors/
│   │   │   └── descriptors.go
│   │   ├── docs/
│   │   │   ├── generator.go
│   │   │   └── templates/
│   │   │       ├── dns.go.tmpl
│   │   │       ├── dns.md.tmpl
│   │   │       └── readme.md.tmpl
│   │   └── providers/
│   │       ├── dns_providers.go.tmpl
│   │       └── generator.go
│   └── releaser/
│       ├── generator.go
│       ├── releaser.go
│       └── templates/
│           ├── dns.go.tmpl
│           ├── sender.go.tmpl
│           └── version.go.tmpl
├── lego/
│   ├── client.go
│   ├── client_config.go
│   └── client_test.go
├── log/
│   └── logger.go
├── platform/
│   ├── config/
│   │   └── env/
│   │       ├── env.go
│   │       └── env_test.go
│   ├── tester/
│   │   ├── api.go
│   │   ├── dnsmock/
│   │   │   ├── dnsmock.go
│   │   │   ├── dnsmock_test.go
│   │   │   ├── handlers.go
│   │   │   └── handlers_test.go
│   │   ├── env.go
│   │   ├── env_test.go
│   │   └── servermock/
│   │       ├── builder.go
│   │       ├── handler_dump.go
│   │       ├── handler_file.go
│   │       ├── handler_json.go
│   │       ├── handler_noop.go
│   │       ├── handler_raw.go
│   │       ├── link_form.go
│   │       ├── link_headers.go
│   │       ├── link_query.go
│   │       ├── link_request_body.go
│   │       └── link_request_body_json.go
│   └── wait/
│       ├── wait.go
│       └── wait_test.go
├── providers/
│   ├── dns/
│   │   ├── acmedns/
│   │   │   ├── acmedns.go
│   │   │   ├── acmedns.toml
│   │   │   ├── acmedns_test.go
│   │   │   ├── internal/
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── fetch-request.json
│   │   │   │   │   ├── fetch.json
│   │   │   │   │   └── fetch_all.json
│   │   │   │   ├── http_storage.go
│   │   │   │   ├── http_storage_test.go
│   │   │   │   └── readme.md
│   │   │   └── mock_test.go
│   │   ├── active24/
│   │   │   ├── active24.go
│   │   │   ├── active24.toml
│   │   │   └── active24_test.go
│   │   ├── alidns/
│   │   │   ├── alidns.go
│   │   │   ├── alidns.toml
│   │   │   └── alidns_test.go
│   │   ├── aliesa/
│   │   │   ├── aliesa.go
│   │   │   ├── aliesa.toml
│   │   │   └── aliesa_test.go
│   │   ├── allinkl/
│   │   │   ├── allinkl.go
│   │   │   ├── allinkl.toml
│   │   │   ├── allinkl_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_dns_settings-request.xml
│   │   │       │   ├── add_dns_settings.json
│   │   │       │   ├── add_dns_settings.xml
│   │   │       │   ├── auth-request.xml
│   │   │       │   ├── auth.xml
│   │   │       │   ├── auth_fault.xml
│   │   │       │   ├── delete_dns_settings-request.xml
│   │   │       │   ├── delete_dns_settings.json
│   │   │       │   ├── delete_dns_settings.xml
│   │   │       │   ├── flood_protection.xml
│   │   │       │   ├── get_dns_settings-request.xml
│   │   │       │   ├── get_dns_settings-zone_not_found.xml
│   │   │       │   ├── get_dns_settings-zone_syntax_incorrect.xml
│   │   │       │   ├── get_dns_settings.json
│   │   │       │   └── get_dns_settings.xml
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       ├── types.go
│   │   │       ├── types_api.go
│   │   │       └── types_auth.go
│   │   ├── alwaysdata/
│   │   │   ├── alwaysdata.go
│   │   │   ├── alwaysdata.toml
│   │   │   ├── alwaysdata_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains.json
│   │   │       │   ├── record_add-request.json
│   │   │       │   └── records.json
│   │   │       └── types.go
│   │   ├── anexia/
│   │   │   ├── anexia.go
│   │   │   ├── anexia.toml
│   │   │   ├── anexia_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── create_record_incomplete.json
│   │   │       │   ├── error.json
│   │   │       │   └── get_zone.json
│   │   │       └── types.go
│   │   ├── artfiles/
│   │   │   ├── artfiles.go
│   │   │   ├── artfiles.toml
│   │   │   ├── artfiles_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains.txt
│   │   │       │   ├── get_dns.json
│   │   │       │   ├── set_dns.json
│   │   │       │   ├── txt_record-multiple.txt
│   │   │       │   └── txt_record.txt
│   │   │       ├── types.go
│   │   │       └── types_test.go
│   │   ├── arvancloud/
│   │   │   ├── arvancloud.go
│   │   │   ├── arvancloud.toml
│   │   │   ├── arvancloud_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_txt_record.json
│   │   │       │   └── get_txt_record.json
│   │   │       └── types.go
│   │   ├── auroradns/
│   │   │   ├── auroradns.go
│   │   │   ├── auroradns.toml
│   │   │   └── auroradns_test.go
│   │   ├── autodns/
│   │   │   ├── autodns.go
│   │   │   ├── autodns.toml
│   │   │   ├── autodns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── add_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── remove_record-request.json
│   │   │       │   └── remove_record.json
│   │   │       └── types.go
│   │   ├── axelname/
│   │   │   ├── axelname.go
│   │   │   ├── axelname.toml
│   │   │   ├── axelname_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── dns_add.json
│   │   │       │   ├── dns_add_error.json
│   │   │       │   ├── dns_delete.json
│   │   │       │   ├── dns_delete_error.json
│   │   │       │   ├── dns_list.json
│   │   │       │   └── dns_list_error.json
│   │   │       └── types.go
│   │   ├── azion/
│   │   │   ├── azion.go
│   │   │   ├── azion.toml
│   │   │   ├── azion_test.go
│   │   │   └── fixtures/
│   │   │       ├── zones.json
│   │   │       └── zones_empty.json
│   │   ├── azure/
│   │   │   ├── azure.go
│   │   │   ├── azure.toml
│   │   │   ├── azure_test.go
│   │   │   ├── private.go
│   │   │   └── public.go
│   │   ├── azuredns/
│   │   │   ├── azuredns.go
│   │   │   ├── azuredns.toml
│   │   │   ├── azuredns_test.go
│   │   │   ├── credentials.go
│   │   │   ├── oidc.go
│   │   │   ├── private.go
│   │   │   ├── public.go
│   │   │   ├── servicediscovery.go
│   │   │   └── servicediscovery_test.go
│   │   ├── baiducloud/
│   │   │   ├── baiducloud.go
│   │   │   ├── baiducloud.toml
│   │   │   └── baiducloud_test.go
│   │   ├── beget/
│   │   │   ├── beget.go
│   │   │   ├── beget.toml
│   │   │   ├── beget_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── answer_error.json
│   │   │       │   ├── changeRecords-doc.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getData-doc.json
│   │   │       │   ├── getData-real.json
│   │   │       │   ├── getData.json
│   │   │       │   └── getData_empty.json
│   │   │       └── types.go
│   │   ├── binarylane/
│   │   │   ├── binarylane.go
│   │   │   ├── binarylane.toml
│   │   │   ├── binarylane_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   └── error.json
│   │   │       └── types.go
│   │   ├── bindman/
│   │   │   ├── bindman.go
│   │   │   ├── bindman.toml
│   │   │   ├── bindman_test.go
│   │   │   └── fixtures/
│   │   │       ├── add_record-request.json
│   │   │       └── error.json
│   │   ├── bluecat/
│   │   │   ├── bluecat.go
│   │   │   ├── bluecat.toml
│   │   │   ├── bluecat_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── bluecatv2/
│   │   │   ├── bluecatv2.go
│   │   │   ├── bluecatv2.toml
│   │   │   ├── bluecatv2_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── deleteResourceRecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getZoneDeployments.json
│   │   │       │   ├── postSession-request.json
│   │   │       │   ├── postSession.json
│   │   │       │   ├── postZoneDeployment-request.json
│   │   │       │   ├── postZoneDeployment.json
│   │   │       │   ├── postZoneResourceRecord-request.json
│   │   │       │   ├── postZoneResourceRecord.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       ├── predicates.go
│   │   │       ├── predicates_test.go
│   │   │       └── types.go
│   │   ├── bookmyname/
│   │   │   ├── bookmyname.go
│   │   │   ├── bookmyname.toml
│   │   │   ├── bookmyname_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_success.txt
│   │   │       │   ├── error.txt
│   │   │       │   └── remove_success.txt
│   │   │       └── types.go
│   │   ├── brandit/
│   │   │   ├── brandit.go
│   │   │   ├── brandit.toml
│   │   │   ├── brandit_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   ├── delete-record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── list-records.json
│   │   │       │   └── status-domain.json
│   │   │       └── types.go
│   │   ├── bunny/
│   │   │   ├── bunny.go
│   │   │   ├── bunny.toml
│   │   │   └── bunny_test.go
│   │   ├── checkdomain/
│   │   │   ├── checkdomain.go
│   │   │   ├── checkdomain.toml
│   │   │   ├── checkdomain_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   └── delete_txt_record-request.json
│   │   │       └── types.go
│   │   ├── civo/
│   │   │   ├── civo.go
│   │   │   ├── civo.toml
│   │   │   ├── civo_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_dns_record-request.json
│   │   │       │   ├── create_dns_record.json
│   │   │       │   ├── delete_dns_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── list_dns_records.json
│   │   │       │   └── list_domain_names.json
│   │   │       └── types.go
│   │   ├── clouddns/
│   │   │   ├── clouddns.go
│   │   │   ├── clouddns.toml
│   │   │   ├── clouddns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domain-request.json
│   │   │       │   ├── domain_search-request.json
│   │   │       │   ├── domain_search.json
│   │   │       │   ├── login-request.json
│   │   │       │   ├── login.json
│   │   │       │   ├── publish-request.json
│   │   │       │   └── record_txt-request.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cloudflare/
│   │   │   ├── cloudflare.go
│   │   │   ├── cloudflare.toml
│   │   │   ├── cloudflare_test.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── delete_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zones.json
│   │   │   │   ├── options.go
│   │   │   │   └── types.go
│   │   │   └── wrapper.go
│   │   ├── cloudns/
│   │   │   ├── cloudns.go
│   │   │   ├── cloudns.toml
│   │   │   ├── cloudns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── cloudru/
│   │   │   ├── cloudru.go
│   │   │   ├── cloudru.toml
│   │   │   ├── cloudru_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── auth-error.json
│   │   │       │   ├── auth.json
│   │   │       │   ├── record.json
│   │   │       │   ├── records.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cloudxns/
│   │   │   ├── cloudxns.go
│   │   │   └── cloudxns.toml
│   │   ├── com35/
│   │   │   ├── com35.go
│   │   │   ├── com35.toml
│   │   │   └── com35_test.go
│   │   ├── conoha/
│   │   │   ├── conoha.go
│   │   │   ├── conoha.toml
│   │   │   ├── conoha_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-records_GET.json
│   │   │       │   ├── domains-records_POST.json
│   │   │       │   ├── domains_GET.json
│   │   │       │   ├── empty.json
│   │   │       │   └── tokens_POST.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── conohav3/
│   │   │   ├── conohav3.go
│   │   │   ├── conohav3.toml
│   │   │   ├── conohav3_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-records_GET.json
│   │   │       │   ├── domains-records_POST.json
│   │   │       │   ├── domains_GET.json
│   │   │       │   └── empty.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── constellix/
│   │   │   ├── constellix.go
│   │   │   ├── constellix.toml
│   │   │   ├── constellix_test.go
│   │   │   └── internal/
│   │   │       ├── auth.go
│   │   │       ├── auth_test.go
│   │   │       ├── client.go
│   │   │       ├── domains.go
│   │   │       ├── domains_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-GetAll.json
│   │   │       │   ├── domains-Search.json
│   │   │       │   ├── records-Create.json
│   │   │       │   ├── records-Get.json
│   │   │       │   ├── records-GetAll.json
│   │   │       │   └── records-Search.json
│   │   │       ├── txtrecords.go
│   │   │       ├── txtrecords_test.go
│   │   │       └── types.go
│   │   ├── corenetworks/
│   │   │   ├── corenetworks.go
│   │   │   ├── corenetworks.toml
│   │   │   ├── corenetworks_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── GetZoneDetails.json
│   │   │       │   ├── ListRecords.json
│   │   │       │   ├── ListZone.json
│   │   │       │   └── auth.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cpanel/
│   │   │   ├── cpanel.go
│   │   │   ├── cpanel.toml
│   │   │   ├── cpanel_test.go
│   │   │   └── internal/
│   │   │       ├── cpanel/
│   │   │       │   ├── client.go
│   │   │       │   ├── client_test.go
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── update-zone.json
│   │   │       │   │   ├── update-zone_error.json
│   │   │       │   │   ├── zone-info.json
│   │   │       │   │   └── zone-info_error.json
│   │   │       │   └── types.go
│   │   │       ├── shared/
│   │   │       │   └── types.go
│   │   │       └── whm/
│   │   │           ├── client.go
│   │   │           ├── client_test.go
│   │   │           ├── fixtures/
│   │   │           │   ├── update-zone.json
│   │   │           │   ├── update-zone_error.json
│   │   │           │   ├── zone-info.json
│   │   │           │   └── zone-info_error.json
│   │   │           └── types.go
│   │   ├── czechia/
│   │   │   ├── czechia.go
│   │   │   ├── czechia.toml
│   │   │   ├── czechia_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record-request.json
│   │   │       │   └── delete_txt_record-request.json
│   │   │       └── types.go
│   │   ├── ddnss/
│   │   │   ├── ddnss.go
│   │   │   ├── ddnss.toml
│   │   │   ├── ddnss_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.html
│   │   │       │   └── success.html
│   │   │       └── types.go
│   │   ├── derak/
│   │   │   ├── derak.go
│   │   │   ├── derak.toml
│   │   │   ├── derak_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.json
│   │   │       │   ├── record-DELETE.json
│   │   │       │   ├── record-GET.json
│   │   │       │   ├── record-PATCH.json
│   │   │       │   ├── record-PUT.json
│   │   │       │   ├── records-GET.json
│   │   │       │   └── service-cdn-zones.json
│   │   │       ├── readme.md
│   │   │       └── types.go
│   │   ├── desec/
│   │   │   ├── desec.go
│   │   │   ├── desec.toml
│   │   │   └── desec_test.go
│   │   ├── designate/
│   │   │   ├── designate.go
│   │   │   ├── designate.toml
│   │   │   └── designate_test.go
│   │   ├── digitalocean/
│   │   │   ├── digitalocean.go
│   │   │   ├── digitalocean.toml
│   │   │   ├── digitalocean_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   └── domains-records_POST.json
│   │   │       └── types.go
│   │   ├── directadmin/
│   │   │   ├── directadmin.go
│   │   │   ├── directadmin.toml
│   │   │   ├── directadmin_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── dns_providers_test.go
│   │   ├── dnsexit/
│   │   │   ├── dnsexit.go
│   │   │   ├── dnsexit.toml
│   │   │   ├── dnsexit_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── delete_record-request.json
│   │   │       │   ├── error.json
│   │   │       │   └── success.json
│   │   │       └── types.go
│   │   ├── dnshomede/
│   │   │   ├── dnshomede.go
│   │   │   ├── dnshomede.toml
│   │   │   ├── dnshomede_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── readme.md
│   │   ├── dnsimple/
│   │   │   ├── dnsimple.go
│   │   │   ├── dnsimple.toml
│   │   │   └── dnsimple_test.go
│   │   ├── dnsmadeeasy/
│   │   │   ├── dnsmadeeasy.go
│   │   │   ├── dnsmadeeasy.toml
│   │   │   ├── dnsmadeeasy_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   └── get_records.json
│   │   │       └── types.go
│   │   ├── dnspod/
│   │   │   ├── dnspod.go
│   │   │   ├── dnspod.toml
│   │   │   └── dnspod_test.go
│   │   ├── dode/
│   │   │   ├── dode.go
│   │   │   ├── dode.toml
│   │   │   ├── dode_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   └── success.json
│   │   │       └── types.go
│   │   ├── domeneshop/
│   │   │   ├── domeneshop.go
│   │   │   ├── domeneshop.toml
│   │   │   ├── domeneshop_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── getDnsRecords.json
│   │   │       │   └── getDomains.json
│   │   │       └── types.go
│   │   ├── dreamhost/
│   │   │   ├── dreamhost.go
│   │   │   ├── dreamhost.toml
│   │   │   ├── dreamhost_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── duckdns/
│   │   │   ├── duckdns.go
│   │   │   ├── duckdns.toml
│   │   │   ├── duckdns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── dyn/
│   │   │   ├── dyn.go
│   │   │   ├── dyn.toml
│   │   │   ├── dyn_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create-txt-record.json
│   │   │       │   ├── login.json
│   │   │       │   └── publish.json
│   │   │       ├── session.go
│   │   │       ├── session_test.go
│   │   │       └── types.go
│   │   ├── dyndnsfree/
│   │   │   ├── dyndnsfree.go
│   │   │   ├── dyndnsfree.toml
│   │   │   ├── dyndnsfree_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── dynu/
│   │   │   ├── dynu.go
│   │   │   ├── dynu.toml
│   │   │   ├── dynu_test.go
│   │   │   └── internal/
│   │   │       ├── auth.go
│   │   │       ├── auth_test.go
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_new_record-request.json
│   │   │       │   ├── add_new_record.json
│   │   │       │   ├── add_new_record_invalid.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── delete_record_invalid.json
│   │   │       │   ├── get_records.json
│   │   │       │   ├── get_records_empty.json
│   │   │       │   ├── get_records_invalid.json
│   │   │       │   ├── get_root_domain.json
│   │   │       │   └── get_root_domain_invalid.json
│   │   │       └── types.go
│   │   ├── easydns/
│   │   │   ├── easydns.go
│   │   │   ├── easydns.toml
│   │   │   ├── easydns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── error1.json
│   │   │       │   └── list-zone.json
│   │   │       ├── readme.md
│   │   │       └── types.go
│   │   ├── edgecenter/
│   │   │   ├── edgecenter.go
│   │   │   ├── edgecenter.toml
│   │   │   └── edgecenter_test.go
│   │   ├── edgedns/
│   │   │   ├── edgedns.go
│   │   │   ├── edgedns.toml
│   │   │   ├── edgedns_integration_test.go
│   │   │   └── edgedns_test.go
│   │   ├── edgeone/
│   │   │   ├── edgeone.go
│   │   │   ├── edgeone.toml
│   │   │   ├── edgeone_test.go
│   │   │   └── wrapper.go
│   │   ├── efficientip/
│   │   │   ├── efficientip.go
│   │   │   ├── efficientip.toml
│   │   │   ├── efficientip_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── dns_rr_add.json
│   │   │       │   ├── dns_rr_delete-error.json
│   │   │       │   ├── dns_rr_delete.json
│   │   │       │   ├── dns_rr_info.json
│   │   │       │   └── dns_rr_list.json
│   │   │       └── types.go
│   │   ├── epik/
│   │   │   ├── epik.go
│   │   │   ├── epik.toml
│   │   │   ├── epik_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── createHostRecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getDnsRecord.json
│   │   │       │   └── removeHostRecord.json
│   │   │       └── types.go
│   │   ├── eurodns/
│   │   │   ├── eurodns.go
│   │   │   ├── eurodns.toml
│   │   │   ├── eurodns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.json
│   │   │       │   ├── zone_add.json
│   │   │       │   ├── zone_add_empty_forwards.json
│   │   │       │   ├── zone_add_validate_ko.json
│   │   │       │   ├── zone_add_validate_ok.json
│   │   │       │   ├── zone_get.json
│   │   │       │   └── zone_remove.json
│   │   │       └── types.go
│   │   ├── excedo/
│   │   │   ├── excedo.go
│   │   │   ├── excedo.toml
│   │   │   ├── excedo_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── addrecord.json
│   │   │       │   ├── deleterecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getrecords.json
│   │   │       │   └── login.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── exec/
│   │   │   ├── exec.go
│   │   │   ├── exec.toml
│   │   │   ├── exec_test.go
│   │   │   └── log_mock_test.go
│   │   ├── exoscale/
│   │   │   ├── exoscale.go
│   │   │   ├── exoscale.toml
│   │   │   └── exoscale_test.go
│   │   ├── f5xc/
│   │   │   ├── f5xc.go
│   │   │   ├── f5xc.toml
│   │   │   ├── f5xc_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create.json
│   │   │       │   ├── delete.json
│   │   │       │   ├── error_404.json
│   │   │       │   ├── error_503.json
│   │   │       │   ├── get.json
│   │   │       │   └── replace.json
│   │   │       └── types.go
│   │   ├── freemyip/
│   │   │   ├── freemyip.go
│   │   │   ├── freemyip.toml
│   │   │   └── freemyip_test.go
│   │   ├── gandi/
│   │   │   ├── gandi.go
│   │   │   ├── gandi.toml
│   │   │   ├── gandi_mock_test.go
│   │   │   ├── gandi_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record-request.xml
│   │   │       │   ├── clone_zone-request.xml
│   │   │       │   ├── clone_zone.xml
│   │   │       │   ├── delete_zone-request.xml
│   │   │       │   ├── delete_zone.xml
│   │   │       │   ├── empty.xml
│   │   │       │   ├── get_zone_id-request.xml
│   │   │       │   ├── get_zone_id.xml
│   │   │       │   ├── new_zone_version-request.xml
│   │   │       │   ├── new_zone_version.xml
│   │   │       │   ├── set_zone-request.xml
│   │   │       │   ├── set_zone.xml
│   │   │       │   ├── set_zone_version-request.xml
│   │   │       │   └── set_zone_version.xml
│   │   │       └── types.go
│   │   ├── gandiv5/
│   │   │   ├── gandiv5.go
│   │   │   ├── gandiv5.toml
│   │   │   ├── gandiv5_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record_get.json
│   │   │       │   └── api_response.json
│   │   │       └── types.go
│   │   ├── gcloud/
│   │   │   ├── fixtures/
│   │   │   │   └── gce_account_service_file.json
│   │   │   ├── gcloud.toml
│   │   │   ├── googlecloud.go
│   │   │   └── googlecloud_test.go
│   │   ├── gcore/
│   │   │   ├── gcore.go
│   │   │   ├── gcore.toml
│   │   │   └── gcore_test.go
│   │   ├── gigahostno/
│   │   │   ├── gigahostno.go
│   │   │   ├── gigahostno.toml
│   │   │   ├── gigahostno_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── authenticate-request.json
│   │   │       │   ├── authenticate.json
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── zone_records.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── glesys/
│   │   │   ├── glesys.go
│   │   │   ├── glesys.toml
│   │   │   ├── glesys_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   └── delete-record.json
│   │   │       └── types.go
│   │   ├── godaddy/
│   │   │   ├── godaddy.go
│   │   │   ├── godaddy.toml
│   │   │   ├── godaddy_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error-extended.json
│   │   │       │   ├── errors.json
│   │   │       │   ├── getrecords.json
│   │   │       │   └── update_records-request.json
│   │   │       └── types.go
│   │   ├── googledomains/
│   │   │   ├── googledomains.go
│   │   │   └── googledomains.toml
│   │   ├── gravity/
│   │   │   ├── gravity.go
│   │   │   ├── gravity.toml
│   │   │   ├── gravity_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── error.json
│   │   │       │   ├── login-request.json
│   │   │       │   ├── login.json
│   │   │       │   ├── me.json
│   │   │       │   ├── me_unauthenticated.json
│   │   │       │   ├── zones.json
│   │   │       │   └── zones_empty.json
│   │   │       └── types.go
│   │   ├── hetzner/
│   │   │   ├── hetzner.go
│   │   │   ├── hetzner.toml
│   │   │   ├── hetzner_test.go
│   │   │   └── internal/
│   │   │       ├── hetznerv1/
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── add_rrset_records-request.json
│   │   │       │   │   ├── add_rrset_records.json
│   │   │       │   │   ├── get_action_error.json
│   │   │       │   │   ├── get_action_running.json
│   │   │       │   │   ├── get_action_success.json
│   │   │       │   │   ├── remove_rrset_records-request.json
│   │   │       │   │   └── remove_rrset_records.json
│   │   │       │   ├── hetznerv1.go
│   │   │       │   ├── hetznerv1_test.go
│   │   │       │   └── internal/
│   │   │       │       ├── client.go
│   │   │       │       ├── client_test.go
│   │   │       │       ├── fixtures/
│   │   │       │       │   ├── add_rrset_records-request.json
│   │   │       │       │   ├── add_rrset_records.json
│   │   │       │       │   ├── error-deprecated_api_endpoint.json
│   │   │       │       │   ├── error-invalid_input.json
│   │   │       │       │   ├── error-resource_limit_exceeded.json
│   │   │       │       │   ├── get_action.json
│   │   │       │       │   ├── remove_rrset_records-request.json
│   │   │       │       │   └── remove_rrset_records.json
│   │   │       │       └── types.go
│   │   │       └── legacy/
│   │   │           ├── hetzner.go
│   │   │           ├── hetzner_test.go
│   │   │           └── internal/
│   │   │               ├── client.go
│   │   │               ├── client_test.go
│   │   │               ├── fixtures/
│   │   │               │   ├── create_txt_record-request.json
│   │   │               │   ├── create_txt_record.json
│   │   │               │   ├── get_txt_record.json
│   │   │               │   └── get_zone_id.json
│   │   │               └── types.go
│   │   ├── hostingde/
│   │   │   ├── hostingde.go
│   │   │   ├── hostingde.toml
│   │   │   └── hostingde_test.go
│   │   ├── hostinger/
│   │   │   ├── hostinger.go
│   │   │   ├── hostinger.toml
│   │   │   ├── hostinger_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── delete_dns_records.json
│   │   │       │   ├── error_401.json
│   │   │       │   ├── error_422.json
│   │   │       │   ├── get_dns_records.json
│   │   │       │   ├── get_dns_records_acme.json
│   │   │       │   ├── get_dns_records_empty.json
│   │   │       │   ├── update_dns_records-request.json
│   │   │       │   ├── update_dns_records.json
│   │   │       │   └── update_dns_records_base-request.json
│   │   │       └── types.go
│   │   ├── hostingnl/
│   │   │   ├── hostingnl.go
│   │   │   ├── hostingnl.toml
│   │   │   ├── hostingnl_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── add_record.json
│   │   │       │   ├── delete_record-request.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── error.json
│   │   │       │   └── error_other.json
│   │   │       └── types.go
│   │   ├── hosttech/
│   │   │   ├── hosttech.go
│   │   │   ├── hosttech.toml
│   │   │   ├── hosttech_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error-details.json
│   │   │       │   ├── error.json
│   │   │       │   ├── record.json
│   │   │       │   ├── records.json
│   │   │       │   ├── zone.json
│   │   │       │   └── zones.json
│   │   │       └── types.go
│   │   ├── httpnet/
│   │   │   ├── httpnet.go
│   │   │   ├── httpnet.toml
│   │   │   └── httpnet_test.go
│   │   ├── httpreq/
│   │   │   ├── httpreq.go
│   │   │   ├── httpreq.toml
│   │   │   └── httpreq_test.go
│   │   ├── huaweicloud/
│   │   │   ├── huaweicloud.go
│   │   │   ├── huaweicloud.toml
│   │   │   ├── huaweicloud_test.go
│   │   │   └── internal/
│   │   │       └── client.go
│   │   ├── hurricane/
│   │   │   ├── hurricane.go
│   │   │   ├── hurricane.toml
│   │   │   ├── hurricane_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── hyperone/
│   │   │   ├── hyperone.go
│   │   │   ├── hyperone.toml
│   │   │   ├── hyperone_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── createRecord.json
│   │   │       │   ├── createRecordset.json
│   │   │       │   ├── invalidPassport.json
│   │   │       │   ├── record.json
│   │   │       │   ├── recordset.json
│   │   │       │   ├── validPassport.json
│   │   │       │   └── zones.json
│   │   │       ├── passport.go
│   │   │       ├── passport_test.go
│   │   │       ├── token.go
│   │   │       ├── token_test.go
│   │   │       └── types.go
│   │   ├── ibmcloud/
│   │   │   ├── ibmcloud.go
│   │   │   ├── ibmcloud.toml
│   │   │   ├── ibmcloud_test.go
│   │   │   └── internal/
│   │   │       └── wrapper.go
│   │   ├── iij/
│   │   │   ├── iij.go
│   │   │   ├── iij.toml
│   │   │   └── iij_test.go
│   │   ├── iijdpf/
│   │   │   ├── iijdpf.go
│   │   │   ├── iijdpf.toml
│   │   │   ├── iijdpf_test.go
│   │   │   └── wrapper.go
│   │   ├── infoblox/
│   │   │   ├── infoblox.go
│   │   │   ├── infoblox.toml
│   │   │   └── infoblox_test.go
│   │   ├── infomaniak/
│   │   │   ├── infomaniak.go
│   │   │   ├── infomaniak.toml
│   │   │   ├── infomaniak_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_dns_record-request.json
│   │   │       │   └── get_domain_name.json
│   │   │       └── types.go
│   │   ├── internal/
│   │   │   ├── active24/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── error_403.json
│   │   │   │   │   │   ├── error_422.json
│   │   │   │   │   │   ├── error_v1.json
│   │   │   │   │   │   ├── records.json
│   │   │   │   │   │   └── services.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── clientdebug/
│   │   │   │   ├── .gitattributes
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── env_vars.txt
│   │   │   │       ├── headers.txt
│   │   │   │       └── values.txt
│   │   │   ├── errutils/
│   │   │   │   └── client.go
│   │   │   ├── gcore/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── hostingde/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── zoneConfigsFind-request.json
│   │   │   │   │   │   ├── zoneConfigsFind.json
│   │   │   │   │   │   ├── zoneConfigsFind_error.json
│   │   │   │   │   │   ├── zoneUpdate-request.json
│   │   │   │   │   │   ├── zoneUpdate.json
│   │   │   │   │   │   └── zoneUpdate_error.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── ionos/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── get_records.json
│   │   │   │   │   │   ├── get_records_error.json
│   │   │   │   │   │   ├── list_zones.json
│   │   │   │   │   │   ├── list_zones_error.json
│   │   │   │   │   │   ├── remove_record_error.json
│   │   │   │   │   │   └── replace_records_error.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── ptr/
│   │   │   │   └── types.go
│   │   │   ├── rimuhosting/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── add_record.xml
│   │   │   │   │   │   ├── add_record_error.xml
│   │   │   │   │   │   ├── add_record_same_domain.xml
│   │   │   │   │   │   ├── delete_record.xml
│   │   │   │   │   │   ├── delete_record_error.xml
│   │   │   │   │   │   ├── delete_record_nothing.xml
│   │   │   │   │   │   ├── find_records.xml
│   │   │   │   │   │   ├── find_records_empty.xml
│   │   │   │   │   │   └── find_records_pattern.xml
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── selectel/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   │   ├── add_record.json
│   │   │   │   │   │   ├── domains.json
│   │   │   │   │   │   ├── error.json
│   │   │   │   │   │   └── list_records.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── tecnocratica/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   │   ├── create_record.json
│   │   │   │   │   │   ├── get_records.json
│   │   │   │   │   │   └── get_zones.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── useragent/
│   │   │   │   └── useragent.go
│   │   │   └── westcn/
│   │   │       ├── internal/
│   │   │       │   ├── client.go
│   │   │       │   ├── client_test.go
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── adddnsrecord.json
│   │   │       │   │   ├── deldnsrecord.json
│   │   │       │   │   └── error.json
│   │   │       │   └── types.go
│   │   │       ├── provider.go
│   │   │       └── provider_test.go
│   │   ├── internetbs/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── Domain_DnsRecord_Add_FAILURE.json
│   │   │   │   │   ├── Domain_DnsRecord_Add_SUCCESS.json
│   │   │   │   │   ├── Domain_DnsRecord_List_FAILURE.json
│   │   │   │   │   ├── Domain_DnsRecord_List_SUCCESS.json
│   │   │   │   │   ├── Domain_DnsRecord_Remove_SUCCESS.json
│   │   │   │   │   └── auth_error.json
│   │   │   │   └── types.go
│   │   │   ├── internetbs.go
│   │   │   ├── internetbs.toml
│   │   │   └── internetbs_test.go
│   │   ├── inwx/
│   │   │   ├── inwx.go
│   │   │   ├── inwx.toml
│   │   │   └── inwx_test.go
│   │   ├── ionos/
│   │   │   ├── ionos.go
│   │   │   ├── ionos.toml
│   │   │   └── ionos_test.go
│   │   ├── ionoscloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zones.json
│   │   │   │   └── types.go
│   │   │   ├── ionoscloud.go
│   │   │   ├── ionoscloud.toml
│   │   │   └── ionoscloud_test.go
│   │   ├── ipv64/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-error.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── del_record-error.json
│   │   │   │   │   ├── del_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── get_domains.json
│   │   │   │   └── types.go
│   │   │   ├── ipv64.go
│   │   │   ├── ipv64.toml
│   │   │   └── ipv64_test.go
│   │   ├── ispconfig/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── client_get_id-request.json
│   │   │   │   │   ├── client_get_id.json
│   │   │   │   │   ├── dns_txt_add-request.json
│   │   │   │   │   ├── dns_txt_add.json
│   │   │   │   │   ├── dns_txt_delete-request.json
│   │   │   │   │   ├── dns_txt_delete.json
│   │   │   │   │   ├── dns_txt_get-request.json
│   │   │   │   │   ├── dns_txt_get.json
│   │   │   │   │   ├── dns_zone_get-request.json
│   │   │   │   │   ├── dns_zone_get.json
│   │   │   │   │   ├── dns_zone_get_id-request.json
│   │   │   │   │   ├── dns_zone_get_id.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── login-request.json
│   │   │   │   │   └── login.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── ispconfig.go
│   │   │   ├── ispconfig.toml
│   │   │   └── ispconfig_test.go
│   │   ├── ispconfigddns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── ispconfigddns.go
│   │   │   ├── ispconfigddns.toml
│   │   │   └── ispconfigddns_test.go
│   │   ├── iwantmyname/
│   │   │   ├── iwantmyname.go
│   │   │   └── iwantmyname.toml
│   │   ├── jdcloud/
│   │   │   ├── fixtures/
│   │   │   │   ├── create_record-request.json
│   │   │   │   ├── create_record.json
│   │   │   │   ├── delete_record.json
│   │   │   │   ├── describe_domains_page1.json
│   │   │   │   └── describe_domains_page2.json
│   │   │   ├── jdcloud.go
│   │   │   ├── jdcloud.toml
│   │   │   └── jdcloud_test.go
│   │   ├── joker/
│   │   │   ├── internal/
│   │   │   │   ├── dmapi/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── identity.go
│   │   │   │   │   └── identity_test.go
│   │   │   │   └── svc/
│   │   │   │       ├── client.go
│   │   │   │       └── client_test.go
│   │   │   ├── joker.go
│   │   │   ├── joker.toml
│   │   │   ├── joker_test.go
│   │   │   ├── provider_dmapi.go
│   │   │   ├── provider_dmapi_test.go
│   │   │   ├── provider_svc.go
│   │   │   └── provider_svc_test.go
│   │   ├── keyhelp/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get_domain_records.json
│   │   │   │   │   ├── get_domain_records2.json
│   │   │   │   │   ├── get_domains.json
│   │   │   │   │   ├── update_domain_records-request.json
│   │   │   │   │   ├── update_domain_records-request2.json
│   │   │   │   │   └── update_domain_records.json
│   │   │   │   └── types.go
│   │   │   ├── keyhelp.go
│   │   │   ├── keyhelp.toml
│   │   │   └── keyhelp_test.go
│   │   ├── leaseweb/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── createResourceRecordSet-request.json
│   │   │   │   │   ├── createResourceRecordSet.json
│   │   │   │   │   ├── error_400.json
│   │   │   │   │   ├── error_401.json
│   │   │   │   │   ├── error_404.json
│   │   │   │   │   ├── getResourceRecordSet.json
│   │   │   │   │   ├── getResourceRecordSet2.json
│   │   │   │   │   ├── updateResourceRecordSet-request.json
│   │   │   │   │   ├── updateResourceRecordSet-request2.json
│   │   │   │   │   └── updateResourceRecordSet.json
│   │   │   │   └── types.go
│   │   │   ├── leaseweb.go
│   │   │   ├── leaseweb.toml
│   │   │   └── leaseweb_test.go
│   │   ├── liara/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── RecordResponse.json
│   │   │   │   │   ├── RecordsResponse.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── liara.go
│   │   │   ├── liara.toml
│   │   │   └── liara_test.go
│   │   ├── lightsail/
│   │   │   ├── lightsail.go
│   │   │   ├── lightsail.toml
│   │   │   ├── lightsail_integration_test.go
│   │   │   └── lightsail_test.go
│   │   ├── limacity/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get-domains.json
│   │   │   │   │   ├── get-records.json
│   │   │   │   │   └── ok.json
│   │   │   │   └── types.go
│   │   │   ├── limacity.go
│   │   │   ├── limacity.toml
│   │   │   └── limacity_test.go
│   │   ├── linode/
│   │   │   ├── linode.go
│   │   │   ├── linode.toml
│   │   │   └── linode_test.go
│   │   ├── liquidweb/
│   │   │   ├── liquidweb.go
│   │   │   ├── liquidweb.toml
│   │   │   ├── liquidweb_test.go
│   │   │   └── servermock_test.go
│   │   ├── loopia/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── mock_test.go
│   │   │   │   └── types.go
│   │   │   ├── loopia.go
│   │   │   ├── loopia.toml
│   │   │   ├── loopia_mock_test.go
│   │   │   └── loopia_test.go
│   │   ├── luadns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── delete_record.json
│   │   │   │   │   └── list_zones.json
│   │   │   │   └── types.go
│   │   │   ├── luadns.go
│   │   │   ├── luadns.toml
│   │   │   └── luadns_test.go
│   │   ├── mailinabox/
│   │   │   ├── mailinabox.go
│   │   │   ├── mailinabox.toml
│   │   │   └── mailinabox_test.go
│   │   ├── manageengine/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── error_bad_request.json
│   │   │   │   │   ├── zone_domains_all.json
│   │   │   │   │   ├── zone_record_create.json
│   │   │   │   │   ├── zone_record_delete.json
│   │   │   │   │   ├── zone_record_update.json
│   │   │   │   │   └── zone_records_all.json
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── manageengine.go
│   │   │   ├── manageengine.toml
│   │   │   └── manageengine_test.go
│   │   ├── manual/
│   │   │   ├── manual.go
│   │   │   ├── manual.toml
│   │   │   └── manual_test.go
│   │   ├── metaname/
│   │   │   ├── metaname.go
│   │   │   ├── metaname.toml
│   │   │   └── metaname_test.go
│   │   ├── metaregistrar/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error-response.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── update-dns-zone.json
│   │   │   │   └── types.go
│   │   │   ├── metaregistrar.go
│   │   │   ├── metaregistrar.toml
│   │   │   └── metaregistrar_test.go
│   │   ├── mijnhost/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get-dns-records.json
│   │   │   │   │   ├── list-domains.json
│   │   │   │   │   └── update-dns-records.json
│   │   │   │   └── types.go
│   │   │   ├── mijnhost.go
│   │   │   ├── mijnhost.toml
│   │   │   └── mijnhost_test.go
│   │   ├── mittwald/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns-create-dns-zone.json
│   │   │   │   │   ├── dns-get-dns-zone.json
│   │   │   │   │   ├── dns-list-dns-zones.json
│   │   │   │   │   ├── domain-list-domains.json
│   │   │   │   │   ├── error-client.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── mittwald.go
│   │   │   ├── mittwald.toml
│   │   │   └── mittwald_test.go
│   │   ├── myaddr/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── error.txt
│   │   │   │   └── types.go
│   │   │   ├── myaddr.go
│   │   │   ├── myaddr.toml
│   │   │   └── myaddr_test.go
│   │   ├── mydnsjp/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── client_test.go
│   │   │   ├── mydnsjp.go
│   │   │   ├── mydnsjp.toml
│   │   │   └── mydnsjp_test.go
│   │   ├── mythicbeasts/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── delete-zoneszonerecords.json
│   │   │   │   │   ├── post-zoneszonerecords.json
│   │   │   │   │   └── token.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   └── types.go
│   │   │   ├── mythicbeasts.go
│   │   │   ├── mythicbeasts.toml
│   │   │   └── mythicbeasts_test.go
│   │   ├── namecheap/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── getHosts.xml
│   │   │   │   │   ├── getHosts_errorBadAPIKey1.xml
│   │   │   │   │   ├── getHosts_success1.xml
│   │   │   │   │   ├── getHosts_success2.xml
│   │   │   │   │   ├── setHosts.xml
│   │   │   │   │   ├── setHosts_errorBadAPIKey1.xml
│   │   │   │   │   ├── setHosts_success1.xml
│   │   │   │   │   └── setHosts_success2.xml
│   │   │   │   ├── ip.go
│   │   │   │   └── types.go
│   │   │   ├── namecheap.go
│   │   │   ├── namecheap.toml
│   │   │   ├── namecheap_test.go
│   │   │   ├── transport.go
│   │   │   └── transport_test.go
│   │   ├── namedotcom/
│   │   │   ├── namedotcom.go
│   │   │   ├── namedotcom.toml
│   │   │   └── namedotcom_test.go
│   │   ├── namesilo/
│   │   │   ├── namesilo.go
│   │   │   ├── namesilo.toml
│   │   │   └── namesilo_test.go
│   │   ├── namesurfer/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── addDNSRecord-request.json
│   │   │   │   │   ├── addDNSRecord.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── listZones-request.json
│   │   │   │   │   ├── listZones.json
│   │   │   │   │   ├── searchDNSHosts-request.json
│   │   │   │   │   ├── searchDNSHosts.json
│   │   │   │   │   ├── updateDNSHost-request.json
│   │   │   │   │   └── updateDNSHost.json
│   │   │   │   └── types.go
│   │   │   ├── namesurfer.go
│   │   │   ├── namesurfer.toml
│   │   │   └── namesurfer_test.go
│   │   ├── nearlyfreespeech/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── nearlyfreespeech.go
│   │   │   ├── nearlyfreespeech.toml
│   │   │   └── nearlyfreespeech_test.go
│   │   ├── neodigit/
│   │   │   ├── neodigit.go
│   │   │   ├── neodigit.toml
│   │   │   └── neodigit_test.go
│   │   ├── netcup/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_live_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── get_dns_records-request.json
│   │   │   │   │   ├── get_dns_records.json
│   │   │   │   │   ├── get_dns_records_error.json
│   │   │   │   │   ├── get_dns_records_error_unmarshal.json
│   │   │   │   │   ├── login-request.json
│   │   │   │   │   ├── login.json
│   │   │   │   │   ├── login_error.json
│   │   │   │   │   ├── login_error_unmarshal.json
│   │   │   │   │   ├── logout-request.json
│   │   │   │   │   ├── logout.json
│   │   │   │   │   └── logout_error.json
│   │   │   │   ├── session.go
│   │   │   │   ├── session_test.go
│   │   │   │   └── types.go
│   │   │   ├── netcup.go
│   │   │   ├── netcup.toml
│   │   │   └── netcup_test.go
│   │   ├── netlify/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   └── get_records.json
│   │   │   │   └── types.go
│   │   │   ├── netlify.go
│   │   │   ├── netlify.toml
│   │   │   └── netlify_test.go
│   │   ├── nicmanager/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zone.json
│   │   │   │   └── types.go
│   │   │   ├── nicmanager.go
│   │   │   ├── nicmanager.toml
│   │   │   └── nicmanager_test.go
│   │   ├── nicru/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── commit_POST.xml
│   │   │   │   │   ├── errors.xml
│   │   │   │   │   ├── record_DELETE.xml
│   │   │   │   │   ├── records_GET.xml
│   │   │   │   │   ├── records_PUT.xml
│   │   │   │   │   ├── services_GET.xml
│   │   │   │   │   ├── zones_GET.xml
│   │   │   │   │   └── zones_all_GET.xml
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── nicru.go
│   │   │   ├── nicru.toml
│   │   │   └── nicru_test.go
│   │   ├── nifcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── nifcloud.go
│   │   │   ├── nifcloud.toml
│   │   │   └── nifcloud_test.go
│   │   ├── njalla/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── auth_error.json
│   │   │   │   │   ├── list_records-request.json
│   │   │   │   │   ├── list_records.json
│   │   │   │   │   ├── remove_record-request.json
│   │   │   │   │   ├── remove_record_error_missing_domain.json
│   │   │   │   │   └── remove_record_error_missing_id.json
│   │   │   │   └── types.go
│   │   │   ├── njalla.go
│   │   │   ├── njalla.toml
│   │   │   └── njalla_test.go
│   │   ├── nodion/
│   │   │   ├── nodion.go
│   │   │   ├── nodion.toml
│   │   │   └── nodion_test.go
│   │   ├── ns1/
│   │   │   ├── ns1.go
│   │   │   ├── ns1.toml
│   │   │   └── ns1_test.go
│   │   ├── octenium/
│   │   │   ├── fixtures/
│   │   │   │   ├── add_dns_record.json
│   │   │   │   ├── delete_dns_record.json
│   │   │   │   ├── list_dns_records.json
│   │   │   │   └── list_domains.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_dns_record.json
│   │   │   │   │   ├── delete_dns_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── list_dns_records.json
│   │   │   │   │   └── list_domains.json
│   │   │   │   └── types.go
│   │   │   ├── octenium.go
│   │   │   ├── octenium.toml
│   │   │   └── octenium_test.go
│   │   ├── oraclecloud/
│   │   │   ├── configurationprovider.go
│   │   │   ├── fixtures/
│   │   │   │   ├── cert.pem
│   │   │   │   └── key.pem
│   │   │   ├── oraclecloud.go
│   │   │   ├── oraclecloud.toml
│   │   │   └── oraclecloud_test.go
│   │   ├── otc/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── zones-recordsets_DELETE.json
│   │   │   │   │   ├── zones-recordsets_GET.json
│   │   │   │   │   ├── zones-recordsets_GET_empty.json
│   │   │   │   │   ├── zones-recordsets_POST-request.json
│   │   │   │   │   ├── zones-recordsets_POST.json
│   │   │   │   │   ├── zones_GET.json
│   │   │   │   │   └── zones_GET_empty.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   ├── mock.go
│   │   │   │   └── types.go
│   │   │   ├── otc.go
│   │   │   ├── otc.toml
│   │   │   └── otc_test.go
│   │   ├── ovh/
│   │   │   ├── ovh.go
│   │   │   ├── ovh.toml
│   │   │   └── ovh_test.go
│   │   ├── pdns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── versions.json
│   │   │   │   │   ├── zone-request.json
│   │   │   │   │   └── zone.json
│   │   │   │   └── types.go
│   │   │   ├── pdns.go
│   │   │   ├── pdns.toml
│   │   │   └── pdns_test.go
│   │   ├── plesk/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record-error.xml
│   │   │   │   │   ├── add-record.xml
│   │   │   │   │   ├── delete-record-error.xml
│   │   │   │   │   ├── delete-record.xml
│   │   │   │   │   ├── get-site-error.xml
│   │   │   │   │   ├── get-site.xml
│   │   │   │   │   └── global-error.xml
│   │   │   │   └── types.go
│   │   │   ├── plesk.go
│   │   │   ├── plesk.toml
│   │   │   └── plesk_test.go
│   │   ├── porkbun/
│   │   │   ├── porkbun.go
│   │   │   ├── porkbun.toml
│   │   │   └── porkbun_test.go
│   │   ├── rackspace/
│   │   │   ├── fixtures/
│   │   │   │   ├── delete.json
│   │   │   │   ├── identity.json
│   │   │   │   ├── record.json
│   │   │   │   ├── record_details.json
│   │   │   │   └── zone_details.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-records.json
│   │   │   │   │   ├── delete-records_error.json
│   │   │   │   │   ├── list-domains-by-name.json
│   │   │   │   │   ├── search-records.json
│   │   │   │   │   └── tokens.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   └── types.go
│   │   │   ├── rackspace.go
│   │   │   ├── rackspace.toml
│   │   │   └── rackspace_test.go
│   │   ├── rainyun/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── domains.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── records.json
│   │   │   │   └── types.go
│   │   │   ├── rainyun.go
│   │   │   ├── rainyun.toml
│   │   │   └── rainyun_test.go
│   │   ├── rcodezero/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── rrsets-response.json
│   │   │   │   └── types.go
│   │   │   ├── rcodezero.go
│   │   │   ├── rcodezero.toml
│   │   │   └── rcodezero_test.go
│   │   ├── regfish/
│   │   │   ├── regfish.go
│   │   │   ├── regfish.toml
│   │   │   └── regfish_test.go
│   │   ├── regru/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_txt_record.json
│   │   │   │   │   ├── add_txt_record_error_auth.json
│   │   │   │   │   ├── add_txt_record_error_domain.json
│   │   │   │   │   ├── remove_record.json
│   │   │   │   │   ├── remove_record_error_auth.json
│   │   │   │   │   └── remove_record_error_domain.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── regru.go
│   │   │   ├── regru.toml
│   │   │   └── regru_test.go
│   │   ├── rfc2136/
│   │   │   ├── internal/
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── invalid_field.conf
│   │   │   │   │   ├── invalid_key.conf
│   │   │   │   │   ├── mising_algo.conf
│   │   │   │   │   ├── missing_secret.conf
│   │   │   │   │   ├── sample.conf
│   │   │   │   │   ├── text_after.conf
│   │   │   │   │   └── text_before.conf
│   │   │   │   ├── readme.md
│   │   │   │   ├── tsigkey.go
│   │   │   │   └── tsigkey_test.go
│   │   │   ├── rfc2136.go
│   │   │   ├── rfc2136.toml
│   │   │   └── rfc2136_test.go
│   │   ├── rimuhosting/
│   │   │   ├── rimuhosting.go
│   │   │   ├── rimuhosting.toml
│   │   │   └── rimuhosting_test.go
│   │   ├── route53/
│   │   │   ├── fixtures/
│   │   │   │   ├── changeResourceRecordSetsResponse.xml
│   │   │   │   ├── getChangeResponse.xml
│   │   │   │   └── listHostedZonesByNameResponse.xml
│   │   │   ├── route53.go
│   │   │   ├── route53.toml
│   │   │   ├── route53_integration_test.go
│   │   │   └── route53_test.go
│   │   ├── safedns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── safedns.go
│   │   │   ├── safedns.toml
│   │   │   └── safedns_test.go
│   │   ├── sakuracloud/
│   │   │   ├── sakuracloud.go
│   │   │   ├── sakuracloud.toml
│   │   │   ├── sakuracloud_test.go
│   │   │   ├── wrapper.go
│   │   │   └── wrapper_test.go
│   │   ├── scaleway/
│   │   │   ├── scaleway.go
│   │   │   ├── scaleway.toml
│   │   │   └── scaleway_test.go
│   │   ├── selectel/
│   │   │   ├── selectel.go
│   │   │   ├── selectel.toml
│   │   │   └── selectel_test.go
│   │   ├── selectelv2/
│   │   │   ├── selectelv2.go
│   │   │   ├── selectelv2.toml
│   │   │   └── selectelv2_test.go
│   │   ├── selfhostde/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── readme.md
│   │   │   ├── mapping.go
│   │   │   ├── mapping_test.go
│   │   │   ├── selfhostde.go
│   │   │   ├── selfhostde.toml
│   │   │   └── selfhostde_test.go
│   │   ├── servercow/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── records-01.json
│   │   │   │   ├── types.go
│   │   │   │   └── types_test.go
│   │   │   ├── servercow.go
│   │   │   ├── servercow.toml
│   │   │   └── servercow_test.go
│   │   ├── shellrent/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns_record-remove.json
│   │   │   │   │   ├── dns_record-store.json
│   │   │   │   │   ├── domain-details.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── purchase-details.json
│   │   │   │   │   └── purchase.json
│   │   │   │   └── types.go
│   │   │   ├── shellrent.go
│   │   │   ├── shellrent.toml
│   │   │   └── shellrent_test.go
│   │   ├── simply/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── bad_auth_error.json
│   │   │   │   │   ├── bad_zone_error.json
│   │   │   │   │   ├── get_records.json
│   │   │   │   │   ├── invalid_record_id_error.json
│   │   │   │   │   └── success.json
│   │   │   │   └── types.go
│   │   │   ├── simply.go
│   │   │   ├── simply.toml
│   │   │   └── simply_test.go
│   │   ├── sonic/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── sonic.go
│   │   │   ├── sonic.toml
│   │   │   └── sonic_test.go
│   │   ├── spaceship/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── get-records.json
│   │   │   │   └── types.go
│   │   │   ├── spaceship.go
│   │   │   ├── spaceship.toml
│   │   │   └── spaceship_test.go
│   │   ├── stackpath/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── get_zone_records.json
│   │   │   │   │   └── get_zones.json
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── stackpath.go
│   │   │   ├── stackpath.toml
│   │   │   └── stackpath_test.go
│   │   ├── syse/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   └── create_record.json
│   │   │   │   └── types.go
│   │   │   ├── syse.go
│   │   │   ├── syse.toml
│   │   │   └── syse_test.go
│   │   ├── technitium/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record.json
│   │   │   │   │   ├── delete-record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── technitium.go
│   │   │   ├── technitium.toml
│   │   │   └── technitium_test.go
│   │   ├── tencentcloud/
│   │   │   ├── tencentcloud.go
│   │   │   ├── tencentcloud.toml
│   │   │   ├── tencentcloud_test.go
│   │   │   └── wrapper.go
│   │   ├── timewebcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── createDomainDNSRecord.json
│   │   │   │   │   ├── error_bad_request.json
│   │   │   │   │   └── error_unauthorized.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── timewebcloud.go
│   │   │   ├── timewebcloud.toml
│   │   │   └── timewebcloud_test.go
│   │   ├── todaynic/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── todaynic.go
│   │   │   ├── todaynic.toml
│   │   │   └── todaynic_test.go
│   │   ├── transip/
│   │   │   ├── fixtures/
│   │   │   │   └── private.key
│   │   │   ├── transip.go
│   │   │   ├── transip.toml
│   │   │   └── transip_test.go
│   │   ├── ultradns/
│   │   │   ├── ultradns.go
│   │   │   ├── ultradns.toml
│   │   │   └── ultradns_test.go
│   │   ├── uniteddomains/
│   │   │   ├── uniteddomains.go
│   │   │   ├── uniteddomains.toml
│   │   │   └── uniteddomains_test.go
│   │   ├── variomedia/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── DELETE_dns-records_done.json
│   │   │   │   │   ├── DELETE_dns-records_pending.json
│   │   │   │   │   ├── GET_dns-records.json
│   │   │   │   │   ├── GET_queue-jobs.json
│   │   │   │   │   ├── POST_dns-records.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── variomedia.go
│   │   │   ├── variomedia.toml
│   │   │   └── variomedia_test.go
│   │   ├── vegadns/
│   │   │   ├── fixtures/
│   │   │   │   ├── create_record.json
│   │   │   │   ├── record_delete.json
│   │   │   │   ├── records.json
│   │   │   │   └── token.json
│   │   │   ├── vegadns.go
│   │   │   ├── vegadns.toml
│   │   │   └── vegadns_test.go
│   │   ├── vercel/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── vercel.go
│   │   │   ├── vercel.toml
│   │   │   └── vercel_test.go
│   │   ├── versio/
│   │   │   ├── fixtures/
│   │   │   │   ├── error_failToCreateTXT.json
│   │   │   │   ├── error_failToFindZone.json
│   │   │   │   └── token.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── get-domain-error.json
│   │   │   │   │   ├── get-domain.json
│   │   │   │   │   ├── update-domain-error.json
│   │   │   │   │   ├── update-domain-request.json
│   │   │   │   │   └── update-domain.json
│   │   │   │   └── types.go
│   │   │   ├── versio.go
│   │   │   ├── versio.toml
│   │   │   └── versio_test.go
│   │   ├── vinyldns/
│   │   │   ├── fixtures/
│   │   │   │   ├── recordSetChange-create.json
│   │   │   │   ├── recordSetChange-delete.json
│   │   │   │   ├── recordSetDelete.json
│   │   │   │   ├── recordSetUpdate-create.json
│   │   │   │   ├── recordSetsListAll-empty.json
│   │   │   │   ├── recordSetsListAll.json
│   │   │   │   └── zoneByName.json
│   │   │   ├── vinyldns.go
│   │   │   ├── vinyldns.toml
│   │   │   ├── vinyldns_test.go
│   │   │   └── wrapper.go
│   │   ├── virtualname/
│   │   │   ├── virtualname.go
│   │   │   ├── virtualname.toml
│   │   │   └── virtualname_test.go
│   │   ├── vkcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── types.go
│   │   │   ├── vkcloud.go
│   │   │   ├── vkcloud.toml
│   │   │   └── vkcloud_test.go
│   │   ├── volcengine/
│   │   │   ├── volcengine.go
│   │   │   ├── volcengine.toml
│   │   │   └── volcengine_test.go
│   │   ├── vscale/
│   │   │   ├── vscale.go
│   │   │   ├── vscale.toml
│   │   │   └── vscale_test.go
│   │   ├── vultr/
│   │   │   ├── vultr.go
│   │   │   ├── vultr.toml
│   │   │   └── vultr_test.go
│   │   ├── webnames/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── ok.json
│   │   │   │   └── types.go
│   │   │   ├── webnames.go
│   │   │   ├── webnames.toml
│   │   │   └── webnames_test.go
│   │   ├── webnamesca/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_txt_record.json
│   │   │   │   │   ├── delete_txt_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── webnamesca.go
│   │   │   ├── webnamesca.toml
│   │   │   └── webnamesca_test.go
│   │   ├── websupport/
│   │   │   ├── websupport.go
│   │   │   ├── websupport.toml
│   │   │   └── websupport_test.go
│   │   ├── wedos/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns-domain-commit.json
│   │   │   │   │   ├── dns-row-add.json
│   │   │   │   │   ├── dns-row-delete.json
│   │   │   │   │   ├── dns-row-update.json
│   │   │   │   │   └── dns-rows-list.json
│   │   │   │   ├── token.go
│   │   │   │   └── types.go
│   │   │   ├── wedos.go
│   │   │   ├── wedos.toml
│   │   │   └── wedos_test.go
│   │   ├── westcn/
│   │   │   ├── westcn.go
│   │   │   ├── westcn.toml
│   │   │   └── westcn_test.go
│   │   ├── yandex/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── add_record_error.json
│   │   │   │   │   ├── get_records.json
│   │   │   │   │   ├── get_records_error.json
│   │   │   │   │   ├── remove_record.json
│   │   │   │   │   └── remove_record_error.json
│   │   │   │   └── types.go
│   │   │   ├── yandex.go
│   │   │   ├── yandex.toml
│   │   │   └── yandex_test.go
│   │   ├── yandex360/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record.json
│   │   │   │   │   ├── delete-record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── yandex360.go
│   │   │   ├── yandex360.toml
│   │   │   └── yandex360_test.go
│   │   ├── yandexcloud/
│   │   │   ├── yandexcloud.go
│   │   │   ├── yandexcloud.toml
│   │   │   └── yandexcloud_test.go
│   │   ├── zoneedit/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.xml
│   │   │   │   │   └── success.xml
│   │   │   │   └── types.go
│   │   │   ├── zoneedit.go
│   │   │   ├── zoneedit.toml
│   │   │   └── zoneedit_test.go
│   │   ├── zoneee/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create-txt-record.json
│   │   │   │   │   └── get-txt-records.json
│   │   │   │   └── types.go
│   │   │   ├── zoneee.go
│   │   │   ├── zoneee.toml
│   │   │   └── zoneee_test.go
│   │   ├── zonomi/
│   │   │   ├── zonomi.go
│   │   │   ├── zonomi.toml
│   │   │   └── zonomi_test.go
│   │   └── zz_gen_dns_providers.go
│   └── http/
│       ├── memcached/
│       │   ├── README.md
│       │   ├── memcached.go
│       │   └── memcached_test.go
│       ├── s3/
│       │   ├── s3.go
│       │   ├── s3.toml
│       │   └── s3_test.go
│       └── webroot/
│           ├── webroot.go
│           └── webroot_test.go
└── registration/
    ├── registar.go
    ├── registar_test.go
    ├── user.go
    └── user_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
lego.exe
.lego
.gitcookies
.idea
.vscode/
dist/
builds/
docs/


================================================
FILE: .gitattributes
================================================
**/zz_gen_*.*   linguist-generated
docs/data/zz_cli_help.toml linguist-generated


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐞 Bug Report
description: Create a report to help us improve.
labels: [bug]
body:
  - type: checkboxes
    id: terms
    attributes:
      label: Welcome
      options:
        - label: Yes, I'm using a binary release within the two latest releases.
          required: true
        - label: Yes, I've searched for similar issues on GitHub and didn't find any.
          required: true
        - label: Yes, I've included all information below (version, config, etc).
          required: true

  - type: textarea
    id: expected
    attributes:
      label: What did you expect to see?
      placeholder: Description.
    validations:
      required: true

  - type: textarea
    id: current
    attributes:
      label: What did you see instead?
      placeholder: Description.
    validations:
      required: true

  - type: dropdown
    id: type
    attributes:
      label: How do you use lego?
      options:
        - I don't know
        - Library
        - Binary
        - Docker image
        - Through Traefik
        - Through Caddy
        - Through Terraform ACME provider
        - Through Bitnami
        - Through 1Panel
        - Through Zoraxy
        - Through Certimate
        - go install
        - Other
    validations:
      required: true

  - type: textarea
    id: steps
    attributes:
      label: Reproduction steps
      description: "How do you trigger this bug? Please walk us through it step by step."
      placeholder: |
        1. ...
        2. ...
        3. ...
        ...
    validations:
      required: true

  - type: textarea
    id: version
    attributes:
      label: Effective version of lego
      description: |-
        `latest` or `dev` are not effective versions.
        ```console
        $ lego --version
        ```
      placeholder: Paste output here
      render: console
    validations:
      required: true

  - type: textarea
    id: logs
    attributes:
      label: Logs
      value: |-
        <details>

        ```console
        # paste output here
        ```

        </details>
    validations:
      required: true

  - type: textarea
    id: go-env
    attributes:
      label: Go environment (if applicable)
      value: |-
        <details>

        ```console
        $ go version && go env
        # paste output here
        ```

        </details>
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: ❓ Questions
    url: https://github.com/go-acme/lego/discussions
    about: If you have a question, or are looking for advice, please post on our Discussions section!
  - name: 📖 Documentation
    url: https://go-acme.github.io/lego/
    about: Please take a look to our documentation.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 💡 Feature request
description: Suggest an idea for this project.
body:
  - type: checkboxes
    id: terms
    attributes:
      label: Welcome
      options:
        - label: Yes, I've searched for similar issues on GitHub and didn't find any.
          required: true

  - type: dropdown
    id: type
    attributes:
      label: How do you use lego?
      options:
        - I don't know
        - Library
        - Binary
        - Docker image
        - Through Traefik
        - Through Caddy
        - Through Terraform ACME provider
        - Through Bitnami
        - Through 1Panel
        - Through Zoraxy
        - Through Certimate
        - go install
        - Other
    validations:
      required: true

  - type: input
    id: version
    attributes:
      label: Effective version of lego
      description: "`latest` or `dev` are not effective versions."
    validations:
      required: true

  - type: textarea
    id: description
    attributes:
      label: Detailed Description
      placeholder: Description.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/new_dns_provider.yml
================================================
name: 🧩 New DNS provider support
description: Request for the support of a new DNS provider.
title: "Support for provider: <put the name of your provider>"
labels: [enhancement, new-provider]
body:
  - type: checkboxes
    id: terms
    attributes:
      label: Welcome
      options:
        - label: Yes, I've searched for similar issues on GitHub and didn't find any.
          required: true
        - label: Yes, the DNS provider exposes a public API.
          required: true
        - label: Yes, I know that the lego maintainers don't have an account in all DNS providers in the world.
          required: true

  - type: checkboxes
    id: pr
    attributes:
      label: Implementation
      options:
        - label: Yes, I'm able to create a pull request and be able to maintain the implementation.
          required: false
        - label: Yes, I can test an implementation with the help of the maintainers if someone creates a pull request.
          required: false

  - type: dropdown
    id: type
    attributes:
      label: How do you use lego?
      options:
        - I don't know
        - Library
        - Binary
        - Docker image
        - Through Traefik
        - Through Caddy
        - Through Terraform ACME provider
        - Through Bitnami
        - Through 1Panel
        - Through Zoraxy
        - Through Certimate
        - go install
        - Other
    validations:
      required: true

  - type: dropdown
    id: profile
    attributes:
      label: Who are you?
      options:
        - A customer of this DNS provider
        - An employee of this DNS provider
        - Other (please explain)
    validations:
      required: true

  - type: input
    id: provider-link
    attributes:
      label: Link to the DNS provider
      placeholder: Put your link here.
    validations:
      required: true

  - type: input
    id: api-link
    attributes:
      label:  Link to the API documentation
      placeholder: Put your link here.
    validations:
      required: true

  - type: textarea
    id: expected
    attributes:
      label: Additional Notes
      placeholder: Your notes.
    validations:
      required: false


================================================
FILE: .github/PULL_REQUEST_TEMPLATE/mnp.md
================================================
PULL REQUEST TEMPLATE FOR MAINTAINERS ONLY.

https://github.com/go-acme/lego/compare/master...ldez:branch?quick_pull=1&title=Add+DNS+provider+for+&labels=enhancement,area/dnsprovider,state/need-user-tests&template=mnp.md

?quick_pull=1&title=Add+DNS+provider+for+&labels=enhancement,area/dnsprovider,state/need-user-tests&template=mnp.md

---

- [x] adds a description to your PR
- [x] have a homogeneous design with the other providers
- [ ] add tests (units)
- [ ] add tests ("live")
- [ ] add a provider descriptor
- [ ] generate CLI help, documentation, and readme.
- [ ] be able to do: _(and put the output of this command to a comment)_
  ```bash
  make build
  rm -rf .lego

  EXAMPLE_USERNAME=xxx \
  ./dist/lego -m your_email@example.com --dns EXAMPLE -d *.example.com -d example.com -s https://acme-staging-v02.api.letsencrypt.org/directory run
  ```
  Note the wildcard domain is important.
- [ ] pass the linter
- [ ] do `go mod tidy`

Ping @xxx, can you run the command (with your domain, email, credentials, etc.)?

Closes #



================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--

IMPORTANT:

1. Create an issue and wait for a maintainer to approve it BEFORE opening a pull request.
2. Don't open a work-in-progress pull request. If you open a PR, the PR must be ready to be reviewed.
3. If a pull request doesn't follow one of the previous elements, it will be closed.

Also, pull requests from a fork inside a GitHub organization are not allowed because of access limitation on them.
Only pull requests from personal forks are allowed. 

-->


================================================
FILE: .github/workflows/documentation.yml
================================================
name: Documentation

on:
  push:
    branches:
      - master

jobs:

  doc:
    name: Build and deploy documentation
    runs-on: ubuntu-latest
    env:
      GO_VERSION: stable
      HUGO_VERSION: 0.148.2
      CGO_ENABLED: 0

    steps:

      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Generate DNS docs
        run: make generate-dns

      - name: Install Hugo
        run: |
          wget -O /tmp/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-amd64.deb
          sudo dpkg -i /tmp/hugo.deb

      - name: Build Documentation
        run: make docs-build

      # https://github.com/marketplace/actions/github-pages
      - name: Deploy to GitHub Pages
        uses: crazy-max/ghaction-github-pages@v4
        with:
          target_branch: gh-pages
          build_dir: docs/public
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/go-cross.yml
================================================
name: Go Matrix

on:
  push:
    branches:
      - master
  pull_request:

jobs:

  cross:
    name: Go
    runs-on: ${{ matrix.os }}
    env:
      CGO_ENABLED: 0

    strategy:
      matrix:
        go-version: [ oldstable, stable ]
        os: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go-version }}

      - name: Test
        run: go test -v -cover ./...

      - name: Build
        run: go build -v -ldflags "-s -w" -trimpath -o ./dist/lego ./cmd/lego/


================================================
FILE: .github/workflows/pr.yml
================================================
name: Main

on:
  push:
    branches:
      - master
  pull_request:

jobs:

  main:
    name: Main Process
    runs-on: ubuntu-latest
    env:
      GO_VERSION: stable
      GOLANGCI_LINT_VERSION: v2.10
      HUGO_VERSION: 0.148.2
      CGO_ENABLED: 0
      LEGO_E2E_TESTS: CI
      MEMCACHED_HOSTS: localhost:11211

    steps:

      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Check and get dependencies
        run: |
          go mod tidy --diff

      - name: Generate and Check generated elements
        run: |
          make generate-dns
          git diff --exit-code

      - uses: golangci/golangci-lint-action@v9
        with:
          version: ${{ env.GOLANGCI_LINT_VERSION }}
          install-only: true

      - name: Install Pebble
        run: go install github.com/letsencrypt/pebble/v2/cmd/pebble@v2.9.0

      - name: Install challtestsrv
        run: go install github.com/letsencrypt/pebble/v2/cmd/pebble-challtestsrv@v2.9.0

      - name: Set up a Memcached server
        run: docker run -d --rm -p 11211:11211 memcached:1.6-alpine

      - name: Make
        run: |
          make
          make clean

      - name: Install Hugo
        run: |
          wget -O /tmp/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-amd64.deb
          sudo dpkg -i /tmp/hugo.deb

      - name: Build Documentation
        run: make docs-build


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    tags:
      - v*

permissions:
  # Allow the workflow to write attestations.
  id-token: write
  attestations: write

jobs:

  release:
    name: Release version
    runs-on: ubuntu-latest
    env:
      GO_VERSION: stable
      CGO_ENABLED: 0

    steps:
      # temporary workaround for an error in free disk space action
      # https://github.com/jlumbroso/free-disk-space/issues/14
      - name: Update Package List and Remove Dotnet
        run: |
          sudo apt-get update
          sudo apt-get remove -y '^dotnet-.*'

      # https://github.com/marketplace/actions/free-disk-space-ubuntu
      - name: Free Disk Space
        uses: jlumbroso/free-disk-space@main
        with:
          # this might remove tools that are actually needed
          tool-cache: false

          # all of these default to true
          android: true
          dotnet: true
          haskell: true
          large-packages: true
          docker-images: true
          swap-storage: false

      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Docker Login
        env:
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
        run: echo "${DOCKER_PASSWORD}" | docker login --username "${DOCKER_USERNAME}" --password-stdin

      - name: Install snapcraft
        run: sudo snap install snapcraft --classic

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      # https://goreleaser.com/ci/actions/
      - name: Run GoReleaser
        id: goreleaser
        uses: goreleaser/goreleaser-action@v6
        with:
          version: v2.13.0
          args: release -p 1 --clean --timeout=90m
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN_REPO }}
          SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
          AUR_KEY: ${{ secrets.AUR_KEY }}

      - uses: actions/attest-build-provenance@v3
        with:
          subject-checksums: ./dist/lego_${{ fromJSON(steps.goreleaser.outputs.metadata).version }}_checksums.txt
          github-token: ${{ secrets.GH_TOKEN_REPO }}
      - uses: actions/attest-build-provenance@v3
        with:
          subject-checksums: ./dist/digests.txt
          github-token: ${{ secrets.GH_TOKEN_REPO }}


================================================
FILE: .gitignore
================================================
.lego
.gitcookies
.idea
.vscode/
dist/
builds/


================================================
FILE: .golangci.yml
================================================
version: "2"

formatters:
  enable:
    - gci
    - gofmt
    - gofumpt
    - goimports
  settings:
    gofumpt:
      extra-rules: true
    gofmt:
      rewrite-rules:
        - pattern: 'interface{}'
          replacement: 'any'

linters:
  default: all
  disable:
    - wsl # Deprecated
    - bodyclose
    - canonicalheader
    - contextcheck
    - cyclop # duplicate of gocyclo
    - dupl # not relevant
    - err113 # not relevant
    - errchkjson
    - errname
    - exhaustive # not relevant
    - exhaustruct # not relevant
    - forbidigo
    - forcetypeassert
    - gosec
    - gosmopolitan # not relevant
    - ireturn # not relevant
    - lll
    - makezero # not relevant
    - mnd
    - musttag # false-positive https://github.com/junk1tm/musttag/issues/17
    - nestif # too many false-positive
    - nilnil # not relevant
    - nlreturn # not relevant
    - noctx
    - noinlineerr # too strict
    - nonamedreturns
    - paralleltest # not relevant
    - prealloc # too many false-positive
    - rowserrcheck # not relevant (SQL)
    - sqlclosecheck # not relevant (SQL)
    - tagliatelle
    - testpackage # not relevant
    - tparallel # not relevant
    - varnamelen # not relevant
    - wrapcheck

  settings:
    depguard:
      rules:
        main:
          deny:
            - pkg: github.com/instana/testify
              desc: not allowed
            - pkg: github.com/pkg/errors
              desc: Should be replaced by standard lib errors package
    funlen:
      lines: -1
      statements: 50
    goconst:
      min-len: 3
      min-occurrences: 3
    gocritic:
      disabled-checks:
        - paramTypeCombine # already handle by gofumpt.extra-rules
        - whyNoLint # already handle by nonolint
        - unnamedResult
        - hugeParam
        - sloppyReassign
        - rangeValCopy
        - octalLiteral
        - ptrToRefParam
        - appendAssign
        - ruleguard
        - httpNoBody
        - exposedSyncMutex
      enabled-tags:
        - diagnostic
        - style
        - performance
    gocyclo:
      min-complexity: 12
    godox:
      keywords:
        - FIXME
    govet:
      disable:
        - fieldalignment
      enable-all: true
      settings:
        printf:
          funcs:
            - Print
            - Printf
            - Warn
            - Warnf
            - Fatal
            - Fatalf
    misspell:
      locale: US
      ignore-rules:
        - internetbs
    perfsprint:
      err-error: true
      errorf: true
      sprintf1: true
      strconcat: false
    revive:
      rules:
        - name: struct-tag
        - name: blank-imports
        - name: context-as-argument
        - name: context-keys-type
        - name: dot-imports
        - name: error-return
        - name: error-strings
        - name: error-naming
        - name: exported
          disabled: true
        - name: if-return
        - name: increment-decrement
        - name: var-naming
        - name: var-declaration
        - name: package-comments
          disabled: true
        - name: range
        - name: receiver-naming
        - name: time-naming
        - name: unexported-return
        - name: indent-error-flow
        - name: errorf
        - name: empty-block
        - name: superfluous-else
        - name: unused-parameter
          disabled: true
        - name: unreachable-code
        - name: redefines-builtin-id
    tagalign:
      align: false
      order:
        - xml
        - json
        - yaml
        - yml
        - toml
        - mapstructure
        - url
    testifylint:
      disable:
        - require-error
        - go-require
    usetesting:
      os-setenv: false # we already have a test "framework" to handle env vars
    funcorder:
      struct-method: false

  exclusions:
    warn-unused: true
    presets:
      - comments
      - std-error-handling
    paths:
      # Those elements are related to code borrowed from the official HuaweiCloud API client.
      - providers/dns/huaweicloud/internal
    rules:
      - path: (.+)_test.go
        linters:
          - funlen
          - goconst
          - maintidx
      - path: (.+)_test.go
        text: Error return value of `fmt.Fprintln` is not checked
        linters:
          - errcheck
      - text: "var-naming: avoid meaningless package names"
        linters:
          - revive
      - text: "var-naming: avoid package names that conflict with Go standard library package names"
        linters:
          - revive
      - path: certcrypto/crypto.go
        text: (tlsFeatureExtensionOID|ocspMustStapleFeature) is a global variable
        linters:
          - gochecknoglobals
      - path: challenge/dns01/nameserver.go
        text: (defaultNameservers|recursiveNameservers|fqdnSoaCache|muFqdnSoaCache) is a global variable
        linters:
          - gochecknoglobals
      - path: challenge/dns01/nameserver_.+.go
        text: dnsTimeout is a global variable
        linters:
          - gochecknoglobals
      - path: challenge/dns01/precheck.go
        text: defaultNameserverPort is a global variable
        linters:
          - gochecknoglobals
      - path: challenge/http01/domain_matcher.go
        text: cyclomatic complexity \d+ of func `parseForwardedHeader` is high
        linters:
          - gocyclo
      - path: challenge/http01/domain_matcher.go
        text: Function 'parseForwardedHeader' has too many statements
        linters:
          - funlen
      - path: challenge/tlsalpn01/tls_alpn_challenge.go
        text: idPeAcmeIdentifierV1 is a global variable
        linters:
          - gochecknoglobals
      - path: log/logger.go
        text: Logger is a global variable
        linters:
          - gochecknoglobals
      - path: e2e/(dnschallenge/)?[\d\w]+_test.go
        text: load is a global variable
        linters:
          - gochecknoglobals
      - path: providers/(dns|http)/([\d\w]+/)*[\d\w]+_test.go
        text: envTest is a global variable
        linters:
          - gochecknoglobals
      - path: providers/dns/namecheap/namecheap_test.go
        text: testCases is a global variable
        linters:
          - gochecknoglobals
      - path: providers/dns/namecheap/transport.go
        text: (envProxyOnce|envProxyFuncValue) is a global variable
        linters:
          - gochecknoglobals
      - path: providers/dns/acmedns/mock_test.go
        text: egTestAccount is a global variable
        linters:
          - gochecknoglobals
      - path: providers/http/memcached/memcached_test.go
        text: memcachedHosts is a global variable
        linters:
          - gochecknoglobals
      - path: providers/dns/checkdomain/internal/types.go
        text: '`payed` is a misspelling of `paid`'
        linters:
          - misspell
      - path: platform/tester/env_test.go
        linters:
          - thelper
      - path: providers/dns/oraclecloud/oraclecloud_test.go
        text: 'SA1019: x509.EncryptPEMBlock has been deprecated since Go 1.16'
        linters:
          - staticcheck
      - path: providers/dns/sakuracloud/wrapper.go
        text: mu is a global variable
        linters:
          - gochecknoglobals
      - path: cmd/cmd_renew.go
        text: cyclomatic complexity \d+ of func `(renewForDomains|renewForCSR)` is high
        linters:
          - gocyclo
      - path: cmd/cmd_renew.go
        text: Function 'renewForDomains' has too many statements
        linters:
          - funlen
      - path: providers/dns/cpanel/cpanel.go
        text: cyclomatic complexity 13 of func `\(\*DNSProvider\)\.CleanUp` is high
        linters:
          - gocyclo
      - path: providers/dns/manual/manual.go
        text: 'SA1019: dns01.DNSProviderManual is deprecated'
        linters:
          - staticcheck
      # Those elements have been replaced by non-exposed structures.
      - path: providers/dns/linode/linode_test.go
        text: 'SA1019: linodego\.(DomainsPagedResponse|DomainRecordsPagedResponse) is deprecated'
        linters:
          - staticcheck

issues:
  max-issues-per-linter: 0
  max-same-issues: 0


================================================
FILE: .goreleaser.yml
================================================
version: 2

project_name: lego

builds:
  - binary: lego

    main: ./cmd/lego/
    env:
      - CGO_ENABLED=0
    flags:
      - -trimpath
    ldflags:
      - -s -w -X main.version={{.Version}}

    goos:
      - linux
      - darwin
      - windows
      - freebsd
      - openbsd
      - solaris
    goarch:
      - amd64
      - 386
      - arm
      - arm64
      - mips
      - mipsle
      - mips64
      - mips64le
    goarm:
      - 7
      - 6
      - 5
    gomips:
      - hardfloat
      - softfloat

    ignore:
      - goos: darwin
        goarch: 386
      - goos: openbsd
        goarch: arm
      # Deprecated in go1.25, Removed in go1.26
      # https://go.dev/doc/go1.25#windows
      - goos: windows
        goarch: arm

changelog:
  sort: asc
  filters:
    exclude:
      - '(?i)^chore:'
      - '(?i)^Detach v[\d|.]+'
      - '(?i)^Prepare release v[\d|.]+'

release:
  skip_upload: false
  github:
    owner: 'go-acme'
    name: 'lego'
  header: |
    lego is an independent, free, and open-source project, if you value it, consider [supporting it](https://donate.ldez.dev)! ❤️
    
    Everybody thinks that the others will donate, but in the end, nobody does.
    
    So if you think that lego is worth it, please consider [donating](https://donate.ldez.dev).
    
    For key updates, see the [changelog](https://github.com/go-acme/lego/blob/HEAD/CHANGELOG.md#v{{ .Major }}{{ .Minor }}{{ .Patch }}).

archives:
  - id: lego
    name_template: '{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}'
    formats: ['tar.gz']
    format_overrides:
      - goos: windows
        formats: ['zip']
    files:
      - LICENSE
      - CHANGELOG.md

dockers_v2:
  - images:
      - 'goacme/lego'
    dockerfile: buildx.Dockerfile
    platforms:
      - linux/amd64
      - linux/arm64
      - linux/arm/v7
    tags:
      - 'latest'
      - 'v{{ .Major }}'
      - 'v{{ .Major }}.{{ .Minor }}'
      - '{{ .Tag }}'
    labels:
      # https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
      'org.opencontainers.image.title': '{{.ProjectName}}'
      'org.opencontainers.image.description': 'Lets Encrypt/ACME client and library written in Go'
      'org.opencontainers.image.source': '{{.GitURL}}'
      'org.opencontainers.image.url': '{{.GitURL}}'
      'org.opencontainers.image.documentation': 'https://go-acme.github.io/lego'
      'org.opencontainers.image.created': '{{.Date}}'
      'org.opencontainers.image.revision': '{{.FullCommit}}'
      'org.opencontainers.image.version': '{{.Version}}'

snapcrafts:
  - name_template: "{{ .ProjectName }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
    disable: false
    publish: true
    grade: stable
    confinement: strict
    license: MIT
    base: core22
    summary: Lego is a Let's Encrypt/ACME client.
    description: |
      Lego is a Let's Encrypt/ACME client written in Go.
      
      The lego snap makes it easy to install and use Lego on any Linux distribution that supports snaps.
      
      Usage:
      * `sudo snap install lego`
      * `sudo lego --email="you@example.com" --domains="example.com" --server=https://acme-staging-v02.api.letsencrypt.org/directory --http --http.port :8080 run
    apps:
      lego:
        command: lego
        environment:
          LEGO_PATH: /var/snap/lego/common/.lego
        plugs:
          - network-bind

aurs:
  - description: "Let s Encrypt client and ACME library written in Go"
    skip_upload: false
    homepage: https://go-acme.github.io/lego/
    name: 'lego-bin'
    provides:
      - lego
    maintainers:
      - "Fernandez Ludovic <lfernandez dot dev at gmail dot com>"
    license: APACHE
    private_key: "{{ .Env.AUR_KEY }}"
    git_url: "ssh://aur@aur.archlinux.org/lego-bin.git"
    commit_author:
      name: ldez
      email: ldez@users.noreply.github.com
    package: |-
      # Bin
      install -Dm755 "./lego" "${pkgdir}/usr/bin/lego"

      # License
      install -Dm644 "./LICENSE" "${pkgdir}/usr/share/licenses/lego/LICENSE"


================================================
FILE: CHANGELOG.md
================================================
# Changelog

lego is an independent, free, open-source project, if you value it, consider [supporting it](https://donate.ldez.dev)! ❤️

Everybody thinks that the others will donate, but in the end, nobody does.

So if you think that lego is worth it, please consider [donating](https://donate.ldez.dev).

## v4.33.0

- Release date: 2026-03-19
- Tag: [v4.33.0](https://github.com/go-acme/lego/releases/tag/v4.33.0)

### Added

- **[dnsprovider]** Add DNS provider for Excedo
- **[dnsprovider]** Add DNS provider for EuroDNS
- **[dnsprovider]** Add DNS provider for Czechia

### Changed

- **[lib]** feat: allow to Unwrap obtainError

### Fixed

- **[dnsprovider]** liara: add support for team ID
- **[dnsprovider]** gigahostno: remove unused Zone fields

## v4.32.0

- Release date: 2026-02-19
- Tag: [v4.32.0](https://github.com/go-acme/lego/releases/tag/v4.32.0)

### Added

- **[dnsprovider]** Add DNS provider for ArtFiles
- **[dnsprovider]** Add DNS provider for Leaseweb
- **[dnsprovider]** Add DNS provider for FusionLayer NameSurfer
- **[dnsprovider]** Add DNS provider for DDNSS
- **[dnsprovider]** Add DNS provider for Bluecat v2
- **[dnsprovider]** Add DNS provider for TodayNIC/时代互联
- **[dnsprovider]** Add DNS provider for DNSExit
- **[dnsprovider]** alidns: add line record option

### Changed

- **[dnsprovider]** azure: reinforces deprecation
- **[dnsprovider]** allinkl: detect zone through API

### Fixed

- **[ari]** fix: implement parsing for Retry-After header according to RFC 7231
- **[dnsprovider]** namesurfer: fix updateDNSHost
- **[dnsprovider]** timewebcloud: fix subdomain support
- **[dnsprovider]** fix: deduplicate authz for DNS01 challenge
- **[lib,cli]** fix: use IPs to define the main domain
- **[lib]** fix: preserve domain order

## v4.31.0

- Release date: 2026-01-08
- Tag: [v4.31.0](https://github.com/go-acme/lego/releases/tag/v4.31.0)

### Added

- **[dnsprovider]** Add DNS provider for ISPConfig
- **[dnsprovider]** Add DNS Provider for ISPConfig (DDNS Module)
- **[dnsprovider]** Add DNS provider for Alwaysdata
- **[dnsprovider]** Add DNS provider for JDCloud
- **[dnsprovider]** Add DNS provider for 35.com/三五互联
- **[dnsprovider]** f5xc: add an option to configure the domain of the server

### Changed

- **[lib]** feat: improve ACME error types
- **[dnsprovider,cname]** namedotcom: follow CNAME

### Fixed

- **[dnsprovider]** hetzner: fix compatibility with _FILE suffix
- **[dnsprovider]** gandiv5: fix API Key header

## v4.30.1

- Release date: 2025-12-16
- Tag: [v4.30.1](https://github.com/go-acme/lego/releases/tag/v4.30.1)

Due to an error related to `aliyun/credentials-go`, some artifacts of the v4.30.0 release have not been published.

This release contains the same things as v4.30.0.

## v4.30.0

- Release date: 2025-12-16
- Tag: [v4.30.0](https://github.com/go-acme/lego/releases/tag/v4.30.0)

### Added

- **[dnsprovider]** Add DNS provider for Ionos Cloud
- **[dnsprovider]** Add DNS provider for Virtualname
- **[dnsprovider]** Add DNS Provider for Neodigit
- **[dnsprovider]** Add DNS provider for Syse.no
- **[dnsprovider]** Add DNS provider for Gravity
- **[dnsprovider]** Add DNS provider for hosting.nl

### Changed

- **[cli]** feat: remove email requirement

### Fixed

- **[dnsprovider]** autodns: use the right response structure

## v4.29.0

- Release date: 2025-11-29
- Tag: [v4.29.0](https://github.com/go-acme/lego/releases/tag/v4.29.0)

### Added
 
- **[dnsprovider]** Add DNS provider for United-Domains
- **[dnsprovider]** Add DNS provider for Gigahost.no
- **[dnsprovider]** Add DNS provider for EdgeCenter
- **[dnsprovider]** Add DNS provider for AlibabaCloud ESA
- **[dnsprovider]** edgeone: add zones mapping
- **[dnsprovider]** namecheap: add experimental proxy support

### Changed

- **[dnsprovider]** gandiv5: update base API URL

### Fixed

- **[dnsprovider]** hetzner: use int64 for IDs
- **[dnsprovider]** baiducloud: pagination and TTL
- **[dnsprovider]** inwx: fix API breaking changes with record IDs

## v4.28.1

- Release date: 2025-11-06
- Tag: [v4.28.1](https://github.com/go-acme/lego/releases/tag/v4.28.1)

### Fixed

- **[cli]** fix: skip nil response

## v4.28.0

- Release date: 2025-10-31
- Tag: [v4.28.0](https://github.com/go-acme/lego/releases/tag/v4.28.0)

### Added

- **[dnsprovider]** Add DNS provider for Anexia
- **[dnsprovider]** Add DNS provider for webnames.ca
- **[dnsprovider]** webnames: rename to webnamesru to avoid ambiguity with webnamesca

### Changed

- **[dnsprovider,log]** hetzner: add deprecation logs
- **[dnsprovider]** iwantmyname: provider deprecation
- **[cli]** improve retryable HTTP client error handling

### Fixed

- **[dnsprovider]** hostinger: fix record update

## v4.27.0

- Release date: 2025-10-17
- Tag: [v4.27.0](https://github.com/go-acme/lego/releases/tag/v4.27.0)

### Added

- **[dnsprovider]** Add DNS provider for Octenium
- **[dnsprovider]** Add DNS provider for Hostinger
- **[dnsprovider]** Add DNS provider for Beget.com

### Changed

- **[cli]** support `--private-key` with a PKCS#8 keypair
- **[dnsprovider]** hetzner: update to new API
- **[dnsprovider]** otc: adds option to use private zone

### Fixed

- **[lib]** fix: deduplicate order identifiers

## v4.26.0

- Release date: 2025-09-13
- Tag: [v4.26.0](https://github.com/go-acme/lego/releases/tag/v4.26.0)

### Added

- **[dnsprovider]** Add DNS provider for KeyHelp
- **[dnsprovider]** Add DNS provider for Binary Lane
- **[dnsprovider]** Add DNS provider for Tencent EdgeOne
- **[dnsprovider]** azuredns: pipeline credential support
- **[dnsprovider]** oraclecloud: handle instance_principal authentication

### Changed

- **[dnsprovider]** oraclecloud: add env var aliases
- **[dnsprovider]** simply: update to API v2
- **[lib,cli]** EAB: fallback to base64.URLEncoding

### Fixed

- **[dnsprovider]** selectelv2: add missing options

## v4.25.2

- Release date: 2025-08-06
- Tag: [v4.25.2](https://github.com/go-acme/lego/releases/tag/v4.25.2)

### Changed

- **[cli,log]** log when dynamic renew date not yet reached

### Fixed

- **[cli]** fix: remove wrong env var
- **[lib,cli]** fix: enforce HTTPS to the ACME server

## v4.25.1

- Release date: 2025-07-21
- Tag: [v4.25.1](https://github.com/go-acme/lego/releases/tag/v4.25.1)

### Fixed

- **[cli]** fix: wrong CLI flag type

## v4.25.0

- Release date: 2025-07-21
- Tag: [v4.25.0](https://github.com/go-acme/lego/releases/tag/v4.25.0)

The binary size of this release is about ~50% smaller compared to previous releases.

This will also reduce the module cache usage by 320 MB (this will only affect users of lego as a library or who build lego themselves).

### Added

- **[dnsprovider]** Add DNS provider for ZoneEdit
- **[cli]** Add an option to define dynamically the renew date
- **[lib,cli]** Add an option to disable common name in CSR

### Changed

- **[dnsprovider]** vinyldns: add an option to add quotes around the TXT record value
- **[dnsprovider]** ionos: increase default propagation timeout

### Fixed

- **[cli]** fix: enforce domain into renewal command

## v4.24.0

- Release date: 2025-07-07
- Tag: [v4.24.0](https://github.com/go-acme/lego/releases/tag/v4.24.0)

### Added

- **[dnsprovider]** Add DNS provider for Azion
- **[dnsprovider]** Add DNS provider for DynDnsFree.de
- **[dnsprovider]** Add DNS provider for ConoHa v3
- **[dnsprovider]** Add DNS provider for RU Center
- **[dnsprovider]** gcloud: add service account impersonation

### Changed

- **[dnsprovider]** pdns: improve error messages
- **[dnsprovider]** cloudflare: add quotation marks to TXT record
- **[dnsprovider]** googledomains: provider deprecation
- **[dnsprovider]** mijnhost: improve record filter

### Fixed

- **[dnsprovider]** exoscale: fix find record
- **[dnsprovider]** nicmanager: fix mode env var name and value
- **[lib,cli]** Check order identifiers difference between client and server

## v4.23.1

- Release date: 2025-04-16
- Tag: [v4.23.1](https://github.com/go-acme/lego/releases/tag/v4.23.1)

Due to an error related to Snapcraft, some artifacts of the v4.23.0 release have not been published.

This release contains the same things as v4.23.0. 

## v4.23.0

- Release date: 2025-04-16
- Tag: [v4.23.0](https://github.com/go-acme/lego/releases/tag/v4.23.0)

### Added

- **[dnsprovider]** Add DNS provider for Active24
- **[dnsprovider]** Add DNS provider for BookMyName
- **[dnsprovider]** Add DNS provider for Axelname
- **[dnsprovider]** Add DNS provider for Baidu Cloud
- **[dnsprovider]** Add DNS provider for Metaregistrar
- **[dnsprovider]** Add DNS provider for F5 XC
- **[dnsprovider]** Add INFOBLOX_CA_CERTIFICATE option
- **[dnsprovider]** route53: adds option to use private zone
- **[dnsprovider]** edgedns: add account switch key option
- **[dnsprovider]** infoblox: update API client to v2
- **[lib,cli]** Add delay option for TLSALPN challenge

### Changed

- **[dnsprovider]** designate: speed up API requests by using filters
- **[dnsprovider]** cloudflare: make base URL configurable
- **[dnsprovider]** websupport: migrate to API v2
- **[dnsprovider]** dnssimple: use GetZone

### Fixed

- **[ari]** Fix retry on `alreadyReplaced` error
- **[cli,log]** Fix malformed log messages
- **[cli]** Kill hook when the command is stuck
- **[dnsprovider]** pdns: fix TXT record cleanup for wildcard domains
- **[dnsprovider]** allinkl: remove `ReturnInfo`

## v4.22.2

- Release date: 2025-02-17
- Tag: [v4.22.2](https://github.com/go-acme/lego/releases/tag/v4.22.2)

### Fixed

- **[dnsprovider]** acme-dns: use new registred account

## v4.22.1

- Release date: 2025-02-17
- Tag: [v4.22.1](https://github.com/go-acme/lego/releases/tag/v4.22.1)

### Fixed

- **[dnsprovider]** acme-dns: continue the process when the CNAME is handled by the storage

### Added

## v4.22.0

- Release date: 2025-02-17
- Tag: [v4.22.0](https://github.com/go-acme/lego/releases/tag/v4.22.0)

### Added

- **[cli]** Add `--private-key` flag to set the private key.
- **[cli]** Add `LEGO_DEBUG_ACME_HTTP_CLIENT` environment variable to debug the calls to the ACME server.
- **[cli]** Add `LEGO_EMAIL` environment variable for specifying email.
- **[cli]** Add `--hook-timeout` flag to run and renew commands.
- **[dnsprovider]** Add DNS provider for myaddr.{tools,dev,io}
- **[dnsprovider]** Add DNS provider for Spaceship
- **[dnsprovider]** acme-dns: add HTTP storage
- **[lib,cli,httpprovider]** Add `--http.delay` option for HTTP challenge.
- **[lib,cli,profiles]** Add support for Profiles Extension.
- **[lib]** Add an option to set CSR email addresses

### Changed

- **[lib]** rewrite status management
- **[dnsprovider]** docs: improve units and default values

### Removed

- **[dnsprovider]** netcup: remove TTL option

### Fixed

- **[cli,log]** remove extra debug logs

## v4.21.0

- Release date: 2024-12-20
- Tag: [v4.21.0](https://github.com/go-acme/lego/releases/tag/v4.21.0)

### Added

- **[dnsprovider]** Add DNS provider for Rainyun/雨云
- **[dnsprovider]** Add DNS provider for West.cn/西部数码
- **[dnsprovider]** Add DNS provider for ManageEngine CloudDNS
- **[cli]** feat: add --force-cert-domains flag to renew

### Fixed

- **[cli]** create client only when needed
- **[cli]** clone the transport with tls-skip-verify
- **[cli]** use retryable client for ACME server calls
- **[dnsprovider]** bunny: fix zone detection
- **[dnsprovider]** inwx: delete only the TXT record related to the DNS challenge
- **[dnsprovider]** infomaniak: increase default propagation timeout
- **[dnsprovider]** dnsmadeeasy: use default transport
- **[dnsprovider]** netcup: increase default propagation values
- **[dnsprovider]** otc: use default transport

## v4.20.4

- Release date: 2024-11-21
- Tag: [v4.20.4](https://github.com/go-acme/lego/releases/tag/v4.20.4)

Publish the Snap to the Snapcraft stable channel.

## v4.20.3

- Release date: 2024-11-21
- Tag: [v4.20.3](https://github.com/go-acme/lego/releases/tag/v4.20.3)

### Fixed

- **[dnsprovider]** technitium: fix status code handling
- **[dnsprovider]** directadmin: fix timeout configuration
- **[httpprovider]** fix: HTTP server IPv6 matching

## v4.20.2

- Release date: 2024-11-11
- Tag: [v4.20.2](https://github.com/go-acme/lego/releases/tag/v4.20.2)

### Added

- **[dnsprovider]** Add DNS provider for Technitium
- **[dnsprovider]** Add DNS provider for Regfish
- **[dnsprovider]** Add DNS provider for Timeweb Cloud
- **[dnsprovider]** Add DNS provider for Volcano Engine
- **[dnsprovider]** Add DNS provider for Core-Networks
- **[dnsprovider]** rfc2136: add support for tsig-keygen generated file
- **[cli]** Add option to skip the TLS verification of the ACME server
- Add documentation for env var only options

### Changed

- **[cli,ari]** Attempt to check ARI unless explicitly disabled
- **[dnsprovider]** Improve propagation check error messages
- **[dnsprovider]** cloudxns: provider deprecation
- **[dnsprovider]** brandit: provider deprecation

### Fixed

- **[dnsprovider]** regru: update authentication method
- **[dnsprovider]** selectelv2: fix non-ASCII domain
- **[dnsprovider]** limacity: fix error message
- **[dnsprovider]** volcengine: set API information within the default configuration
- **[log]** Parse printf verbs in log line output

## v4.20.1

- Release date: 2024-11-11

Cancelled due to CI failure.

## v4.20.0

- Release date: 2024-11-11

Cancelled due to CI failure.

## v4.19.2

- Release date: 2024-10-06
- Tag: [v4.19.2](https://github.com/go-acme/lego/releases/tag/v4.19.2)

### Fixed

- **[lib]** go1.22 compatibility

## v4.19.1

- Release date: 2024-10-06
- Tag: [v4.19.1](https://github.com/go-acme/lego/releases/tag/v4.19.1)

### Fixed

- **[dnsprovider]** selectelv2: use baseURL from configuration
- **[dnsprovider]** epik: add User-Agent

## v4.19.0

- Release date: 2024-10-03
- Tag: [v4.19.0](https://github.com/go-acme/lego/releases/tag/v4.19.0)

### Added

- **[dnsprovider]** Add DNS provider for HuaweiCloud
- **[dnsprovider]** Add DNS provider for SelfHost.(de|eu)
- **[lib,cli,dnsprovider]** Add `dns.propagation-rns` option
- **[cli,dnsprovider]** Add `dns.propagation-wait` flag
- **[lib,dnsprovider]** Add `PropagationWait` function

### Changed

- **[dnsprovider]** ionos: follow CNAME
- **[lib,dnsprovider]** Reducing the lock strength of the soa cache entry
- **[lib,cli,dnsprovider]** Deprecation of `dns.disable-cp`, replaced by `dns.propagation-disable-ans`.

### Fixed

- **[dnsprovider]** Use UTC instead of GMT when possible
- **[dnsprovider]** namesilo: restrict CleanUp
- **[dnsprovider]** godaddy: fix cleanup

## v4.18.0

- Release date: 2024-08-30
- Tag: [v4.18.0](https://github.com/go-acme/lego/releases/tag/v4.18.0)

### Added

- **[dnsprovider]** Add DNS provider for mijn.host
- **[dnsprovider]** Add DNS provider for Lima-City
- **[dnsprovider]** Add DNS provider for DirectAdmin
- **[dnsprovider]** Add DNS provider for Mittwald
- **[lib,cli]** feat: add option to handle the overall request limit
- **[lib]** feat: expose certificates pool creation

### Changed

- **[cli]** feat: add LEGO_ISSUER_CERT_PATH to run hook
- **[dnsprovider]** bluecat: skip deploy
- **[dnsprovider]** ovh: allow to use ovh.conf file
- **[dnsprovider]** designate: allow manually overwriting DNS zone

### Fixed

- **[ari]** fix: avoid Int63n panic in ShouldRenewAt()

## v4.17.4

- Release date: 2024-06-12
- Tag: [v4.17.4](https://github.com/go-acme/lego/releases/tag/v4.17.4)

### Fixed

- **[dnsprovider]** Update dependencies

## v4.17.3

- Release date: 2024-05-28
- Tag: [v4.17.3](https://github.com/go-acme/lego/releases/tag/v4.17.3)

### Added

- **[dnsprovider]** Add DNS provider for Selectel v2
- **[dnsprovider]** route53: adds option to not wait for changes
- **[dnsprovider]** ovh: add OAuth2 authentication
- **[dnsprovider]** azuredns: use TenantID also for cli authentication
- **[dnsprovider]** godaddy: documentation about new API limitations
- **[cli]** feat: add LEGO_ISSUER_CERT_PATH to hook

### Changed

- **[dnsprovider]** dode: update API URL
- **[dnsprovider]** exec: stream command output
- **[dnsprovider]** oracle: update API client
- **[dnsprovider]** azuredns: servicediscovery for zones
- **[dnsprovider]** scaleway: add alternative env var names
- **[dnsprovider]** exoscale: simplify record creation
- **[dnsprovider]** httpnet: add provider to NewDNSChallengeProviderByName
- **[cli]** feat: fills LEGO_CERT_PFX_PATH and LEGO_CERT_PEM_PATH only when needed
- **[lib,ari]** feat: renewal retry after value

### Fixed

- **[dnsprovider]** pdns: reconstruct zone URLs to enable non-root folder API endpoints
- **[dnsprovider]** alidns: fix link to API documentation

## v4.17.2

- Release date: 2024-05-28

Canceled due to a release failure related to Snapcraft.

The Snapcraft release are disabled for now.

## v4.17.1

- Release date: 2024-05-28

Canceled due to a release failure related to oci-go-sdk.

The module `github.com/oracle/oci-go-sdk/v65` uses `github.com/gofrs/flock` but flock doesn't support some platform (like Solaris):
- https://github.com/gofrs/flock/issues/60

Due to that we will remove the Solaris build.

## v4.17.0

- Release date: 2024-05-28

Canceled due to a release failure related to Snapcraft.

## v4.16.1

- Release date: 2024-03-10
- Tag: [v4.16.1](https://github.com/go-acme/lego/releases/tag/v4.16.1)

### Fixed

- **[cli,ari]** fix: don't generate ARI cert ID if ARI is not enable

## v4.16.0

- Release date: 2024-03-09
- Tag: [v4.16.0](https://github.com/go-acme/lego/releases/tag/v4.16.0)

### Added

- **[dnsprovider]** Add DNS provider for Shellrent
- **[dnsprovider]** Add DNS provider for Mail-in-a-Box
- **[dnsprovider]** Add DNS provider for CPanel and WHM

### Changed

- **[lib,ari]** Implement 'replaces' field in newOrder and draft-ietf-acme-ari-03 CertID changes
- **[log]** feat: improve errors and logs related to DNS call
- **[lib]** update to go-jose/go-jose/v4 v4.0.1

### Fixed

- **[dnsprovider]** nifcloud: fix bug in case of same auth zone
- **[dnsprovider]** bunny: Support delegated subdomains
- **[dnsprovider]** easydns: fix zone detection
- **[dnsprovider]** ns1: fix record creation

## v4.15.0

- Release date: 2024-01-28
- Tag: [v4.15.0](https://github.com/go-acme/lego/releases/tag/v4.15.0)

### Added

- **[dnsprovider]** Add DNS provider for http.net
- **[dnsprovider]** Add DNS provider for Webnames

### Changed

- **[cli]** Add environment variable for specifying alternate directory URL
- **[cli]** Add format option for PFX encoding
- **[lib]** Support simplified issuance for very long domain names at Let's Encrypt
- **[lib]** Update CertID format as per draft-ietf-acme-ari-02
- **[dnsprovider]** azuredns: allow OIDC authentication
- **[dnsprovider]** azuredns: provide the ability to select authentication methods
- **[dnsprovider]** efficientip: add insecure skip verify option
- **[dnsprovider]** gandiv5: add Personal Access Token support
- **[dnsprovider]** gcloud: support GCE_ZONE_ID to bypass zone list
- **[dnsprovider]** liquidweb: add LWAPI_ prefix for env vars
- **[dnsprovider]** liquidweb: detect zone automatically
- **[dnsprovider]** pdns: optional custom API version
- **[dnsprovider]** regru: client certificate support
- **[dnsprovider]** regru: HTTP method changed to POST
- **[dnsprovider]** scaleway: add cname support

### Fixed

- **[dnsprovider]** cloudru: change default URLs
- **[dnsprovider]** constellix: follow rate limiting headers
- **[dnsprovider]** desec: increase default propagation interval
- **[dnsprovider]** gandiv5: Add "Bearer" prefix to the auth header
- **[dnsprovider]** inwx: improve sleep calculation
- **[dnsprovider]** inwx: wait before generating new TOTP TANs
- **[dnsprovider]** ionos: fix DNS record removal
- **[dnsprovider]** ipv64: remove unused option
- **[dnsprovider]** nifcloud: fix API requests
- **[dnsprovider]** otc: sequential challenge

## v4.14.1

- Release date: 2023-09-20
- Tag: [v4.14.1](https://github.com/go-acme/lego/releases/tag/v4.14.1)

### Fixed

- **[dnsprovider]** bunny: fix zone detection
- **[dnsprovider]** bunny: use NRDCG fork
- **[dnsprovider]** ovh: update client to v1.4.2

## v4.14.1

- Release date: 2023-09-19

Cancelled due to CI failure.

## v4.14.0

- Release date: 2023-08-20
- Tag: [v4.14.0](https://github.com/go-acme/lego/releases/tag/v4.14.0)

### Added

- **[dnsprovider]** Add DNS provider for Yandex 360
- **[dnsprovider]** Add DNS provider for cloud.ru
- **[httpprovider]** Adding S3 support for HTTP domain validation

### Changed

- **[cli]** Allow to set EAB kid and hmac via environment variables
- **[dnsprovider]** Migrate to aws-sdk-go-v2 (lightsail, route53)

### Fixed

- **[dnsprovider]** nearlyfreespeech: fix authentication
- **[dnsprovider]** pdns: fix notify
- **[dnsprovider]** route53: avoid unexpected records deletion

## v4.13.3

- Release date: 2023-07-25
- Tag: [v4.13.3](https://github.com/go-acme/lego/releases/tag/v4.13.3)

### Fixed

- **[dnsprovider]** azuredns: fix configuration from env vars
- **[dnsprovider]** gcore: change API domain

## v4.13.2

- Release date: 2023-07-21
- Tag: [v4.13.2](https://github.com/go-acme/lego/releases/tag/v4.13.2)

### Fixed

- **[dnsprovider]** servercow: fix regression

## v4.13.1

- Release date: 2023-07-20
- Tag: [v4.13.1](https://github.com/go-acme/lego/releases/tag/v4.13.1)

### Added

- **[dnsprovider]** Add DNS provider for IPv64
- **[dnsprovider]** Add DNS provider for Metaname
- **[dnsprovider]** Add DNS provider for RcodeZero
- **[dnsprovider]** Add DNS provider for Efficient IP
- **[dnsprovider]** azure: new implementation based on the new API client
- **[lib]** Experimental option to force DNS queries to use TCP

### Changed

- **[dnsprovider]** cloudflare: update api client to v0.70.0

### Fixed

- **[dnsprovider,cname]** fix: ensure case-insensitive comparison of CNAME records
- **[cli]** fix: list command
- **[lib]** fix: ARI explanationURL

## v4.13.0

- Release date: 2023-07-20

Cancelled due to a CI issue (no space left on device).

## v4.12.2

- Release date: 2023-06-19
- Tag: [v4.12.2](https://github.com/go-acme/lego/releases/tag/v4.12.2)

### Fixed

- **[dnsprovider]** dnsmadeeasy: fix DeleteRecord
- **[lib]** fix: read status code from response

## v4.12.1

- Release date: 2023-06-06
- Tag: [v4.12.1](https://github.com/go-acme/lego/releases/tag/v4.12.1)

### Fixed

- **[dnsprovider]** pdns: fix record value

## v4.12.0

- Release date: 2023-05-28
- Tag: [v4.12.0](https://github.com/go-acme/lego/releases/tag/v4.12.0)

### Added

- **[lib,cli]** Initial ACME Renewal Info (ARI) Implementation
- **[dnsprovider]** Add DNS provider for Derak Cloud
- **[dnsprovider]** route53: pass ExternalID property to STS:AssumeRole API operation
- **[lib,cli]** Support custom duration for certificate

### Changed

- **[dnsprovider]** Refactor DNS provider and client implementations

### Fixed

- **[dnsprovider]** autodns: fixes wrong zone in api call if CNAME is used
- **[cli]** fix: archive only domain-related files on revoke

## v4.11.0

- Release date: 2023-05-02
- Tag: [v4.11.0](https://github.com/go-acme/lego/releases/tag/v4.11.0)

### Added

- **[lib]** Support for certificate with raw IP SAN (RFC8738)
- **[dnsprovider]** Add Brandit.com as DNS provider
- **[dnsprovider]** Add DNS provider for Bunny
- **[dnsprovider]** Add DNS provider for Nodion
- **[dnsprovider]** Add Google Domains as DNS provider
- **[dnsprovider]** Add DNS provider for Plesk

### Changed

- **[cli]** feat: add LEGO_CERT_PEM_PATH and LEGO_CERT_PFX_PATH to run hook
- **[lib,cli]** feat: add RSA 3072
- **[dnsprovider]** gcloud: update google APIs to latest version
- **[lib,dnsprovider,cname]** chore: replace GetRecord by GetChallengeInfo

### Fixed

- **[dnsprovider]** rimuhosting: fix API base URL

## v4.10.2

- Release date: 2023-02-26
- Tag: [v4.10.2](https://github.com/go-acme/lego/releases/tag/v4.10.2)

Fix Docker image builds.

## v4.10.1

- Release date: 2023-02-25
- Tag: [v4.10.1](https://github.com/go-acme/lego/releases/tag/v4.10.1)

### Fixed

- **[dnsprovider,cname]** acmedns: fix CNAME support
- **[dnsprovider]** dynu: fix subdomain support

## v4.10.0

- Release date: 2023-02-10
- Tag: [v4.10.0](https://github.com/go-acme/lego/releases/tag/v4.10.0)

### Added

- **[dnsprovider]** Add DNS provider for dnsHome.de
- **[dnsprovider]** Add DNS provider for Liara
- **[dnsprovider]** Add DNS provider for UltraDNS
- **[dnsprovider]** Add DNS provider for Websupport

### Changed

- **[dnsprovider]** ibmcloud: add support for subdomains
- **[dnsprovider]** infomaniak: CNAME support
- **[dnsprovider]** namesilo: add cleanup before add a DNS record
- **[dnsprovider]** route53: Allow static credentials to be supplied
- **[dnsprovider]** tencentcloud: support punycode domain

### Fixed

- **[dnsprovider]** alidns: filter on record type
- **[dnsprovider]** arvancloud: replace arvancloud.com by arvancloud.ir
- **[dnsprovider]** hetzner: improve zone ID detection
- **[dnsprovider]** luadns: removed dot suffix from authzone while searching for zone
- **[dnsprovider]** pdns: fix usage of notify only when zone kind is Master or Slave
- **[dnsprovider]** return an error when extracting record name

## v4.9.1

- Release date: 2022-11-25
- Tag: [v4.9.1](https://github.com/go-acme/lego/releases/tag/v4.9.1)

### Changed

- **[lib,cname]** cname: add log about CNAME entries
- **[dnsprovider]** regru: improve error handling

### Fixed

- **[dnsprovider,cname]** fix CNAME support for multiple DNS providers
- **[dnsprovider,cname]** duckdns: fix CNAME support
- **[dnsprovider,cname]** oraclecloud: use fqdn to resolve zone
- **[dnsprovider]** hurricane: fix CNAME support
- **[lib,cname]** cname: stop trying to traverse cname if none have been found

## v4.9.0

- Release date: 2022-10-03
- Tag: [v4.9.0](https://github.com/go-acme/lego/releases/tag/v4.9.0)

### Added

- **[dnsprovider]** Add DNS provider for CIVO
- **[dnsprovider]** Add DNS provider for VK Cloud
- **[dnsprovider]** Add DNS provider for YandexCloud
- **[dnsprovider]** digitalocean: configurable base URL
- **[dnsprovider]** loopia: add configurable API endpoint
- **[dnsprovider]** pdns: notify secondary servers after updates

### Changed

- **[dnsprovider]** allinkl: removed deprecated sha1 hashing
- **[dnsprovider]** auroradns: update authentification
- **[dnsprovider]** dnspod: deprecated. Use Tencent Cloud instead.
- **[dnsprovider]** exoscale: migrate to API v2 endpoints
- **[dnsprovider]** gcloud: update golang.org/x/oauth2
- **[dnsprovider]** lightsail: cleanup
- **[dnsprovider]** sakuracloud: update api client library
- **[cname]** take out CNAME support from experimental features
- **[lib,cname]** add recursive CNAME lookup support
- **[lib]** Remove embedded issuer certificates from issued certificate if bundle is false

### Fixed

- **[dnsprovider]** luadns: fix cname support
- **[dnsprovider]** njalla: fix record id unmarshal error
- **[dnsprovider]** tencentcloud: fix subdomain error

## v4.8.0

- Release date: 2022-06-30
- Tag: [v4.8.0](https://github.com/go-acme/lego/releases/tag/v4.8.0)

### Added

- **[dnsprovider]** Add DNS provider for Variomedia
- **[dnsprovider]** Add NearlyFreeSpeech DNS Provider
- **[cli]** Add a --user-agent flag to lego-cli

### Changed

- new logo
- **[cli]** feat: sleep at renewal
- **[cli]** cli/renew: skip random sleep if stdout is a terminal
- **[dnsprovider]** hetzner: set min TTL to 60s
- **[docs]** refactoring and cleanup

## v4.7.0

- Release date: 2022-05-27
- Tag: [v4.7.0](https://github.com/go-acme/lego/releases/tag/v4.7.0)

### Added

- **[dnsprovider]** Add DNS provider for iwantmyname
- **[dnsprovider]** Add DNS Provider for IIJ DNS Platform Service
- **[dnsprovider]** Add DNS provider for Vercel
- **[dnsprovider]** route53: add assume role ARN
- **[dnsprovider]** dnsimple: add debug option
- **[cli]** feat: add `LEGO_CERT_PEM_PATH` and `LEGO_CERT_PFX_PATH`

### Changed

- **[dnsprovider]** gcore: change dns api url
- **[dnsprovider]** bluecat: rewrite provider implementation

### Fixed

- **[dnsprovider]** rfc2136: fix TSIG secret
- **[dnsprovider]** tencentcloud: fix InvalidParameter.DomainInvalid error when using DNS challenges
- **[lib]** fix: panic in certcrypto.ParsePEMPrivateKey

## v4.6.0

- Release date: 2022-01-18
- Tag: [v4.6.0](https://github.com/go-acme/lego/releases/tag/v4.6.0)

### Added

- **[dnsprovider]** Add DNS provider for UKFast SafeDNS
- **[dnsprovider]** Add DNS Provider for Tencent Cloud
- **[dnsprovider]** azure: add support for Azure Private Zone DNS
- **[dnsprovider]** exec: add sequence interval
- **[cli]** Add a `--pfx`, and `--pfx.pas`s option to generate a PKCS#12 (`.pfx`) file.
- **[lib]** Extended support of cert pool (`LEGO_CA_CERTIFICATES` and `LEGO_CA_SYSTEM_CERT_POOL`)
- **[lib,httpprovider]** added uds capability to http challenge server

### Changed

- **[lib]** Extend validity of TLS-ALPN-01 certificates to 365 days
- **[lib,cli]** Allows defining the reason for the certificate revocation

### Fixed

- **[dnsprovider]** mythicbeasts: fix token expiration
- **[dnsprovider]** rackspace: change zone ID to string

## v4.5.3

- Release date: 2021-09-06
- Tag: [v4.5.3](https://github.com/go-acme/lego/releases/tag/v4.5.3)

### Fixed

- **[lib,cli]** fix: missing preferred chain param for renew request

## v4.5.2

- Release date: 2021-09-01
- Tag: [v4.5.2](https://github.com/go-acme/lego/releases/tag/v4.5.2)

### Added

- **[dnsprovider]** Add DNS provider for all-inkl
- **[dnsprovider]** Add DNS provider for Epik
- **[dnsprovider]** Add DNS provider for freemyip.com
- **[dnsprovider]** Add DNS provider for g-core labs
- **[dnsprovider]** Add DNS provider for hosttech
- **[dnsprovider]** Add DNS Provider for IBM Cloud (SoftLayer)
- **[dnsprovider]** Add DNS provider for Internet.bs
- **[dnsprovider]** Add DNS provider for nicmanager

### Changed

- **[dnsprovider]** alidns: support ECS instance RAM role
- **[dnsprovider]** alidns: support sts token credential
- **[dnsprovider]** azure: zone name as environment variable
- **[dnsprovider]** ovh: follow cname
- **[lib,cli]** Add AlwaysDeactivateAuthorizations flag to ObtainRequest

### Fixed

- **[dnsprovider]** infomaniak: fix subzone support
- **[dnsprovider]** edgedns: fix Present and CleanUp logic
- **[dnsprovider]** lightsail: wrong Region env var name
- **[lib]** lib: fix backoff in SolverManager
- **[lib]** lib: use permanent error instead of context cancellation
- **[dnsprovider]** desec: bump to v0.6.0

## v4.5.1

- Release date: 2021-10-01

Cancelled due to a CI issue, replaced by v4.5.2.

## v4.5.0

- Release date: 2021-09-30

Cancelled due to a CI issue, replaced by v4.5.2.

## v4.4.0

- Release date: 2021-06-08
- Tag: [v4.4.0](https://github.com/go-acme/lego/releases/tag/v4.4.0)

### Added

- **[dnsprovider]** Add DNS provider for Infoblox
- **[dnsprovider]** Add DNS provider for Porkbun
- **[dnsprovider]** Add DNS provider for Simply.com
- **[dnsprovider]** Add DNS provider for Sonic
- **[dnsprovider]** Add DNS provider for VinylDNS
- **[dnsprovider]** Add DNS provider for wedos

### Changed

- **[cli]** log: Use stderr instead of stdout.
- **[dnsprovider]** hostingde: autodetection of the zone name.
- **[dnsprovider]** scaleway: use official SDK
- **[dnsprovider]** powerdns: several improvements
- **[lib]** lib: improve wait.For returns.

### Fixed

- **[dnsprovider]** hurricane: add API rate limiter.
- **[dnsprovider]** hurricane: only treat first word of response body as response code
- **[dnsprovider]** exoscale: fix DNS provider debugging
- **[dnsprovider]** wedos: fix api call parameters
- **[dnsprovider]** nifcloud: Get zone info from dns01.FindZoneByFqdn
- **[cli,lib]** csr: Support the type `NEW CERTIFICATE REQUEST`

## v4.3.1

- Release date: 2021-03-12
- Tag: [v4.3.1](https://github.com/go-acme/lego/releases/tag/v4.3.1)

### Fixed

- **[dnsprovider]** exoscale: fix dependency version.

## v4.3.0

- Release date: 2021-03-10
- Tag: [v4.3.0](https://github.com/go-acme/lego/releases/tag/v4.3.0)

### Added

- **[dnsprovider]** Add DNS provider for Njalla
- **[dnsprovider]** Add DNS provider for Domeneshop
- **[dnsprovider]** Add DNS provider for Hurricane Electric
- **[dnsprovider]** designate: support for Openstack Application Credentials
- **[dnsprovider]** edgedns: support for .edgerc file

### Changed

- **[dnsprovider]** infomaniak: Make error message more meaningful
- **[dnsprovider]** cloudns: Improve reliability
- **[dnsprovider]** rfc2163: Removed support for MD5 algorithm. The default algorithm is now SHA1.

### Fixed

- **[dnsprovider]** desec: fix error with default TTL
- **[dnsprovider]** mythicbeasts: implement `ProviderTimeout`
- **[dnsprovider]** dnspod: improve search accuracy when a domain have more than 100 records
- **[lib]** Increase HTTP client timeouts
- **[lib]** preferred chain only match root name

## v4.2.0

- Release date: 2021-01-24
- Tag: [v4.2.0](https://github.com/go-acme/lego/releases/tag/v4.2.0)

### Added

- **[dnsprovider]** Add DNS provider for Loopia
- **[dnsprovider]** Add DNS provider for Ionos.

### Changed

- **[dnsprovider]** acme-dns: update cpu/goacmedns to v0.1.1.
- **[dnsprovider]** inwx: Increase propagation timeout to 360s to improve robustness
- **[dnsprovider]** vultr: Update to govultr v2 API
- **[dnsprovider]** pdns: get exact zone instead of all zones

### Fixed

- **[dnsprovider]** vult, dnspod: fix default HTTP timeout.
- **[dnsprovider]** pdns: URL request creation.
- **[lib]** errors: Fix instance not being printed

## v4.1.3

- Release date: 2020-11-25
- Tag: [v4.1.3](https://github.com/go-acme/lego/releases/tag/v4.1.3)

### Fixed

- **[dnsprovider]** azure: fix error handling.

## v4.1.2

- Release date: 2020-11-21
- Tag: [v4.1.2](https://github.com/go-acme/lego/releases/tag/v4.1.2)

### Fixed

- **[lib]** fix: preferred chain support.

## v4.1.1

- Release date: 2020-11-19
- Tag: [v4.1.1](https://github.com/go-acme/lego/releases/tag/v4.1.1)

### Fixed

- **[dnsprovider]** otc: select correct zone if multiple returned
- **[dnsprovider]** azure: fix target must be a non-nil pointer

## v4.1.0

- Release date: 2020-11-06
- Tag: [v4.1.0](https://github.com/go-acme/lego/releases/tag/v4.1.0)

### Added

- **[dnsprovider]** Add DNS provider for Infomaniak
- **[dnsprovider]** joker: add support for SVC API
- **[dnsprovider]** gcloud: add an option to allow the use of private zones

### Changed

- **[dnsprovider]** rfc2136: ensure TSIG algorithm is fully qualified
- **[dnsprovider]** designate: Deprecate OS_TENANT_NAME as required field

### Fixed

- **[lib]** acme/api: use postAsGet instead of post for AccountService.Get
- **[lib]** fix: use http.Header.Set method instead of Add.

## v4.0.1

- Release date: 2020-09-03
- Tag: [v4.0.1](https://github.com/go-acme/lego/releases/tag/v4.0.1)

### Fixed

- **[dnsprovider]** exoscale: change dependency version.

## v4.0.0

- Release date: 2020-09-02
- Tag: [v4.0.0](https://github.com/go-acme/lego/releases/tag/v4.0.0)

### Added

- **[cli], [lib]** Support "alternate" certificate links for selecting different signing Chains

### Changed

- **[cli]** Replaces `ec384` by `ec256` as default key-type
- **[lib]** Changes `ObtainForCSR` method signature

### Removed

- **[dnsprovider]** Replaces FastDNS by EdgeDNS
- **[dnsprovider]** Removes old Linode provider
- **[lib]** Removes `AddPreCheck` function

## v3.9.0

- Release date: 2020-09-01
- Tag: [v3.9.0](https://github.com/go-acme/lego/releases/tag/v3.9.0)

### Added

- **[dnsprovider]** Add Akamai Edgedns. Deprecate FastDNS
- **[dnsprovider]** Add DNS provider for HyperOne

### Changed

- **[dnsprovider]** designate: add support for Openstack clouds.yaml
- **[dnsprovider]** azure: allow selecting environments
- **[dnsprovider]** desec: applies API rate limits.

### Fixed

- **[dnsprovider]** namesilo: fix cleanup.

## v3.8.0

- Release date: 2020-07-02
- Tag: [v3.8.0](https://github.com/go-acme/lego/releases/tag/v3.8.0)

### Added

- **[cli]** cli: add hook on the run command.
- **[dnsprovider]** inwx: Two-Factor-Authentication
- **[dnsprovider]** Add DNS provider for ArvanCloud

### Changed

- **[dnsprovider]** vultr: bumping govultr version
- **[dnsprovider]** desec: improve error logs.
- **[lib]** Ensures the return of a location during account updates
- **[dnsprovider]** route53: Document all AWS credential environment variables

### Fixed

- **[dnsprovider]** stackpath: fix subdomain support.
- **[dnsprovider]** arvandcloud: fix record name.
- **[dnsprovider]** fix: multi-va.
- **[dnsprovider]** constellix: fix search records API call.
- **[dnsprovider]** hetzner: fix record name.
- **[lib]** Registrar.ResolveAccountByKey: Fix malformed request

## v3.7.0

- Release date: 2020-05-11
- Tag: [v3.7.0](https://github.com/go-acme/lego/releases/tag/v3.7.0)

### Added

- **[dnsprovider]** Add DNS provider for Netlify.
- **[dnsprovider]** Add DNS provider for deSEC.io
- **[dnsprovider]** Add DNS provider for LuaDNS
- **[dnsprovider]** Adding Hetzner DNS provider
- **[dnsprovider]** Add DNS provider for Mythic beasts DNSv2
- **[dnsprovider]** Add DNS provider for Yandex.

### Changed

- **[dnsprovider]** Upgrade DNSimple client to 0.60.0
- **[dnsprovider]** update aws sdk

### Fixed

- **[dnsprovider]** autodns: removes TXT records during CleanUp.
- **[dnsprovider]** Fix exoscale HTTP timeout
- **[cli]** fix: renew path information.
- **[cli]** Fix account storage location warning message

## v3.6.0

- Release date: 2020-04-24
- Tag: [v3.6.0](https://github.com/go-acme/lego/releases/tag/v3.6.0)

### Added

- **[dnsprovider]** Add DNS provider for CloudDNS.
- **[dnsprovider]** alicloud: add support for domain with punycode
- **[dnsprovider]** cloudns: Add subuser support
- **[cli]** Information about renewed certificates are now passed to the renew hook

### Changed

- **[dnsprovider]** acmedns: Update cpu/goacmedns v0.0.1 -&gt; v0.0.2
- **[dnsprovider]** alicloud: update sdk dependency version to v1.61.112
- **[dnsprovider]** azure: Allow for the use of MSI
- **[dnsprovider]** constellix: improve challenge.
- **[dnsprovider]** godaddy: allow parallel solve.
- **[dnsprovider]** namedotcom: get the actual registered domain, so we can remove just that from the hostname to be created
- **[dnsprovider]** transip: updated the client to v6

### Fixed

- **[dnsprovider]** ns1: fix missing domain in log 
- **[dnsprovider]** rimuhosting: use HTTP client from config.

## v3.5.0

- Release date: 2020-03-15
- Tag: [v3.5.0](https://github.com/go-acme/lego/releases/tag/v3.5.0)

### Added

- **[dnsprovider]** Add DNS provider for Dynu.
- **[dnsprovider]** Add DNS provider for reg.ru
- **[dnsprovider]** Add DNS provider for Zonomi and RimuHosting.
- **[cli]** Building binaries for arm 6 and 5
- **[cli]** Uses CGO_ENABLED=0
- **[cli]** Multi-arch Docker image.
- **[cli]** Adds `--name` flag to list command.

### Changed

- **[lib]** lib: Improve cleanup log messages.
- **[lib]** Wrap errors.

### Fixed

- **[dnsprovider]** azure: pass AZURE_CLIENT_SECRET_FILE to autorest.Authorizer
- **[dnsprovider]** gcloud: fixes issues when used with GKE Workload Identity
- **[dnsprovider]** oraclecloud: fix subdomain support

## v3.4.0

- Release date: 2020-02-25
- Tag: [v3.4.0](https://github.com/go-acme/lego/releases/tag/v3.4.0)

### Added

- **[dnsprovider]** Add DNS provider for Constellix
- **[dnsprovider]** Add DNS provider for Servercow.
- **[dnsprovider]** Add DNS provider for Scaleway
- **[cli]** Add "LEGO_PATH" environment variable

### Changed

- **[dnsprovider]** route53: allow custom client to be provided
- **[dnsprovider]** namecheap: allow external domains
- **[dnsprovider]** namecheap: add sandbox support.
- **[dnsprovider]** ovh: Improve provider documentation
- **[dnsprovider]** route53: Improve provider documentation

### Fixed

- **[dnsprovider]** zoneee: fix subdomains.
- **[dnsprovider]** designate: Don't clean up managed records like SOA and NS
- **[dnsprovider]** dnspod: update lib.
- **[lib]** crypto: Treat CommonName as optional
- **[lib]** chore: update cenkalti/backoff to v4.

## v3.3.0

- Release date: 2020-01-08
- Tag: [v3.3.0](https://github.com/go-acme/lego/releases/tag/v3.3.0)

### Added

- **[dnsprovider]** Add DNS provider for Checkdomain
- **[lib]** Add support to update account

### Changed

- **[dnsprovider]** gcloud: Auto-detection of the project ID.
- **[lib]** Successfully parse private key PEM blocks

### Fixed

- **[dnsprovider]** Update dnspod, because of API breaking changes.

## v3.2.0

- Release date: 2019-11-10
- Tag: [v3.2.0](https://github.com/go-acme/lego/releases/tag/v3.2.0)

### Added

- **[dnsprovider]** Add support for autodns

### Changed

- **[dnsprovider]** httpreq: Allow use environment vars from a `_FILE` file
- **[lib]** Don't deactivate valid authorizations
- **[lib]** Expose more SOA fields found by dns01.FindZoneByFqdn

### Fixed

- **[dnsprovider]** use token as unique ID.

## v3.1.0

- Release date: 2019-10-07
- Tag: [v3.1.0](https://github.com/go-acme/lego/releases/tag/v3.1.0)

### Added

- **[dnsprovider]** Add DNS provider for Liquid Web
- **[dnsprovider]** cloudflare: add support for API tokens
- **[cli]** feat: ease operation behind proxy servers

### Changed

- **[dnsprovider]** cloudflare: update client
- **[dnsprovider]** linodev4: propagation timeout configuration.

### Fixed

- **[dnsprovider]** ovh: fix int overflow.
- **[dnsprovider]** bindman: fix client version.

## v3.0.2

- Release date: 2019-08-15
- Tag: [v3.0.2](https://github.com/go-acme/lego/releases/tag/v3.0.2)

### Fixed

- Invalid pseudo version (related to Cloudflare client).

## v3.0.1

- Release date: 2019-08-14
- Tag: [v3.0.1](https://github.com/go-acme/lego/releases/tag/v3.0.1)

There was a problem when creating the tag v3.0.1, this tag has been invalidated.

## v3.0.0

- Release date: 2019-08-05
- Tag: [v3.0.0](https://github.com/go-acme/lego/releases/tag/v3.0.0)

### Changed

- migrate to go module (new import github.com/go-acme/lego/v3/)
- update DNS clients

## v2.7.2

- Release date: 2019-07-30
- Tag: [v2.7.2](https://github.com/go-acme/lego/releases/tag/v2.7.2)

### Fixed

- **[dnsprovider]** vultr: quote TXT record

## v2.7.1

- Release date: 2019-07-22
- Tag: [v2.7.1](https://github.com/go-acme/lego/releases/tag/v2.7.1)

### Fixed

- **[dnsprovider]** vultr: invalid record type.

## v2.7.0

- Release date: 2019-07-17
- Tag: [v2.7.0](https://github.com/go-acme/lego/releases/tag/v2.7.0)

### Added

- **[dnsprovider]** Add DNS provider for namesilo
- **[dnsprovider]** Add DNS provider for versio.nl

### Changed

- **[dnsprovider]** Update DNS providers libs.
- **[dnsprovider]** joker: support username and password.
- **[dnsprovider]** Vultr: Switch to official client

### Fixed

- **[dnsprovider]** otc: Prevent sending empty body.

## v2.6.0

- Release date: 2019-05-27
- Tag: [v2.6.0](https://github.com/go-acme/lego/releases/tag/v2.6.0)

### Added

- **[dnsprovider]** Add support for Joker.com DMAPI
- **[dnsprovider]** Add support for Bindman DNS provider
- **[dnsprovider]** Add support for EasyDNS
- **[lib]** Get an existing certificate by URL

### Changed

- **[dnsprovider]** digitalocean: LEGO_EXPERIMENTAL_CNAME_SUPPORT support
- **[dnsprovider]** gcloud: Use fqdn to get zone Present/CleanUp
- **[dnsprovider]** exec: serial behavior
- **[dnsprovider]** manual: serial behavior.
- **[dnsprovider]** Strip newlines when reading environment variables from `_FILE` suffixed files.

### Fixed

- **[cli]** fix: cli disable-cp option.
- **[dnsprovider]** gcloud: fix zone visibility.

## v2.5.0

- Release date: 2019-04-17
- Tag: [v2.5.0](https://github.com/go-acme/lego/releases/tag/v2.5.0)

### Added

- **[cli]** Adds renew hook
- **[dnsprovider]** Adds 'Since' to DNS providers documentation

### Changed

- **[dnsprovider]** gcloud: use public DNS zones
- **[dnsprovider]** route53: enhance documentation.

### Fixed

- **[dnsprovider]** cloudns: fix TTL and status validation
- **[dnsprovider]** sakuracloud: supports concurrent update
- **[dnsprovider]** Disable authz when solve fail.
- Add tzdata to the Docker image.

## v2.4.0

- Release date: 2019-03-25
- Tag: [v2.4.0](https://github.com/go-acme/lego/releases/tag/v2.4.0)

Migrate from xenolf/lego to go-acme/lego.

### Added

- **[dnsprovider]** Add DNS Provider for Domain Offensive (do.de)
- **[dnsprovider]** Adds information about '_FILE' suffix.

### Fixed

- **[cli,dnsprovider]** Add 'manual' provider to the output of dnshelp
- **[dnsprovider]** hostingde: Use provided ZoneName instead of domain
- **[dnsprovider]** pdns: fix wildcard with SANs

## v2.3.0

- Release date: 2019-03-11
- Tag: [v2.3.0](https://github.com/go-acme/lego/releases/tag/v2.3.0)

### Added

- **[dnsprovider]** Add DNS Provider for ClouDNS.net
- **[dnsprovider]** Add DNS Provider for Oracle Cloud

### Changed

- **[cli]** Adds log when no renewal.
- **[dnsprovider,lib]** Add a mechanism to wrap a PreCheckFunc
- **[dnsprovider]** oraclecloud: better way to get private key.
- **[dnsprovider]** exoscale: update library

### Fixed

- **[dnsprovider]** OVH: Refresh zone after deleting challenge record
- **[dnsprovider]** oraclecloud: ttl config and timeout 
- **[dnsprovider]** hostingde: fix client fails if customer has no access to dns-groups
- **[dnsprovider]** vscale: getting sub-domain
- **[dnsprovider]** selectel: getting sub-domain
- **[dnsprovider]** vscale: fix TXT records clean up
- **[dnsprovider]** selectel: fix TXT records clean up

## v2.2.0

- Release date: 2019-02-08
- Tag: [v2.2.0](https://github.com/go-acme/lego/releases/tag/v2.2.0)

### Added

- **[dnsprovider]** Add support for Openstack Designate as a DNS provider
- **[dnsprovider]** gcloud: Option to specify gcloud service account json by env as string
- **[experimental feature]** Resolve CNAME when creating dns-01 challenge. To enable: set `LEGO_EXPERIMENTAL_CNAME_SUPPORT` to `true`.
 
### Changed

- **[cli]** Applies Let’s Encrypt’s recommendation about renew. The option `--days` of the command `renew` has a new default value (`30`)
- **[lib]** Uses a jittered exponential backoff

### Fixed

- **[cli]** CLI and key type.
- **[dnsprovider]** httpreq: Endpoint with path.
- **[dnsprovider]** fastdns: Do not overwrite existing TXT records
- Log wildcard domain correctly in validation

## v2.1.0

- Release date: 2019-01-24
- Tag: [v2.1.0](https://github.com/go-acme/lego/releases/tag/v2.1.0)

### Added

- **[dnsprovider]** Add support for zone.ee as a DNS provider.

### Changed

- **[dnsprovider]** nifcloud: Change DNS base url.
- **[dnsprovider]** gcloud: More detailed information about Google Cloud DNS.

### Fixed

- **[lib]** fix: OCSP, set HTTP client.
- **[dnsprovider]** alicloud: fix pagination.
- **[dnsprovider]** namecheap: fix panic.

## v2.0.0

- Release date: 2019-01-09
- Tag: [v2.0.0](https://github.com/go-acme/lego/releases/tag/v2.0.0)

### Added

- **[cli,lib]** Option to disable the complete propagation Requirement
- **[lib,cli]** Support non-ascii domain name (punnycode)
- **[cli,lib]** Add configurable timeout when obtaining certificates
- **[cli]** Archive revoked certificates
- **[cli]** Add command to list certificates.
- **[cli]** support for renew with CSR
- **[cli]** add SAN on renew
- **[lib]** Adds `Remove` for challenges
- **[lib]** Add version to xenolf-acme in User-Agent.
- **[dnsprovider]** The ability for a DNS provider to solve the challenge sequentially
- **[dnsprovider]** Add DNS provider for "HTTP request".
- **[dnsprovider]** Add DNS Provider for Vscale
- **[dnsprovider]** Add DNS Provider for TransIP
- **[dnsprovider]** Add DNS Provider for inwx
- **[dnsprovider]** alidns: add support to handle more than 20 domains

### Changed

- **[lib]** Check all challenges in a predictable order
- **[lib]** Poll authz URL instead of challenge URL
- **[lib]** Check all nameservers in a predictable order
- **[lib]** Logs every iteration of waiting for the propagation
- **[cli]** `--http`: enable HTTP challenge **important**
- **[cli]** `--http.port`: previously named `--http`
- **[cli]** `--http.webroot`: previously named `--webroot`
- **[cli]** `--http.memcached-host`: previously named `--memcached-host`
- **[cli]** `--tls`: enable TLS challenge **important**
- **[cli]** `--tls.port`:  previously named `--tls`
- **[cli]** `--dns.resolvers`: previously named `--dns-resolvers`
- **[cli]** the option `--days` of the command `renew` has default value (`15`)
- **[dnsprovider]** gcloud: Use GCE_PROJECT for project always, if specified

### Removed

- **[lib]** Remove `SetHTTP01Address`
- **[lib]** Remove `SetTLSALPN01Address`
- **[lib]** Remove `Exclude`
- **[cli]** Remove `--exclude`, `-x` 

### Fixed

- **[lib]** Fixes revocation for subdomains and non-ascii domains
- **[lib]** Disable pending authorizations
- **[dnsprovider]** transip: concurrent access to the API.
- **[dnsprovider]** gcloud: fix for wildcard
- **[dnsprovider]** Azure: Do not overwrite existing TXT records
- **[dnsprovider]** fix: Cloudflare error.

## v1.2.0

- Release date: 2018-11-04
- Tag: [v1.2.0](https://github.com/go-acme/lego/releases/tag/v1.2.0)

### Added

- **[dnsprovider]** Add DNS Provider for ConoHa DNS
- **[dnsprovider]** Add DNS Provider for MyDNS.jp
- **[dnsprovider]** Add DNS Provider for Selectel

### Fixed

- **[dnsprovider]** netcup: make unmarshalling of api-responses more lenient.

### Changed

- **[dnsprovider]** aurora: change DNS client
- **[dnsprovider]** azure: update auth to support instance metadata service
- **[dnsprovider]** dnsmadeeasy: log response body on error
- **[lib]** TLS-ALPN-01: Update idPeAcmeIdentifierV1, draft refs.
- **[lib]** Do not send a JWS body when POSTing challenges.
- **[lib]** Support POST-as-GET.

## v1.1.0

- Release date: 2018-10-16
- Tag: [v1.1.0](https://github.com/go-acme/lego/releases/tag/v1.1.0)

### Added

- **[lib]** TLS-ALPN-01 Challenge
- **[cli]** Add filename parameter
- **[dnsprovider]** Allow to configure TTL, interval and timeout
- **[dnsprovider]** Add support for reading DNS provider setup from files
- **[dnsprovider]** Add DNS Provider for ACME-DNS
- **[dnsprovider]** Add DNS Provider for ALIYUN DNS
- **[dnsprovider]** Add DNS Provider for DreamHost
- **[dnsprovider]** Add DNS provider for hosting.de
- **[dnsprovider]** Add DNS Provider for IIJ
- **[dnsprovider]** Add DNS Provider for netcup
- **[dnsprovider]** Add DNS Provider for NIFCLOUD DNS
- **[dnsprovider]** Add DNS Provider for SAKURA Cloud
- **[dnsprovider]** Add DNS Provider for Stackpath
- **[dnsprovider]** Add DNS Provider for VegaDNS
- **[dnsprovider]** exec: add EXEC_MODE=RAW support.
- **[dnsprovider]** cloudflare: support for CF_API_KEY and CF_API_EMAIL

### Fixed

- **[lib]** Don't trust identifiers order.
- **[lib]** Fix missing issuer certificates from Let's Encrypt
- **[dnsprovider]** duckdns: fix TXT record update url
- **[dnsprovider]** duckdns: fix subsubdomain
- **[dnsprovider]** gcloud: update findTxtRecords to use Name=fqdn and Type=TXT
- **[dnsprovider]** lightsail: Fix Domain does not exist error
- **[dnsprovider]** ns1: use the authoritative zone and not the domain name
- **[dnsprovider]** ovh: check error to avoid panic due to nil client

### Changed

- **[lib]** Submit all dns records up front, then validate serially

## v1.0.0

- Release date: 2018-05-30
- Tag: [v1.0.0](https://github.com/go-acme/lego/releases/tag/v1.0.0)

### Changed

- **[lib]** ACME v2 Support.
- **[dnsprovider]** Renamed `/providers/dns/googlecloud` to `/providers/dns/gcloud`.
- **[dnsprovider]** Modified Google Cloud provider `gcloud.NewDNSProviderServiceAccount` function to extract the project id directly from the service account file.
- **[dnsprovider]** Made errors more verbose for the Cloudflare provider.

## v0.5.0

- Release date: 2018-05-29
- Tag: [v0.5.0](https://github.com/go-acme/lego/releases/tag/v0.5.0)

### Added

- **[dnsprovider]** Add DNS challenge provider `exec`
- **[dnsprovider]** Add DNS Provider for Akamai FastDNS
- **[dnsprovider]** Add DNS Provider for Bluecat DNS
- **[dnsprovider]** Add DNS Provider for CloudXNS
- **[dnsprovider]** Add DNS Provider for Duck DNS
- **[dnsprovider]** Add DNS Provider for Gandi Beta Platform (LiveDNS)
- **[dnsprovider]** Add DNS Provider for GleSYS API
- **[dnsprovider]** Add DNS Provider for GoDaddy
- **[dnsprovider]** Add DNS Provider for Lightsail
- **[dnsprovider]** Add DNS Provider for Name.com

### Fixed

- **[dnsprovider]** Azure: Added missing environment variable in the comments
- **[dnsprovider]** PowerDNS: Fix zone URL, add leading slash.
- **[dnsprovider]** DNSimple: Fix api
- **[cli]** Correct help text for `--dns-resolvers` default.
- **[cli]** renew/revoke - don't panic on wrong account.
- **[lib]** Fix zone detection for cross-zone cnames.
- **[lib]** Use proxies from environment when making outbound http connections.

### Changed

- **[lib]** Users of an effective top-level domain can use the DNS challenge.
- **[dnsprovider]** Azure: Refactor to work with new Azure SDK version.
- **[dnsprovider]** Cloudflare and Azure: Adding output of which envvars are missing.
- **[dnsprovider]** Dyn DNS: Slightly improve provider error reporting.
- **[dnsprovider]** Exoscale: update to latest egoscale version.
- **[dnsprovider]** Route53: Use NewSessionWithOptions instead of deprecated New.

## 0.4.1

- Release date: 2017-09-26
- Tag: [0.4.1](https://github.com/go-acme/lego/releases/tag/0.4.1)

### Added

- lib: A new DNS provider for OTC.
- lib: The `AWS_HOSTED_ZONE_ID` environment variable for the Route53 DNS provider to directly specify the zone.
- lib: The `RFC2136_TIMEOUT` environment variable to make the timeout for the RFC2136 provider configurable.
- lib: The `GCE_SERVICE_ACCOUNT_FILE` environment variable to specify a service account file for the Google Cloud DNS provider.

### Fixed

- lib: Fixed an authentication issue with the latest Azure SDK.

## 0.4.0

- Release date: 2017-07-13
- Tag: [0.4.0](https://github.com/go-acme/lego/releases/tag/0.4.0)

### Added

- CLI: The `--http-timeout` switch. This allows for an override of the default client HTTP timeout.
- lib: The `HTTPClient` field. This allows for an override of the default HTTP timeout for library HTTP requests.
- CLI: The `--dns-timeout` switch. This allows for an override of the default DNS timeout for library DNS requests.
- lib: The `DNSTimeout` switch. This allows for an override of the default client DNS timeout.
- lib: The `QueryRegistration` function on `acme.Client`. This performs a POST on the client registration's URI and gets the updated registration info.
- lib: The `DeleteRegistration` function on `acme.Client`. This deletes the registration as currently configured in the client.
- lib: The `ObtainCertificateForCSR` function on `acme.Client`. The function allows to request a certificate for an already existing CSR.
- CLI: The `--csr` switch. Allows to use already existing CSRs for certificate requests on the command line.
- CLI: The `--pem` flag. This will change the certificate output, so it outputs a .pem file concatanating the .key and .crt files together.
- CLI: The `--dns-resolvers` flag. Allows for users to override the default DNS servers used for recursive lookup.
- lib: Added a memcached provider for the HTTP challenge.
- CLI: The `--memcached-host` flag. This allows to use memcached for challenge storage.
- CLI: The `--must-staple` flag. This enables OCSP must staple in the generated CSR.
- lib: The library will now honor entries in your resolv.conf.
- lib: Added a field `IssuerCertificate` to the `CertificateResource` struct.
- lib: A new DNS provider for OVH.
- lib: A new DNS provider for DNSMadeEasy.
- lib: A new DNS provider for Linode.
- lib: A new DNS provider for AuroraDNS.
- lib: A new DNS provider for NS1.
- lib: A new DNS provider for Azure DNS.
- lib: A new DNS provider for Rackspace DNS.
- lib: A new DNS provider for Exoscale DNS.
- lib: A new DNS provider for DNSPod.

### Changed

- lib: Exported the `PreCheckDNS` field so library users can manage the DNS check in tests.
- lib: The library will now skip challenge solving if a valid Authz already exists.

### Removed

- lib: The library will no longer check for auto-renewed certificates. This has been removed from the spec and is not supported in Boulder.

### Fixed

- lib: Fix a problem with the Route53 provider where it was possible the verification was published to a private zone.
- lib: Loading an account from file should fail if an integral part is nil
- lib: Fix a potential issue where the Dyn provider could resolve to an incorrect zone.
- lib: If a registration encounteres a conflict, the old registration is now recovered.
- CLI: The account.json file no longer has the executable flag set.
- lib: Made the client registration more robust in case of a 403 HTTP response.
- lib: Fixed an issue with zone lookups when they have a CNAME in another zone.
- lib: Fixed the lookup for the authoritative zone for Google Cloud.
- lib: Fixed a race condition in the nonce store.
- lib: The Google Cloud provider now removes old entries before trying to add new ones.
- lib: Fixed a condition where we could stall due to an early error condition.
- lib: Fixed an issue where Authz object could end up in an active state after an error condition.

## 0.3.1

- Release date: 2016-04-19
- Tag: [0.3.1](https://github.com/go-acme/lego/releases/tag/0.3.1)

### Added

- lib: A new DNS provider for Vultr.

### Fixed

- lib: DNS Provider for DigitalOcean could not handle subdomains properly.
- lib: handleHTTPError should only try to JSON decode error messages with the right content type.
- lib: The propagation checker for the DNS challenge would not retry on send errors.

## 0.3.0

- Release date: 2016-03-19
- Tag: [0.3.0](https://github.com/go-acme/lego/releases/tag/0.3.0)

### Added

- CLI: The `--dns` switch. To include the DNS challenge for consideration. When using this switch, all other solvers are disabled. Supported are the following solvers: cloudflare, digitalocean, dnsimple, dyn, gandi, googlecloud, namecheap, route53, rfc2136 and manual.
- CLI: The `--accept-tos`  switch. Indicates your acceptance of the Let's Encrypt terms of service without prompting you.
- CLI: The `--webroot` switch. The HTTP-01 challenge may now be completed by dropping a file into a webroot. When using this switch, all other solvers are disabled.
- CLI: The `--key-type` switch. This replaces the `--rsa-key-size` switch and supports the following key types: EC256, EC384, RSA2048, RSA4096 and RSA8192.
- CLI: The `--dnshelp` switch. This displays a more in-depth help topic for DNS solvers.
- CLI: The `--no-bundle` sub switch for the `run` and `renew` commands. When this switch is set, the CLI will not bundle the issuer certificate with your certificate.
- lib: A new type for challenge identifiers `Challenge`
- lib: A new interface for custom challenge providers `acme.ChallengeProvider`
- lib: A new interface for DNS-01 providers to allow for custom timeouts for the validation function `acme.ChallengeProviderTimeout`
- lib: SetChallengeProvider function. Pass a challenge identifier and a Provider to replace the default behaviour of a challenge.
- lib: The DNS-01 challenge has been implemented with modular solvers using the `ChallengeProvider` interface. Included solvers are: cloudflare, digitalocean, dnsimple, gandi, namecheap, route53, rfc2136 and manual.
- lib: The `acme.KeyType` type was added and is used for the configuration of crypto parameters for RSA and EC keys. Valid KeyTypes are: EC256, EC384, RSA2048, RSA4096 and RSA8192.

### Changed

- lib: ExcludeChallenges now expects to be passed an array of `Challenge` types.
- lib: HTTP-01 now supports custom solvers using the `ChallengeProvider` interface.
- lib: TLS-SNI-01 now supports custom solvers using the `ChallengeProvider` interface.
- lib: The `GetPrivateKey` function in the `acme.User` interface is now expected to return a `crypto.PrivateKey` instead of an `rsa.PrivateKey` for EC compat.
- lib: The `acme.NewClient` function now expects an `acme.KeyType` instead of the keyBits parameter.
 
### Removed

- CLI: The `rsa-key-size` switch was removed in favor of `key-type` to support EC keys.

### Fixed

- lib: Fixed a race condition in HTTP-01
- lib: Fixed an issue where status codes on ACME challenge responses could lead to no action being taken.
- lib: Fixed a regression when calling the Renew function with a SAN certificate.

## 0.2.0

- Release date: 2016-01-09
- Tag: [0.2.0](https://github.com/go-acme/lego/releases/tag/0.2.0)

### Added

- CLI: The `--exclude` or `-x` switch. To exclude a challenge from being solved.
- CLI: The `--http` switch. To set the listen address and port of HTTP based challenges. Supports `host:port` and `:port` for any interface.
- CLI: The `--tls` switch. To set the listen address and port of TLS based challenges. Supports `host:port` and `:port` for any interface.
- CLI: The `--reuse-key` switch for the `renew` operation. This lets you reuse an existing private key for renewals.
- lib: ExcludeChallenges function. Pass an array of challenge identifiers to exclude them from solving.
- lib: SetHTTPAddress function. Pass a port to set the listen port for HTTP based challenges.
- lib: SetTLSAddress function. Pass a port to set the listen port of TLS based challenges.
- lib: acme.UserAgent variable. Use this to customize the user agent on all requests sent by lego.

### Changed

- lib: NewClient does no longer accept the optPort parameter
- lib: ObtainCertificate now returns a SAN certificate if you pass more than one domain.
- lib: GetOCSPForCert now returns the parsed OCSP response instead of just the status.
- lib: ObtainCertificate has a new parameter `privKey crypto.PrivateKey` which lets you reuse an existing private key for new certificates.
- lib: RenewCertificate now expects the PrivateKey property of the CertificateResource to be set only if you want to reuse the key.

### Removed

- CLI: The `--port` switch was removed.
- lib: RenewCertificate does no longer offer to also revoke your old certificate.

### Fixed

- CLI: Fix logic using the `--days` parameter for renew

## 0.1.1

- Release date: 2015-12-18
- Tag: [0.1.1](https://github.com/go-acme/lego/releases/tag/0.1.1)

### Added

- CLI: Added a way to automate renewal through a cronjob using the --days parameter to renew

### Changed

- lib: Improved log output on challenge failures.

### Fixed

- CLI: The short parameter for domains would not get accepted
- CLI: The cli did not return proper exit codes on error library errors.
- lib: RenewCertificate did not properly renew SAN certificates.

### Security

- lib: Fix possible DOS on GetOCSPForCert

## 0.1.0

- Release date: 2015-12-03
- Tag: [0.1.0](https://github.com/go-acme/lego/releases/tag/0.1.0)

Initial release


================================================
FILE: CONTRIBUTING.md
================================================
# How to contribute to lego

Contributions in the form of patches and proposals are essential to keep lego great and to make it even better.
To ensure a great and easy experience for everyone, please review the few guidelines in this document.

## Bug reports

- Use the issue search to see if the issue has already been reported.
- Also look for closed issues to see if your issue has already been fixed.
- If both of the above do not apply, create a new issue and include as much information as possible.

Bug reports should include all information a person could need to reproduce your problem without the need to
follow up for more information. If possible, provide detailed steps for us to reproduce it, the expected behavior and the actual behavior.

## Feature proposals and requests

Feature requests are welcome and should be discussed in an issue.
Please keep proposals focused on one thing at a time and be as detailed as possible.
It is up to you to make a strong point about your proposal and convince us of the merits and the added complexity of this feature.

## Pull requests

Create an issue and wait for a maintainer to approve it BEFORE opening a pull request.

Patches, new features and improvements are a great way to help the project.
Please keep them focused on one thing and do not include unrelated commits.

All pull requests that alter the behavior of the program,
add new behavior or somehow alter code in a non-trivial way should **always** include tests.

**IMPORTANT**: By submitting a patch, you agree to allow the project owners to license your work under the terms of the [MIT License](LICENSE).

### How to create a pull request

Requirements:

- `go` v1.24+
- environment variable: `GO111MODULE=on`

First, you have to install [GoLang](https://golang.org/doc/install) and [golangci-lint](https://github.com/golangci/golangci-lint#install).

```bash
# clone your fork
git clone git@github.com:YOUR_USERNAME/lego.git
cd lego

# Add the go-acme/lego remote
git remote add upstream git@github.com:go-acme/lego.git
git fetch upstream
```

```bash
# Create your branch
git switch -c my-feature

## Create your code ##
```

```bash
# Linters
make checks
# Tests
make test
# Compile
make build
```

```bash
# push your branch
git push -u origin my-feature

## create a pull request on GitHub ##
```


================================================
FILE: Dockerfile
================================================
FROM golang:1-alpine as builder

RUN apk --no-cache --no-progress add make git

WORKDIR /go/lego

ENV GO111MODULE on

# Download go modules
COPY go.mod .
COPY go.sum .
RUN go mod download

COPY . .
RUN make build

FROM alpine:3
RUN apk update \
    && apk add --no-cache ca-certificates tzdata \
    && update-ca-certificates

COPY --from=builder /go/lego/dist/lego /usr/bin/lego

ENTRYPOINT [ "/usr/bin/lego" ]


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2017-2024 Ludovic Fernandez
Copyright (c) 2015-2017 Sebastian Erhart

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
.PHONY: clean checks test build image e2e fmt

export GO111MODULE=on
export CGO_ENABLED=0

LEGO_IMAGE := goacme/lego
MAIN_DIRECTORY := ./cmd/lego/

BIN_OUTPUT := $(if $(filter $(shell go env GOOS), windows), dist/lego.exe, dist/lego)

TAG_NAME := $(shell git tag -l --contains HEAD)
SHA := $(shell git rev-parse HEAD)
VERSION := $(if $(TAG_NAME),$(TAG_NAME),$(SHA))

default: clean generate-dns checks test build

clean:
	@echo BIN_OUTPUT: ${BIN_OUTPUT}
	rm -rf dist/ builds/ cover.out

build: clean
	@echo Version: $(VERSION)
	go build -trimpath -ldflags '-X "main.version=${VERSION}"' -o ${BIN_OUTPUT} ${MAIN_DIRECTORY}

image:
	@echo Version: $(VERSION)
	docker build -t $(LEGO_IMAGE) .

test: clean
	go test -v -cover ./...

e2e: clean
	LEGO_E2E_TESTS=local go test -count=1 -v ./e2e/...

checks:
	golangci-lint run

# Release helper
.PHONY: patch minor major detach

patch:
	go run ./internal/releaser/ release -m patch

minor:
	go run ./internal/releaser/ release -m minor

major:
	go run ./internal/releaser/ release -m major

detach:
	go run ./internal/releaser/ detach

# Docs
.PHONY: docs-build docs-serve docs-themes

docs-build: generate-dns
	@make -C ./docs build

docs-serve: generate-dns
	@make -C ./docs serve

docs-themes:
	@make -C ./docs hugo-themes

# DNS Documentation
.PHONY: generate-dns validate-doc

generate-dns:
	go generate ./...

validate-doc: generate-dns
validate-doc: DOC_DIRECTORIES := ./docs/ ./cmd/
validate-doc:
	@if git diff --exit-code --quiet $(DOC_DIRECTORIES) 2>/dev/null; then \
		echo 'All documentation changes are done the right way.'; \
	else \
		echo 'The documentation must be regenerated, please use `make generate-dns`.'; \
		git status --porcelain -- $(DOC_DIRECTORIES) 2>/dev/null; \
		exit 2; \
	fi


================================================
FILE: README.md
================================================
<div align="center">
  <img alt="lego logo" src="./docs/static/images/lego-logo.min.svg">
  <p>Automatic Certificates and HTTPS for everyone.</p>
</div>

# Lego

[ACME](https://www.rfc-editor.org/rfc/rfc8555.html) client and library for Let's Encrypt and other ACME CAs written in Go.

[![Go Reference](https://pkg.go.dev/badge/github.com/go-acme/lego/v4.svg)](https://pkg.go.dev/github.com/go-acme/lego/v4)
[![Build Status](https://github.com//go-acme/lego/workflows/Main/badge.svg?branch=master)](https://github.com//go-acme/lego/actions)
[![Docker Pulls](https://img.shields.io/docker/pulls/goacme/lego.svg)](https://hub.docker.com/r/goacme/lego/)

lego is an independent, free, and open-source project, if you value it, consider [supporting it](https://donate.ldez.dev)! ❤️

Everybody thinks that the others will donate, but in the end, nobody does.

So if you think that lego is worth it, please consider [donating](https://donate.ldez.dev).

## Features

- ACME v2 [RFC 8555](https://www.rfc-editor.org/rfc/rfc8555.html)
  - Support [RFC 8737](https://www.rfc-editor.org/rfc/rfc8737.html): TLS Application‑Layer Protocol Negotiation (ALPN) Challenge Extension
  - Support [RFC 8738](https://www.rfc-editor.org/rfc/rfc8738.html): certificates for IP addresses
  - Support [RFC 9773](https://www.rfc-editor.org/rfc/rfc9773.html): Renewal Information (ARI) Extension
  - Support [draft-ietf-acme-profiles-00](https://datatracker.ietf.org/doc/draft-ietf-acme-profiles/): Profiles Extension
- Comes with about [180 DNS providers](https://go-acme.github.io/lego/dns)
- Register with CA
- Obtain certificates, both from scratch or with an existing CSR
- Renew certificates
- Revoke certificates
- Robust implementation of ACME challenges:
  - HTTP (http-01)
  - DNS (dns-01)
  - TLS (tls-alpn-01)
- SAN certificate support
- [CNAME support](https://letsencrypt.org/2019/10/09/onboarding-your-customers-with-lets-encrypt-and-acme.html) by default
- [Custom challenge solvers](https://go-acme.github.io/lego/usage/library/writing-a-challenge-solver/)
- Certificate bundling
- OCSP helper function

## Installation

How to [install](https://go-acme.github.io/lego/installation/).

## Usage

- as a [CLI](https://go-acme.github.io/lego/usage/cli)
- as a [library](https://go-acme.github.io/lego/usage/library)

## Documentation

Documentation is hosted live at https://go-acme.github.io/lego/.

## DNS providers

Detailed documentation is available [here](https://go-acme.github.io/lego/dns).

If your DNS provider is not supported, please open an [issue](https://github.com/go-acme/lego/issues/new?assignees=&labels=enhancement%2C+new-provider&template=new_dns_provider.yml).

<!-- START DNS PROVIDERS LIST -->

<table><tr>
  <td><a href="https://go-acme.github.io/lego/dns/com35/">35.com/三五互联</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/active24/">Active24</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/edgedns/">Akamai EdgeDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/alidns/">Alibaba Cloud DNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/aliesa/">AlibabaCloud ESA</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/allinkl/">all-inkl</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/alwaysdata/">Alwaysdata</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/lightsail/">Amazon Lightsail</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/route53/">Amazon Route 53</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/anexia/">Anexia CloudDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/safedns/">ANS SafeDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/artfiles/">ArtFiles</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/arvancloud/">ArvanCloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/auroradns/">Aurora DNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/autodns/">Autodns</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/axelname/">Axelname</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/azion/">Azion</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/azure/">Azure (deprecated)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/azuredns/">Azure DNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/baiducloud/">Baidu Cloud</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/beget/">Beget.com</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/binarylane/">Binary Lane</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/bindman/">Bindman</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/bluecat/">Bluecat</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/bluecatv2/">Bluecat v2</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/bookmyname/">BookMyName</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/brandit/">Brandit (deprecated)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/bunny/">Bunny</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/checkdomain/">Checkdomain</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/civo/">Civo</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/cloudru/">Cloud.ru</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/clouddns/">CloudDNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/cloudflare/">Cloudflare</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/cloudns/">ClouDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/cloudxns/">CloudXNS (Deprecated)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/conoha/">ConoHa v2</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/conohav3/">ConoHa v3</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/constellix/">Constellix</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/corenetworks/">Core-Networks</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/cpanel/">CPanel/WHM</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/czechia/">Czechia</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ddnss/">DDnss (DynDNS Service)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/derak/">Derak Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/desec/">deSEC.io</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/designate/">Designate DNSaaS for Openstack</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/digitalocean/">Digital Ocean</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/directadmin/">DirectAdmin</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dnsmadeeasy/">DNS Made Easy</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/dnsexit/">DNSExit</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dnshomede/">dnsHome.de</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dnsimple/">DNSimple</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dnspod/">DNSPod (deprecated)</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/dode/">Domain Offensive (do.de)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/domeneshop/">Domeneshop</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dreamhost/">DreamHost</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/duckdns/">Duck DNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/dyn/">Dyn</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dyndnsfree/">DynDnsFree.de</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/dynu/">Dynu</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/easydns/">EasyDNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/edgecenter/">EdgeCenter</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/efficientip/">Efficient IP</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/epik/">Epik</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/eurodns/">EuroDNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/excedo/">Excedo</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/exoscale/">Exoscale</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/exec/">External program</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/f5xc/">F5 XC</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/freemyip/">freemyip.com</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/namesurfer/">FusionLayer NameSurfer</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/gcore/">G-Core</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/gandi/">Gandi</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/gandiv5/">Gandi Live DNS (v5)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/gigahostno/">Gigahost.no</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/glesys/">Glesys</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/godaddy/">Go Daddy</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/gcloud/">Google Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/googledomains/">Google Domains</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/gravity/">Gravity</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/hetzner/">Hetzner</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/hostingde/">Hosting.de</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/hostingnl/">Hosting.nl</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/hostinger/">Hostinger</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/hosttech/">Hosttech</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/httpreq/">HTTP request</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/httpnet/">http.net</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/huaweicloud/">Huawei Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/hurricane/">Hurricane Electric DNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/hyperone/">HyperOne</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ibmcloud/">IBM Cloud (SoftLayer)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/iijdpf/">IIJ DNS Platform Service</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/infoblox/">Infoblox</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/infomaniak/">Infomaniak</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/iij/">Internet Initiative Japan</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/internetbs/">Internet.bs</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/inwx/">INWX</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/ionos/">Ionos</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ionoscloud/">Ionos Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ipv64/">IPv64</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ispconfig/">ISPConfig 3</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/ispconfigddns/">ISPConfig 3 - Dynamic DNS (DDNS) Module</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/iwantmyname/">iwantmyname (Deprecated)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/jdcloud/">JD Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/joker/">Joker</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/acme-dns/">Joohoi&#39;s ACME-DNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/keyhelp/">KeyHelp</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/leaseweb/">Leaseweb</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/liara/">Liara</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/limacity/">Lima-City</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/linode/">Linode (v4)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/liquidweb/">Liquid Web</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/loopia/">Loopia</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/luadns/">LuaDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/mailinabox/">Mail-in-a-Box</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/manageengine/">ManageEngine CloudDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/manual/">Manual</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/metaname/">Metaname</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/metaregistrar/">Metaregistrar</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/mijnhost/">mijn.host</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/mittwald/">Mittwald</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/myaddr/">myaddr.{tools,dev,io}</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/mydnsjp/">MyDNS.jp</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/mythicbeasts/">MythicBeasts</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/namedotcom/">Name.com</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/namecheap/">Namecheap</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/namesilo/">Namesilo</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/nearlyfreespeech/">NearlyFreeSpeech.NET</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/neodigit/">Neodigit</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/netcup/">Netcup</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/netlify/">Netlify</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/nicmanager/">Nicmanager</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/nifcloud/">NIFCloud</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/njalla/">Njalla</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/nodion/">Nodion</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ns1/">NS1</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/octenium/">Octenium</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/otc/">Open Telekom Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/oraclecloud/">Oracle Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/ovh/">OVH</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/plesk/">plesk.com</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/porkbun/">Porkbun</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/pdns/">PowerDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/rackspace/">Rackspace</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/rainyun/">Rain Yun/雨云</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/rcodezero/">RcodeZero</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/regru/">reg.ru</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/regfish/">Regfish</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/rfc2136/">RFC2136</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/rimuhosting/">RimuHosting</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/nicru/">RU CENTER</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/sakuracloud/">Sakura Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/scaleway/">Scaleway</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/selectel/">Selectel</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/selectelv2/">Selectel v2</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/selfhostde/">SelfHost.(de|eu)</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/servercow/">Servercow</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/shellrent/">Shellrent</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/simply/">Simply.com</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/sonic/">Sonic</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/spaceship/">Spaceship</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/stackpath/">Stackpath</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/syse/">Syse</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/technitium/">Technitium</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/tencentcloud/">Tencent Cloud DNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/edgeone/">Tencent EdgeOne</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/timewebcloud/">Timeweb Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/todaynic/">TodayNIC/时代互联</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/transip/">TransIP</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/ultradns/">Ultradns</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/uniteddomains/">United-Domains</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/variomedia/">Variomedia</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/vegadns/">VegaDNS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/vercel/">Vercel</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/versio/">Versio.[nl|eu|uk]</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/vinyldns/">VinylDNS</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/virtualname/">Virtualname</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/vkcloud/">VK Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/volcengine/">Volcano Engine/火山引擎</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/vscale/">Vscale</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/vultr/">Vultr</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/webnamesca/">webnames.ca</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/webnames/">webnames.ru</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/websupport/">Websupport</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/wedos/">WEDOS</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/westcn/">West.cn/西部数码</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/yandex360/">Yandex 360</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/yandexcloud/">Yandex Cloud</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/yandex/">Yandex PDD</a></td>
</tr><tr>
  <td><a href="https://go-acme.github.io/lego/dns/zoneee/">Zone.ee</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/zoneedit/">ZoneEdit</a></td>
  <td><a href="https://go-acme.github.io/lego/dns/zonomi/">Zonomi</a></td>
  <td></td>
</tr></table>

<!-- END DNS PROVIDERS LIST -->

If your DNS provider is not supported, please open an [issue](https://github.com/go-acme/lego/issues/new?assignees=&labels=enhancement%2C+new-provider&template=new_dns_provider.yml).


================================================
FILE: acme/api/account.go
================================================
package api

import (
	"encoding/base64"
	"errors"
	"fmt"

	"github.com/go-acme/lego/v4/acme"
)

type AccountService service

// New Creates a new account.
func (a *AccountService) New(req acme.Account) (acme.ExtendedAccount, error) {
	var account acme.Account

	resp, err := a.core.post(a.core.GetDirectory().NewAccountURL, req, &account)
	location := getLocation(resp)

	if location != "" {
		a.core.jws.SetKid(location)
	}

	if err != nil {
		return acme.ExtendedAccount{Location: location}, err
	}

	return acme.ExtendedAccount{Account: account, Location: location}, nil
}

// NewEAB Creates a new account with an External Account Binding.
func (a *AccountService) NewEAB(accMsg acme.Account, kid, hmacEncoded string) (acme.ExtendedAccount, error) {
	hmac, err := decodeEABHmac(hmacEncoded)
	if err != nil {
		return acme.ExtendedAccount{}, err
	}

	eabJWS, err := a.core.signEABContent(a.core.GetDirectory().NewAccountURL, kid, hmac)
	if err != nil {
		return acme.ExtendedAccount{}, fmt.Errorf("acme: error signing eab content: %w", err)
	}

	accMsg.ExternalAccountBinding = eabJWS

	return a.New(accMsg)
}

// Get Retrieves an account.
func (a *AccountService) Get(accountURL string) (acme.Account, error) {
	if accountURL == "" {
		return acme.Account{}, errors.New("account[get]: empty URL")
	}

	var account acme.Account

	_, err := a.core.postAsGet(accountURL, &account)
	if err != nil {
		return acme.Account{}, err
	}

	return account, nil
}

// Update Updates an account.
func (a *AccountService) Update(accountURL string, req acme.Account) (acme.Account, error) {
	if accountURL == "" {
		return acme.Account{}, errors.New("account[update]: empty URL")
	}

	var account acme.Account

	_, err := a.core.post(accountURL, req, &account)
	if err != nil {
		return acme.Account{}, err
	}

	return account, nil
}

// Deactivate Deactivates an account.
func (a *AccountService) Deactivate(accountURL string) error {
	if accountURL == "" {
		return errors.New("account[deactivate]: empty URL")
	}

	req := acme.Account{Status: acme.StatusDeactivated}
	_, err := a.core.post(accountURL, req, nil)

	return err
}

func decodeEABHmac(hmacEncoded string) ([]byte, error) {
	hmac, errRaw := base64.RawURLEncoding.DecodeString(hmacEncoded)
	if errRaw == nil {
		return hmac, nil
	}

	hmac, err := base64.URLEncoding.DecodeString(hmacEncoded)
	if err == nil {
		return hmac, nil
	}

	return nil, fmt.Errorf("acme: could not decode hmac key: %w", errors.Join(errRaw, err))
}


================================================
FILE: acme/api/account_test.go
================================================
package api

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func Test_decodeEABHmac(t *testing.T) {
	testCases := []struct {
		desc string
		hmac string
	}{
		{
			desc: "RawURLEncoding",
			hmac: "BAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHx",
		},
		{
			desc: "URLEncoding",
			hmac: "nKTo9Hu8fpCqWPXx-25LVbZrJWxcHISsr4qHrRR0j5U=",
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			v, err := decodeEABHmac(test.hmac)
			require.NoError(t, err)

			assert.NotEmpty(t, v)
		})
	}
}


================================================
FILE: acme/api/api.go
================================================
package api

import (
	"bytes"
	"context"
	"crypto"
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
	"time"

	"github.com/cenkalti/backoff/v5"
	"github.com/go-acme/lego/v4/acme"
	"github.com/go-acme/lego/v4/acme/api/internal/nonces"
	"github.com/go-acme/lego/v4/acme/api/internal/secure"
	"github.com/go-acme/lego/v4/acme/api/internal/sender"
	"github.com/go-acme/lego/v4/log"
)

// Core ACME/LE core API.
type Core struct {
	doer         *sender.Doer
	nonceManager *nonces.Manager
	jws          *secure.JWS
	directory    acme.Directory
	HTTPClient   *http.Client

	common         service // Reuse a single struct instead of allocating one for each service on the heap.
	Accounts       *AccountService
	Authorizations *AuthorizationService
	Certificates   *CertificateService
	Challenges     *ChallengeService
	Orders         *OrderService
}

// New Creates a new Core.
func New(httpClient *http.Client, userAgent, caDirURL, kid string, privateKey crypto.PrivateKey) (*Core, error) {
	doer := sender.NewDoer(httpClient, userAgent)

	dir, err := getDirectory(doer, caDirURL)
	if err != nil {
		return nil, err
	}

	nonceManager := nonces.NewManager(doer, dir.NewNonceURL)

	jws := secure.NewJWS(privateKey, kid, nonceManager)

	c := &Core{doer: doer, nonceManager: nonceManager, jws: jws, directory: dir, HTTPClient: httpClient}

	c.common.core = c
	c.Accounts = (*AccountService)(&c.common)
	c.Authorizations = (*AuthorizationService)(&c.common)
	c.Certificates = (*CertificateService)(&c.common)
	c.Challenges = (*ChallengeService)(&c.common)
	c.Orders = (*OrderService)(&c.common)

	return c, nil
}

// post performs an HTTP POST request and parses the response body as JSON,
// into the provided respBody object.
func (a *Core) post(uri string, reqBody, response any) (*http.Response, error) {
	content, err := json.Marshal(reqBody)
	if err != nil {
		return nil, errors.New("failed to marshal message")
	}

	return a.retrievablePost(uri, content, response)
}

// postAsGet performs an HTTP POST ("POST-as-GET") request.
// https://www.rfc-editor.org/rfc/rfc8555.html#section-6.3
func (a *Core) postAsGet(uri string, response any) (*http.Response, error) {
	return a.retrievablePost(uri, []byte{}, response)
}

func (a *Core) retrievablePost(uri string, content []byte, response any) (*http.Response, error) {
	ctx := context.Background()

	// during tests, allow to support ~90% of bad nonce with a minimum of attempts.
	bo := backoff.NewExponentialBackOff()
	bo.InitialInterval = 200 * time.Millisecond
	bo.MaxInterval = 5 * time.Second

	operation := func() (*http.Response, error) {
		resp, err := a.signedPost(uri, content, response)
		if err != nil {
			// Retry if the nonce was invalidated
			var e *acme.NonceError
			if errors.As(err, &e) {
				return resp, err
			}

			return resp, backoff.Permanent(err)
		}

		return resp, nil
	}

	notify := func(err error, duration time.Duration) {
		log.Infof("retry due to: %v", err)
	}

	return backoff.Retry(ctx, operation,
		backoff.WithBackOff(bo),
		backoff.WithMaxElapsedTime(20*time.Second),
		backoff.WithNotify(notify))
}

func (a *Core) signedPost(uri string, content []byte, response any) (*http.Response, error) {
	signedContent, err := a.jws.SignContent(uri, content)
	if err != nil {
		return nil, fmt.Errorf("failed to post JWS message: failed to sign content: %w", err)
	}

	signedBody := bytes.NewBufferString(signedContent.FullSerialize())

	resp, err := a.doer.Post(uri, signedBody, "application/jose+json", response)

	// nonceErr is ignored to keep the root error.
	nonce, nonceErr := nonces.GetFromResponse(resp)
	if nonceErr == nil {
		a.nonceManager.Push(nonce)
	}

	return resp, err
}

func (a *Core) signEABContent(newAccountURL, kid string, hmac []byte) ([]byte, error) {
	eabJWS, err := a.jws.SignEABContent(newAccountURL, kid, hmac)
	if err != nil {
		return nil, err
	}

	return []byte(eabJWS.FullSerialize()), nil
}

// GetKeyAuthorization Gets the key authorization.
func (a *Core) GetKeyAuthorization(token string) (string, error) {
	return a.jws.GetKeyAuthorization(token)
}

func (a *Core) GetDirectory() acme.Directory {
	return a.directory
}

func getDirectory(do *sender.Doer, caDirURL string) (acme.Directory, error) {
	var dir acme.Directory
	if _, err := do.Get(caDirURL, &dir); err != nil {
		return dir, fmt.Errorf("get directory at '%s': %w", caDirURL, err)
	}

	if dir.NewAccountURL == "" {
		return dir, errors.New("directory missing new registration URL")
	}

	if dir.NewOrderURL == "" {
		return dir, errors.New("directory missing new order URL")
	}

	return dir, nil
}


================================================
FILE: acme/api/authorization.go
================================================
package api

import (
	"errors"

	"github.com/go-acme/lego/v4/acme"
)

type AuthorizationService service

// Get Gets an authorization.
func (c *AuthorizationService) Get(authzURL string) (acme.Authorization, error) {
	if authzURL == "" {
		return acme.Authorization{}, errors.New("authorization[get]: empty URL")
	}

	var authz acme.Authorization

	_, err := c.core.postAsGet(authzURL, &authz)
	if err != nil {
		return acme.Authorization{}, err
	}

	return authz, nil
}

// Deactivate Deactivates an authorization.
func (c *AuthorizationService) Deactivate(authzURL string) error {
	if authzURL == "" {
		return errors.New("authorization[deactivate]: empty URL")
	}

	var disabledAuth acme.Authorization

	_, err := c.core.post(authzURL, acme.Authorization{Status: acme.StatusDeactivated}, &disabledAuth)

	return err
}


================================================
FILE: acme/api/certificate.go
================================================
package api

import (
	"bytes"
	"encoding/pem"
	"errors"
	"io"
	"net/http"

	"github.com/go-acme/lego/v4/acme"
)

// maxBodySize is the maximum size of body that we will read.
const maxBodySize = 1024 * 1024

type CertificateService service

// Get Returns the certificate and the issuer certificate.
// 'bundle' is only applied if the issuer is provided by the 'up' link.
func (c *CertificateService) Get(certURL string, bundle bool) ([]byte, []byte, error) {
	cert, _, err := c.get(certURL, bundle)
	if err != nil {
		return nil, nil, err
	}

	return cert.Cert, cert.Issuer, nil
}

// GetAll the certificates and the alternate certificates.
// bundle' is only applied if the issuer is provided by the 'up' link.
func (c *CertificateService) GetAll(certURL string, bundle bool) (map[string]*acme.RawCertificate, error) {
	cert, headers, err := c.get(certURL, bundle)
	if err != nil {
		return nil, err
	}

	certs := map[string]*acme.RawCertificate{certURL: cert}

	// URLs of "alternate" link relation
	// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.4.2
	alts := getLinks(headers, "alternate")

	for _, alt := range alts {
		altCert, _, err := c.get(alt, bundle)
		if err != nil {
			return nil, err
		}

		certs[alt] = altCert
	}

	return certs, nil
}

// Revoke Revokes a certificate.
func (c *CertificateService) Revoke(req acme.RevokeCertMessage) error {
	_, err := c.core.post(c.core.GetDirectory().RevokeCertURL, req, nil)
	return err
}

// get Returns the certificate and the "up" link.
func (c *CertificateService) get(certURL string, bundle bool) (*acme.RawCertificate, http.Header, error) {
	if certURL == "" {
		return nil, nil, errors.New("certificate[get]: empty URL")
	}

	resp, err := c.core.postAsGet(certURL, nil)
	if err != nil {
		return nil, nil, err
	}

	data, err := io.ReadAll(http.MaxBytesReader(nil, resp.Body, maxBodySize))
	if err != nil {
		return nil, resp.Header, err
	}

	cert := c.getCertificateChain(data, bundle)

	return cert, resp.Header, err
}

// getCertificateChain Returns the certificate and the issuer certificate.
func (c *CertificateService) getCertificateChain(cert []byte, bundle bool) *acme.RawCertificate {
	// Get issuerCert from bundled response from Let's Encrypt
	// See https://community.letsencrypt.org/t/acme-v2-no-up-link-in-response/64962
	_, issuer := pem.Decode(cert)

	// If bundle is false, we want to return a single certificate.
	// To do this, we remove the issuer cert(s) from the issued cert.
	if !bundle {
		cert = bytes.TrimSuffix(cert, issuer)
	}

	return &acme.RawCertificate{Cert: cert, Issuer: issuer}
}


================================================
FILE: acme/api/certificate_test.go
================================================
package api

import (
	"crypto/rand"
	"crypto/rsa"
	"testing"

	"github.com/go-acme/lego/v4/platform/tester"
	"github.com/go-acme/lego/v4/platform/tester/servermock"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

const certResponseMock = `-----BEGIN CERTIFICATE-----
MIIDEDCCAfigAwIBAgIHPhckqW5fPDANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQD
Ex1QZWJibGUgSW50ZXJtZWRpYXRlIENBIDM5NWU2MTAeFw0xODExMDcxNzQ2NTZa
Fw0yMzExMDcxNzQ2NTZaMBMxETAPBgNVBAMTCGFjbWUud3RmMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtLNKvZXD20XPUQCWYSK9rUSKxD9Eb0c9fag
bxOxOkLRTgL8LH6yln+bxc3MrHDou4PpDUdeo2CyOQu3CKsTS5mrH3NXYHu0H7p5
y3riOJTHnfkGKLT9LciGz7GkXd62nvNP57bOf5Sk4P2M+Qbxd0hPTSfu52740LSy
144cnxe2P1aDYehrEp6nYCESuyD/CtUHTo0qwJmzIy163Sp3rSs15BuCPyhySnE3
BJ8Ggv+qC6D5I1932DfSqyQJ79iq/HRm0Fn84am3KwvRlUfWxabmsUGARXoqCgnE
zcbJVOZKewv0zlQJpfac+b+Imj6Lvt1TGjIz2mVyefYgLx8gwwIDAQABo1QwUjAO
BgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG
A1UdEwEB/wQCMAAwEwYDVR0RBAwwCoIIYWNtZS53dGYwDQYJKoZIhvcNAQELBQAD
ggEBABB/0iYhmfPSQot5RaeeovQnsqYjI5ryQK2cwzW6qcTJfv8N6+p6XkqF1+W4
jXZjrQP8MvgO9KNWlvx12vhINE6wubk88L+2piAi5uS2QejmZbXpyYB9s+oPqlk9
IDvfdlVYOqvYAhSx7ggGi+j73mjZVtjAavP6dKuu475ZCeq+NIC15RpbbikWKtYE
HBJ7BW8XQKx67iHGx8ygHTDLbREL80Bck3oUm7wIYGMoNijD6RBl25p4gYl9dzOd
TqGl5hW/1P5hMbgEzHbr4O3BfWqU2g7tV36TASy3jbC3ONFRNNYrpEZ1AL3+cUri
OPPkKtAKAbQkKbUIfsHpBZjKZMU=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIIOV5hkYJx0JwwDQYJKoZIhvcNAQELBQAwIDEeMBwGA1UE
AxMVUGViYmxlIFJvb3QgQ0EgNTBmZmJkMB4XDTE4MTEwNzE3NDY0N1oXDTQ4MTEw
NzE3NDY0N1owKDEmMCQGA1UEAxMdUGViYmxlIEludGVybWVkaWF0ZSBDQSAzOTVl
NjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCacwXN4LmyRTgYS8TT
SZYgz758npHiPTBDKgeN5WVmkkwW0TuN4W2zXhEmcM82uxOEjWS2drvK0+iJKneh
0fQR8ZF35dIYFe8WXTg3kEmqcizSgh4LxlOntsXvatfX/6GU/ADo3xAFoBKCijen
SRBIY65yq5m00cWx3RMIcQq1B0X8nJS0O1P7MYE/Vvidz5St/36RXVu1oWLeS5Fx
HAezW0lqxEUzvC+uLTFWC6f/CilzmI7SsPAkZBk7dO5Qs0d7m/zWF588vlGS+0pt
D1on+lU85Ma2zuAd0qmB6LY66N8pEKKtMk93wF/o4Z5i58ahbwNvTKAzz4JSRWSu
mB9LAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIChDAdBgNVHSUEFjAUBggrBgEFBQcD
AQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEA
upU0DjzvIvoCOYKbq1RRN7rPdYad39mfjxgkeV0iOF5JoIdO6y1C7XAm9lT69Wjm
iUPvnCTMDYft40N2SvmXuuMaPOm4zjNwn4K33jw5XBnpwxC7By/Y0oV+Sl10fBsd
QqXC6H7LcSGkv+4eJbgY33P4uH5ZAy+2TkHUuZDkpufkAshzBust7nDAjfv3AIuQ
wlPoyZfI11eqyiOqRzOq+B5dIBr1JzKnEzSL6n0JLNQiPO7iN03rud/wYD3gbmcv
rzFL1KZfz+HZdnFwFW2T2gVW8L3ii1l9AJDuKzlvjUH3p6bgihVq02sjT8mx+GM2
7R4IbHGnj0BJA2vMYC4hSw==
-----END CERTIFICATE-----
`

const issuerMock = `-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIIOV5hkYJx0JwwDQYJKoZIhvcNAQELBQAwIDEeMBwGA1UE
AxMVUGViYmxlIFJvb3QgQ0EgNTBmZmJkMB4XDTE4MTEwNzE3NDY0N1oXDTQ4MTEw
NzE3NDY0N1owKDEmMCQGA1UEAxMdUGViYmxlIEludGVybWVkaWF0ZSBDQSAzOTVl
NjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCacwXN4LmyRTgYS8TT
SZYgz758npHiPTBDKgeN5WVmkkwW0TuN4W2zXhEmcM82uxOEjWS2drvK0+iJKneh
0fQR8ZF35dIYFe8WXTg3kEmqcizSgh4LxlOntsXvatfX/6GU/ADo3xAFoBKCijen
SRBIY65yq5m00cWx3RMIcQq1B0X8nJS0O1P7MYE/Vvidz5St/36RXVu1oWLeS5Fx
HAezW0lqxEUzvC+uLTFWC6f/CilzmI7SsPAkZBk7dO5Qs0d7m/zWF588vlGS+0pt
D1on+lU85Ma2zuAd0qmB6LY66N8pEKKtMk93wF/o4Z5i58ahbwNvTKAzz4JSRWSu
mB9LAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIChDAdBgNVHSUEFjAUBggrBgEFBQcD
AQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEA
upU0DjzvIvoCOYKbq1RRN7rPdYad39mfjxgkeV0iOF5JoIdO6y1C7XAm9lT69Wjm
iUPvnCTMDYft40N2SvmXuuMaPOm4zjNwn4K33jw5XBnpwxC7By/Y0oV+Sl10fBsd
QqXC6H7LcSGkv+4eJbgY33P4uH5ZAy+2TkHUuZDkpufkAshzBust7nDAjfv3AIuQ
wlPoyZfI11eqyiOqRzOq+B5dIBr1JzKnEzSL6n0JLNQiPO7iN03rud/wYD3gbmcv
rzFL1KZfz+HZdnFwFW2T2gVW8L3ii1l9AJDuKzlvjUH3p6bgihVq02sjT8mx+GM2
7R4IbHGnj0BJA2vMYC4hSw==
-----END CERTIFICATE-----
`

func TestCertificateService_Get_issuerRelUp(t *testing.T) {
	server := tester.MockACMEServer().
		Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
		BuildHTTPS(t)

	key, err := rsa.GenerateKey(rand.Reader, 2048)
	require.NoError(t, err, "Could not generate test key")

	core, err := New(server.Client(), "lego-test", server.URL+"/dir", "", key)
	require.NoError(t, err)

	cert, issuer, err := core.Certificates.Get(server.URL+"/certificate", true)
	require.NoError(t, err)
	assert.Equal(t, certResponseMock, string(cert), "Certificate")
	assert.Equal(t, issuerMock, string(issuer), "IssuerCertificate")
}

func TestCertificateService_Get_embeddedIssuer(t *testing.T) {
	server := tester.MockACMEServer().
		Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
		BuildHTTPS(t)

	key, err := rsa.GenerateKey(rand.Reader, 2048)
	require.NoError(t, err, "Could not generate test key")

	core, err := New(server.Client(), "lego-test", server.URL+"/dir", "", key)
	require.NoError(t, err)

	cert, issuer, err := core.Certificates.Get(server.URL+"/certificate", true)
	require.NoError(t, err)
	assert.Equal(t, certResponseMock, string(cert), "Certificate")
	assert.Equal(t, issuerMock, string(issuer), "IssuerCertificate")
}


================================================
FILE: acme/api/challenge.go
================================================
package api

import (
	"errors"

	"github.com/go-acme/lego/v4/acme"
)

type ChallengeService service

// New Creates a challenge.
func (c *ChallengeService) New(chlgURL string) (acme.ExtendedChallenge, error) {
	if chlgURL == "" {
		return acme.ExtendedChallenge{}, errors.New("challenge[new]: empty URL")
	}

	// Challenge initiation is done by sending a JWS payload containing the trivial JSON object `{}`.
	// We use an empty struct instance as the postJSON payload here to achieve this result.
	var chlng acme.ExtendedChallenge

	resp, err := c.core.post(chlgURL, struct{}{}, &chlng)
	if err != nil {
		return acme.ExtendedChallenge{}, err
	}

	chlng.AuthorizationURL = getLink(resp.Header, "up")
	chlng.RetryAfter = getRetryAfter(resp)

	return chlng, nil
}

// Get Gets a challenge.
func (c *ChallengeService) Get(chlgURL string) (acme.ExtendedChallenge, error) {
	if chlgURL == "" {
		return acme.ExtendedChallenge{}, errors.New("challenge[get]: empty URL")
	}

	var chlng acme.ExtendedChallenge

	resp, err := c.core.postAsGet(chlgURL, &chlng)
	if err != nil {
		return acme.ExtendedChallenge{}, err
	}

	chlng.AuthorizationURL = getLink(resp.Header, "up")
	chlng.RetryAfter = getRetryAfter(resp)

	return chlng, nil
}


================================================
FILE: acme/api/identifier.go
================================================
package api

import (
	"cmp"
	"net"
	"slices"

	"github.com/go-acme/lego/v4/acme"
)

func createIdentifiers(domains []string) []acme.Identifier {
	uniqIdentifiers := make(map[string]struct{})

	var identifiers []acme.Identifier

	for _, domain := range domains {
		if _, ok := uniqIdentifiers[domain]; ok {
			continue
		}

		ident := acme.Identifier{Value: domain, Type: "dns"}

		if net.ParseIP(domain) != nil {
			ident.Type = "ip"
		}

		identifiers = append(identifiers, ident)

		uniqIdentifiers[domain] = struct{}{}
	}

	return identifiers
}

// compareIdentifiers compares 2 slices of [acme.Identifier].
func compareIdentifiers(a, b []acme.Identifier) int {
	// Clones slices to avoid modifying original slices.
	right := slices.Clone(a)
	left := slices.Clone(b)

	slices.SortStableFunc(right, compareIdentifier)
	slices.SortStableFunc(left, compareIdentifier)

	return slices.CompareFunc(right, left, compareIdentifier)
}

func compareIdentifier(right, left acme.Identifier) int {
	return cmp.Or(
		cmp.Compare(right.Type, left.Type),
		cmp.Compare(right.Value, left.Value),
	)
}


================================================
FILE: acme/api/identifier_test.go
================================================
package api

import (
	"testing"

	"github.com/go-acme/lego/v4/acme"
	"github.com/stretchr/testify/assert"
)

func Test_compareIdentifiers(t *testing.T) {
	testCases := []struct {
		desc     string
		a, b     []acme.Identifier
		expected int
	}{
		{
			desc: "identical identifiers",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			expected: 0,
		},
		{
			desc: "identical identifiers but different order",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "*.example.com"},
				{Type: "dns", Value: "example.com"},
			},
			expected: 0,
		},
		{
			desc: "duplicate identifiers",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "example.com"},
			},
			expected: -1,
		},
		{
			desc: "different identifier values",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.org"},
			},
			expected: -1,
		},
		{
			desc: "different identifier types",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "ip", Value: "*.example.com"},
			},
			expected: -1,
		},
		{
			desc: "different number of identifiers a>b",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
				{Type: "dns", Value: "example.org"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			expected: 1,
		},
		{
			desc: "different number of identifiers b>a",
			a: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
			},
			b: []acme.Identifier{
				{Type: "dns", Value: "example.com"},
				{Type: "dns", Value: "*.example.com"},
				{Type: "dns", Value: "example.org"},
			},
			expected: -1,
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			assert.Equal(t, test.expected, compareIdentifiers(test.a, test.b))
		})
	}
}


================================================
FILE: acme/api/internal/nonces/nonce_manager.go
================================================
package nonces

import (
	"errors"
	"fmt"
	"net/http"
	"sync"

	"github.com/go-acme/lego/v4/acme/api/internal/sender"
)

// Manager Manages nonces.
type Manager struct {
	sync.Mutex

	do       *sender.Doer
	nonceURL string
	nonces   []string
}

// NewManager Creates a new Manager.
func NewManager(do *sender.Doer, nonceURL string) *Manager {
	return &Manager{
		do:       do,
		nonceURL: nonceURL,
	}
}

// Pop Pops a nonce.
func (n *Manager) Pop() (string, bool) {
	n.Lock()
	defer n.Unlock()

	if len(n.nonces) == 0 {
		return "", false
	}

	nonce := n.nonces[len(n.nonces)-1]
	n.nonces = n.nonces[:len(n.nonces)-1]

	return nonce, true
}

// Push Pushes a nonce.
func (n *Manager) Push(nonce string) {
	n.Lock()
	defer n.Unlock()

	n.nonces = append(n.nonces, nonce)
}

// Nonce implement jose.NonceSource.
func (n *Manager) Nonce() (string, error) {
	if nonce, ok := n.Pop(); ok {
		return nonce, nil
	}

	return n.getNonce()
}

func (n *Manager) getNonce() (string, error) {
	resp, err := n.do.Head(n.nonceURL)
	if err != nil {
		return "", fmt.Errorf("failed to get nonce from HTTP HEAD: %w", err)
	}

	return GetFromResponse(resp)
}

// GetFromResponse Extracts a nonce from an HTTP response.
func GetFromResponse(resp *http.Response) (string, error) {
	if resp == nil {
		return "", errors.New("nil response")
	}

	nonce := resp.Header.Get("Replay-Nonce")
	if nonce == "" {
		return "", errors.New("server did not respond with a proper nonce header")
	}

	return nonce, nil
}


================================================
FILE: acme/api/internal/nonces/nonce_manager_test.go
================================================
package nonces

import (
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/go-acme/lego/v4/acme"
	"github.com/go-acme/lego/v4/acme/api/internal/sender"
	"github.com/go-acme/lego/v4/platform/tester/servermock"
)

func TestNotHoldingLockWhileMakingHTTPRequests(t *testing.T) {
	manager := servermock.NewBuilder(
		func(server *httptest.Server) (*Manager, error) {
			doer := sender.NewDoer(server.Client(), "lego-test")

			return NewManager(doer, server.URL), nil
		}).
		Route("HEAD /", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
			time.Sleep(250 * time.Millisecond)

			rw.Header().Set("Replay-Nonce", "12345")
			rw.Header().Set("Retry-After", "0")

			servermock.JSONEncode(&acme.Challenge{Type: "http-01", Status: "Valid", URL: "https://example.com/", Token: "token"}).ServeHTTP(rw, req)
		})).
		BuildHTTPS(t)

	ch := make(chan bool)
	resultCh := make(chan bool)

	go func() {
		_, errN := manager.Nonce()
		if errN != nil {
			t.Log(errN)
		}

		ch <- true
	}()
	go func() {
		_, errN := manager.Nonce()
		if errN != nil {
			t.Log(errN)
		}

		ch <- true
	}()
	go func() {
		<-ch
		<-ch

		resultCh <- true
	}()

	select {
	case <-resultCh:
	case <-time.After(500 * time.Millisecond):
		t.Fatal("JWS is probably holding a lock while making HTTP request")
	}
}


================================================
FILE: acme/api/internal/secure/jws.go
================================================
package secure

import (
	"crypto"
	"crypto/ecdsa"
	"crypto/elliptic"
	"crypto/rsa"
	"encoding/base64"
	"fmt"

	"github.com/go-acme/lego/v4/acme/api/internal/nonces"
	jose "github.com/go-jose/go-jose/v4"
)

// JWS Represents a JWS.
type JWS struct {
	privKey crypto.PrivateKey
	kid     string // Key identifier
	nonces  *nonces.Manager
}

// NewJWS Create a new JWS.
func NewJWS(privateKey crypto.PrivateKey, kid string, nonceManager *nonces.Manager) *JWS {
	return &JWS{
		privKey: privateKey,
		nonces:  nonceManager,
		kid:     kid,
	}
}

// SetKid Sets a key identifier.
func (j *JWS) SetKid(kid string) {
	j.kid = kid
}

// SignContent Signs a content with the JWS.
func (j *JWS) SignContent(url string, content []byte) (*jose.JSONWebSignature, error) {
	var alg jose.SignatureAlgorithm

	switch k := j.privKey.(type) {
	case *rsa.PrivateKey:
		alg = jose.RS256
	case *ecdsa.PrivateKey:
		if k.Curve == elliptic.P256() {
			alg = jose.ES256
		} else if k.Curve == elliptic.P384() {
			alg = jose.ES384
		}
	}

	signKey := jose.SigningKey{
		Algorithm: alg,
		Key:       jose.JSONWebKey{Key: j.privKey, KeyID: j.kid},
	}

	options := jose.SignerOptions{
		NonceSource: j.nonces,
		ExtraHeaders: map[jose.HeaderKey]any{
			"url": url,
		},
	}

	if j.kid == "" {
		options.EmbedJWK = true
	}

	signer, err := jose.NewSigner(signKey, &options)
	if err != nil {
		return nil, fmt.Errorf("failed to create jose signer: %w", err)
	}

	signed, err := signer.Sign(content)
	if err != nil {
		return nil, fmt.Errorf("failed to sign content: %w", err)
	}

	return signed, nil
}

// SignEABContent Signs an external account binding content with the JWS.
func (j *JWS) SignEABContent(url, kid string, hmac []byte) (*jose.JSONWebSignature, error) {
	jwk := jose.JSONWebKey{Key: j.privKey}

	jwkJSON, err := jwk.Public().MarshalJSON()
	if err != nil {
		return nil, fmt.Errorf("acme: error encoding eab jwk key: %w", err)
	}

	signer, err := jose.NewSigner(
		jose.SigningKey{Algorithm: jose.HS256, Key: hmac},
		&jose.SignerOptions{
			EmbedJWK: false,
			ExtraHeaders: map[jose.HeaderKey]any{
				"kid": kid,
				"url": url,
			},
		},
	)
	if err != nil {
		return nil, fmt.Errorf("failed to create External Account Binding jose signer: %w", err)
	}

	signed, err := signer.Sign(jwkJSON)
	if err != nil {
		return nil, fmt.Errorf("failed to External Account Binding sign content: %w", err)
	}

	return signed, nil
}

// GetKeyAuthorization Gets the key authorization for a token.
func (j *JWS) GetKeyAuthorization(token string) (string, error) {
	var publicKey crypto.PublicKey

	switch k := j.privKey.(type) {
	case *ecdsa.PrivateKey:
		publicKey = k.Public()
	case *rsa.PrivateKey:
		publicKey = k.Public()
	}

	// Generate the Key Authorization for the challenge
	jwk := &jose.JSONWebKey{Key: publicKey}

	thumbBytes, err := jwk.Thumbprint(crypto.SHA256)
	if err != nil {
		return "", err
	}

	// unpad the base64URL
	keyThumb := base64.RawURLEncoding.EncodeToString(thumbBytes)

	return token + "." + keyThumb, nil
}


================================================
FILE: acme/api/internal/secure/jws_test.go
================================================
package secure

import (
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/go-acme/lego/v4/acme"
	"github.com/go-acme/lego/v4/acme/api/internal/nonces"
	"github.com/go-acme/lego/v4/acme/api/internal/sender"
	"github.com/go-acme/lego/v4/platform/tester/servermock"
)

func TestNotHoldingLockWhileMakingHTTPRequests(t *testing.T) {
	manager := servermock.NewBuilder(
		func(server *httptest.Server) (*nonces.Manager, error) {
			doer := sender.NewDoer(server.Client(), "lego-test")

			return nonces.NewManager(doer, server.URL), nil
		}).
		Route("HEAD /", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
			time.Sleep(250 * time.Millisecond)

			rw.Header().Set("Replay-Nonce", "12345")
			rw.Header().Set("Retry-After", "0")

			servermock.JSONEncode(&acme.Challenge{Type: "http-01", Status: "Valid", URL: "https://example.com/", Token: "token"}).ServeHTTP(rw, req)
		})).
		BuildHTTPS(t)

	ch := make(chan bool)
	resultCh := make(chan bool)

	go func() {
		_, errN := manager.Nonce()
		if errN != nil {
			t.Log(errN)
		}

		ch <- true
	}()
	go func() {
		_, errN := manager.Nonce()
		if errN != nil {
			t.Log(errN)
		}

		ch <- true
	}()
	go func() {
		<-ch
		<-ch

		resultCh <- true
	}()

	select {
	case <-resultCh:
	case <-time.After(500 * time.Millisecond):
		t.Fatal("JWS is probably holding a lock while making HTTP request")
	}
}


================================================
FILE: acme/api/internal/sender/sender.go
================================================
package sender

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"runtime"
	"strings"

	"github.com/go-acme/lego/v4/acme"
)

type RequestOption func(*http.Request) error

func contentType(ct string) RequestOption {
	return func(req *http.Request) error {
		req.Header.Set("Content-Type", ct)
		return nil
	}
}

type Doer struct {
	httpClient *http.Client
	userAgent  string
}

// NewDoer Creates a new Doer.
func NewDoer(client *http.Client, userAgent string) *Doer {
	client.Transport = newHTTPSOnly(client)

	return &Doer{
		httpClient: client,
		userAgent:  userAgent,
	}
}

// Get performs a GET request with a proper User-Agent string.
// If "response" is not provided, callers should close resp.Body when done reading from it.
func (d *Doer) Get(url string, response any) (*http.Response, error) {
	req, err := d.newRequest(http.MethodGet, url, nil)
	if err != nil {
		return nil, err
	}

	return d.do(req, response)
}

// Head performs a HEAD request with a proper User-Agent string.
// The response body (resp.Body) is already closed when this function returns.
func (d *Doer) Head(url string) (*http.Response, error) {
	req, err := d.newRequest(http.MethodHead, url, nil)
	if err != nil {
		return nil, err
	}

	return d.do(req, nil)
}

// Post performs a POST request with a proper User-Agent string.
// If "response" is not provided, callers should close resp.Body when done reading from it.
func (d *Doer) Post(url string, body io.Reader, bodyType string, response any) (*http.Response, error) {
	req, err := d.newRequest(http.MethodPost, url, body, contentType(bodyType))
	if err != nil {
		return nil, err
	}

	return d.do(req, response)
}

func (d *Doer) newRequest(method, uri string, body io.Reader, opts ...RequestOption) (*http.Request, error) {
	req, err := http.NewRequest(method, uri, body)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.Header.Set("User-Agent", d.formatUserAgent())

	for _, opt := range opts {
		err = opt(req)
		if err != nil {
			return nil, fmt.Errorf("failed to create request: %w", err)
		}
	}

	return req, nil
}

func (d *Doer) do(req *http.Request, response any) (*http.Response, error) {
	resp, err := d.httpClient.Do(req)
	if err != nil {
		return nil, err
	}

	if err = checkError(req, resp); err != nil {
		return resp, err
	}

	if response != nil {
		raw, err := io.ReadAll(resp.Body)
		if err != nil {
			return resp, err
		}

		defer resp.Body.Close()

		err = json.Unmarshal(raw, response)
		if err != nil {
			return resp, fmt.Errorf("failed to unmarshal %q to type %T: %w", raw, response, err)
		}
	}

	return resp, nil
}

// formatUserAgent builds and returns the User-Agent string to use in requests.
func (d *Doer) formatUserAgent() string {
	ua := fmt.Sprintf("%s %s (%s; %s; %s)", d.userAgent, ourUserAgent, ourUserAgentComment, runtime.GOOS, runtime.GOARCH)
	return strings.TrimSpace(ua)
}

func checkError(req *http.Request, resp *http.Response) error {
	if resp.StatusCode < http.StatusBadRequest {
		return nil
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("%d :: %s :: %s :: %w", resp.StatusCode, req.Method, req.URL, err)
	}

	var errorDetails *acme.ProblemDetails

	err = json.Unmarshal(body, &errorDetails)
	if err != nil {
		return fmt.Errorf("%d ::%s :: %s :: %w :: %s", resp.StatusCode, req.Method, req.URL, err, string(body))
	}

	errorDetails.Method = req.Method
	errorDetails.URL = req.URL.String()

	if errorDetails.HTTPStatus == 0 {
		errorDetails.HTTPStatus = resp.StatusCode
	}

	// Check for errors we handle specifically
	switch {
	case errorDetails.HTTPStatus == http.StatusBadRequest && errorDetails.Type == acme.BadNonceErr:
		return &acme.NonceError{ProblemDetails: errorDetails}

	case errorDetails.HTTPStatus == http.StatusConflict && errorDetails.Type == acme.AlreadyReplacedErr:
		return &acme.AlreadyReplacedError{ProblemDetails: errorDetails}

	case errorDetails.HTTPStatus == http.StatusTooManyRequests && errorDetails.Type == acme.RateLimitedErr:
		return &acme.RateLimitedError{
			ProblemDetails: errorDetails,
			RetryAfter:     resp.Header.Get("Retry-After"),
		}

	default:
		return errorDetails
	}
}

type httpsOnly struct {
	rt http.RoundTripper
}

func newHTTPSOnly(client *http.Client) *httpsOnly {
	if client.Transport == nil {
		return &httpsOnly{rt: http.DefaultTransport}
	}

	return &httpsOnly{rt: client.Transport}
}

// RoundTrip ensure HTTPS is used.
// Each ACME function is accomplished by the client sending a sequence of HTTPS requests to the server [RFC2818],
// carrying JSON messages [RFC8259].
// Use of HTTPS is REQUIRED.
// https://datatracker.ietf.org/doc/html/rfc8555#section-6.1
func (r *httpsOnly) RoundTrip(req *http.Request) (*http.Response, error) {
	if req.URL.Scheme != "https" {
		return nil, fmt.Errorf("HTTPS is required: %s", req.URL)
	}

	return r.rt.RoundTrip(req)
}


================================================
FILE: acme/api/internal/sender/sender_test.go
================================================
package sender

import (
	"bytes"
	"io"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"

	"github.com/go-acme/lego/v4/acme"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestDo_UserAgentOnAllHTTPMethod(t *testing.T) {
	var ua, method string

	server := httptest.NewTLSServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) {
		ua = r.Header.Get("User-Agent")
		method = r.Method
	}))
	t.Cleanup(server.Close)

	doer := NewDoer(server.Client(), "")

	testCases := []struct {
		method string
		call   func(u string) (*http.Response, error)
	}{
		{
			method: http.MethodGet,
			call: func(u string) (*http.Response, error) {
				return doer.Get(u, nil)
			},
		},
		{
			method: http.MethodHead,
			call:   doer.Head,
		},
		{
			method: http.MethodPost,
			call: func(u string) (*http.Response, error) {
				return doer.Post(u, strings.NewReader("falalalala"), "text/plain", nil)
			},
		},
	}

	for _, test := range testCases {
		t.Run(test.method, func(t *testing.T) {
			_, err := test.call(server.URL)
			require.NoError(t, err)

			assert.Equal(t, test.method, method)
			assert.Contains(t, ua, ourUserAgent, "User-Agent")
		})
	}
}

func TestDo_CustomUserAgent(t *testing.T) {
	customUA := "MyApp/1.2.3"
	doer := NewDoer(http.DefaultClient, customUA)

	ua := doer.formatUserAgent()
	assert.Contains(t, ua, ourUserAgent)
	assert.Contains(t, ua, customUA)

	if strings.HasSuffix(ua, " ") {
		t.Errorf("UA should not have trailing spaces; got '%s'", ua)
	}

	assert.Len(t, strings.Split(ua, " "), 5)
}

func TestDo_failWithHTTP(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {}))
	t.Cleanup(server.Close)

	sender := NewDoer(server.Client(), "test")

	_, err := sender.Post(server.URL, strings.NewReader("data"), "text/plain", nil)
	require.ErrorContains(t, err, "HTTPS is required: http://")
}

func Test_checkError(t *testing.T) {
	testCases := []struct {
		desc   string
		resp   *http.Response
		assert func(t *testing.T, err error)
	}{
		{
			desc: "default",
			resp: &http.Response{
				StatusCode: http.StatusNotFound,
				Body:       io.NopCloser(bytes.NewBufferString(`{"type":"urn:ietf:params:acme:error:example","detail":"message","status":404}`)),
			},
			assert: errorAs[*acme.ProblemDetails],
		},
		{
			desc: "badNonce",
			resp: &http.Response{
				StatusCode: http.StatusBadRequest,
				Body:       io.NopCloser(bytes.NewBufferString(`{"type":"urn:ietf:params:acme:error:badNonce","detail":"message","status":400}`)),
			},
			assert: errorAs[*acme.NonceError],
		},
		{
			desc: "alreadyReplaced",
			resp: &http.Response{
				StatusCode: http.StatusConflict,
				Body:       io.NopCloser(bytes.NewBufferString(`{"type":"urn:ietf:params:acme:error:alreadyReplaced","detail":"message","status":409}`)),
			},
			assert: errorAs[*acme.AlreadyReplacedError],
		},
		{
			desc: "rateLimited",
			resp: &http.Response{
				StatusCode: http.StatusConflict,
				Header: http.Header{
					"Retry-After": []string{"1"},
				},
				Body: io.NopCloser(bytes.NewBufferString(`{"type":"urn:ietf:params:acme:error:rateLimited","detail":"message","status":429}`)),
			},
			assert: errorAs[*acme.RateLimitedError],
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			req := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "https://example.com", nil)

			err := checkError(req, test.resp)
			require.Error(t, err)

			pb := &acme.ProblemDetails{}
			assert.ErrorAs(t, err, &pb)

			test.assert(t, err)
		})
	}
}

func errorAs[T error](t *testing.T, err error) {
	t.Helper()

	var zero T
	assert.ErrorAs(t, err, &zero)
}


================================================
FILE: acme/api/internal/sender/useragent.go
================================================
// Code generated by 'internal/releaser'; DO NOT EDIT.

package sender

const (
	// ourUserAgent is the User-Agent of this underlying library package.
	ourUserAgent = "xenolf-acme/4.33.0"

	// ourUserAgentComment is part of the UA comment linked to the version status of this underlying library package.
	// values: detach|release
	// NOTE: Update this with each tagged release.
	ourUserAgentComment = "detach"
)


================================================
FILE: acme/api/order.go
================================================
package api

import (
	"encoding/base64"
	"errors"
	"fmt"
	"slices"
	"time"

	"github.com/go-acme/lego/v4/acme"
)

// OrderOptions used to create an order (optional).
type OrderOptions struct {
	NotBefore time.Time
	NotAfter  time.Time

	// A string uniquely identifying the profile
	// which will be used to affect issuance of the certificate requested by this Order.
	// - https://www.ietf.org/id/draft-ietf-acme-profiles-00.html#section-4
	Profile string

	// A string uniquely identifying a previously-issued certificate which this
	// order is intended to replace.
	// - https://www.rfc-editor.org/rfc/rfc9773.html#section-5
	ReplacesCertID string
}

type OrderService service

// New Creates a new order.
func (o *OrderService) New(domains []string) (acme.ExtendedOrder, error) {
	return o.NewWithOptions(domains, nil)
}

// NewWithOptions Creates a new order.
func (o *OrderService) NewWithOptions(domains []string, opts *OrderOptions) (acme.ExtendedOrder, error) {
	orderReq := acme.Order{Identifiers: createIdentifiers(domains)}

	if opts != nil {
		if !opts.NotAfter.IsZero() {
			orderReq.NotAfter = opts.NotAfter.Format(time.RFC3339)
		}

		if !opts.NotBefore.IsZero() {
			orderReq.NotBefore = opts.NotBefore.Format(time.RFC3339)
		}

		if o.core.GetDirectory().RenewalInfo != "" {
			orderReq.Replaces = opts.ReplacesCertID
		}

		if opts.Profile != "" {
			orderReq.Profile = opts.Profile
		}
	}

	var order acme.Order

	resp, err := o.core.post(o.core.GetDirectory().NewOrderURL, orderReq, &order)
	if err != nil {
		are := &acme.AlreadyReplacedError{}
		if !errors.As(err, &are) {
			return acme.ExtendedOrder{}, err
		}

		// If the Server rejects the request because the identified certificate has already been marked as replaced,
		// it MUST return an HTTP 409 (Conflict) with a problem document of type "alreadyReplaced" (see Section 7.4).
		// https://www.rfc-editor.org/rfc/rfc9773.html#section-5
		orderReq.Replaces = ""

		resp, err = o.core.post(o.core.GetDirectory().NewOrderURL, orderReq, &order)
		if err != nil {
			return acme.ExtendedOrder{}, err
		}
	}

	// The server MUST return an error if it cannot fulfill the request as specified,
	// and it MUST NOT issue a certificate with contents other than those requested.
	// If the server requires the request to be modified in a certain way,
	// it should indicate the required changes using an appropriate error type and description.
	// https://www.rfc-editor.org/rfc/rfc8555#section-7.4
	//
	// Some ACME servers don't return an error,
	// and/or change the order identifiers in the response,
	// so we need to ensure that the identifiers are the same as requested.
	// Deduplication by the server is allowed.
	if compareIdentifiers(orderReq.Identifiers, order.Identifiers) != 0 {
		// Sorts identifiers to avoid error message ambiguities about the order of the identifiers.
		slices.SortStableFunc(orderReq.Identifiers, compareIdentifier)
		slices.SortStableFunc(order.Identifiers, compareIdentifier)

		return acme.ExtendedOrder{},
			fmt.Errorf("order identifiers have been modified by the ACME server (RFC8555 §7.4): %+v != %+v",
				orderReq.Identifiers, order.Identifiers)
	}

	return acme.ExtendedOrder{
		Order:    order,
		Location: resp.Header.Get("Location"),
	}, nil
}

// Get Gets an order.
func (o *OrderService) Get(orderURL string) (acme.ExtendedOrder, error) {
	if orderURL == "" {
		return acme.ExtendedOrder{}, errors.New("order[get]: empty URL")
	}

	var order acme.Order

	_, err := o.core.postAsGet(orderURL, &order)
	if err != nil {
		return acme.ExtendedOrder{}, err
	}

	return acme.ExtendedOrder{Order: order}, nil
}

// UpdateForCSR Updates an order for a CSR.
func (o *OrderService) UpdateForCSR(orderURL string, csr []byte) (acme.ExtendedOrder, error) {
	csrMsg := acme.CSRMessage{
		Csr: base64.RawURLEncoding.EncodeToString(csr),
	}

	var order acme.Order

	_, err := o.core.post(orderURL, csrMsg, &order)
	if err != nil {
		return acme.ExtendedOrder{}, err
	}

	if order.Status == acme.StatusInvalid {
		return acme.ExtendedOrder{}, fmt.Errorf("invalid order: %w", order.Err())
	}

	return acme.ExtendedOrder{Order: order}, nil
}


================================================
FILE: acme/api/order_test.go
================================================
package api

import (
	"crypto/rand"
	"crypto/rsa"
	"encoding/json"
	"io"
	"net/http"
	"testing"
	"time"

	"github.com/go-acme/lego/v4/acme"
	"github.com/go-acme/lego/v4/platform/tester"
	"github.com/go-acme/lego/v4/platform/tester/servermock"
	"github.com/go-jose/go-jose/v4"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestOrderService_NewWithOptions(t *testing.T) {
	// small value keeps test fast
	privateKey, errK := rsa.GenerateKey(rand.Reader, 1024)
	require.NoError(t, errK, "Could not generate test key")

	server := tester.MockACMEServer().
		Route("POST /newOrder",
			http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
				body, err := readSignedBody(req, privateKey)
				if err != nil {
					http.Error(rw, err.Error(), http.StatusBadRequest)
					return
				}

				order := acme.Order{}

				err = json.Unmarshal(body, &order)
				if err != nil {
					http.Error(rw, err.Error(), http.StatusBadRequest)
					return
				}

				servermock.JSONEncode(acme.Order{
					Status:         acme.StatusValid,
					Expires:        order.Expires,
					Identifiers:    order.Identifiers,
					Profile:        order.Profile,
					NotBefore:      order.NotBefore,
					NotAfter:       order.NotAfter,
					Error:          order.Error,
					Authorizations: order.Authorizations,
					Finalize:       order.Finalize,
					Certificate:    order.Certificate,
					Replaces:       order.Replaces,
				}).ServeHTTP(rw, req)
			})).
		BuildHTTPS(t)

	core, err := New(server.Client(), "lego-test", server.URL+"/dir", "", privateKey)
	require.NoError(t, err)

	testCases := []struct {
		desc     string
		opts     *OrderOptions
		expected acme.ExtendedOrder
	}{
		{
			desc: "simple",
			expected: acme.ExtendedOrder{
				Order: acme.Order{
					Status:      "valid",
					Identifiers: []acme.Identifier{{Type: "dns", Value: "example.com"}},
				},
			},
		},
		{
			desc: "with options",
			opts: &OrderOptions{
				NotBefore: time.Date(2023, 1, 1, 1, 0, 0, 0, time.UTC),
				NotAfter:  time.Date(2023, 1, 2, 1, 0, 0, 0, time.UTC),
			},
			expected: acme.ExtendedOrder{
				Order: acme.Order{
					Status:      "valid",
					Identifiers: []acme.Identifier{{Type: "dns", Value: "example.com"}},
					NotBefore:   "2023-01-01T01:00:00Z",
					NotAfter:    "2023-01-02T01:00:00Z",
				},
			},
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			order, err := core.Orders.NewWithOptions([]string{"example.com"}, test.opts)
			require.NoError(t, err)

			assert.Equal(t, test.expected, order)
		})
	}
}

func readSignedBody(r *http.Request, privateKey *rsa.PrivateKey) ([]byte, error) {
	reqBody, err := io.ReadAll(r.Body)
	if err != nil {
		return nil, err
	}

	sigAlgs := []jose.SignatureAlgorithm{jose.RS256}

	jws, err := jose.ParseSigned(string(reqBody), sigAlgs)
	if err != nil {
		return nil, err
	}

	body, err := jws.Verify(&jose.JSONWebKey{
		Key:       privateKey.Public(),
		Algorithm: "RSA",
	})
	if err != nil {
		return nil, err
	}

	return body, nil
}


================================================
FILE: acme/api/renewal.go
================================================
package api

import (
	"errors"
	"net/http"
)

// ErrNoARI is returned when the server does not advertise a renewal info endpoint.
var ErrNoARI = errors.New("renewalInfo[get/post]: server does not advertise a renewal info endpoint")

// GetRenewalInfo GETs renewal information for a certificate from the renewalInfo endpoint.
// This is used to determine if a certificate needs to be renewed.
//
// Note: this endpoint is part of a draft specification, not all ACME servers will implement it.
// This method will return api.ErrNoARI if the server does not advertise a renewal info endpoint.
//
// https://www.rfc-editor.org/rfc/rfc9773.html
func (c *CertificateService) GetRenewalInfo(certID string) (*http.Response, error) {
	if c.core.GetDirectory().RenewalInfo == "" {
		return nil, ErrNoARI
	}

	if certID == "" {
		return nil, errors.New("renewalInfo[get]: 'certID' cannot be empty")
	}

	return c.core.HTTPClient.Get(c.core.GetDirectory().RenewalInfo + "/" + certID)
}


================================================
FILE: acme/api/service.go
================================================
package api

import (
	"fmt"
	"net/http"
	"regexp"
	"strconv"
	"time"
)

type service struct {
	core *Core
}

// getLink get a rel into the Link header.
func getLink(header http.Header, rel string) string {
	links := getLinks(header, rel)
	if len(links) < 1 {
		return ""
	}

	return links[0]
}

func getLinks(header http.Header, rel string) []string {
	linkExpr := regexp.MustCompile(`<(.+?)>(?:;[^;]+)*?;\s*rel="(.+?)"`)

	var links []string

	for _, link := range header["Link"] {
		for _, m := range linkExpr.FindAllStringSubmatch(link, -1) {
			if len(m) != 3 {
				continue
			}

			if m[2] == rel {
				links = append(links, m[1])
			}
		}
	}

	return links
}

// getLocation get the value of the header Location.
func getLocation(resp *http.Response) string {
	if resp == nil {
		return ""
	}

	return resp.Header.Get("Location")
}

// getRetryAfter get the value of the header Retry-After.
func getRetryAfter(resp *http.Response) string {
	if resp == nil {
		return ""
	}

	return resp.Header.Get("Retry-After")
}

// ParseRetryAfter parses the Retry-After header value according to RFC 7231.
// The header can be either delay-seconds (numeric) or HTTP-date (RFC 1123 format).
// https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.3
// Returns the duration until the retry time.
// TODO(ldez): unexposed this function in v5.
func ParseRetryAfter(value string) (time.Duration, error) {
	if value == "" {
		return 0, nil
	}

	if seconds, err := strconv.ParseInt(value, 10, 64); err == nil {
		return time.Duration(seconds) * time.Second, nil
	}

	if retryTime, err := time.Parse(time.RFC1123, value); err == nil {
		duration := time.Until(retryTime)
		if duration < 0 {
			return 0, nil
		}

		return duration, nil
	}

	return 0, fmt.Errorf("invalid Retry-After value: %q", value)
}


================================================
FILE: acme/api/service_test.go
================================================
package api

import (
	"net/http"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func Test_getLink(t *testing.T) {
	testCases := []struct {
		desc     string
		header   http.Header
		relName  string
		expected string
	}{
		{
			desc: "success",
			header: http.Header{
				"Link": []string{`<https://acme-staging-v02.api.letsencrypt.org/next>; rel="next", <https://acme-staging-v02.api.letsencrypt.org/up?query>; rel="up"`},
			},
			relName:  "up",
			expected: "https://acme-staging-v02.api.letsencrypt.org/up?query",
		},
		{
			desc: "success several lines",
			header: http.Header{
				"Link": []string{`<https://acme-staging-v02.api.letsencrypt.org/next>; rel="next"`, `<https://acme-staging-v02.api.letsencrypt.org/up?query>; rel="up"`},
			},
			relName:  "up",
			expected: "https://acme-staging-v02.api.letsencrypt.org/up?query",
		},
		{
			desc:     "no link",
			header:   http.Header{},
			relName:  "up",
			expected: "",
		},
		{
			desc:     "no header",
			relName:  "up",
			expected: "",
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			link := getLink(test.header, test.relName)

			assert.Equal(t, test.expected, link)
		})
	}
}

func TestParseRetryAfter(t *testing.T) {
	testCases := []struct {
		desc     string
		value    string
		expected time.Duration
	}{
		{
			desc:     "empty header value",
			value:    "",
			expected: time.Duration(0),
		},
		{
			desc:     "delay-seconds",
			value:    "123",
			expected: 123 * time.Second,
		},
		{
			desc:     "HTTP-date",
			value:    time.Now().Add(3 * time.Second).Format(time.RFC1123),
			expected: 3 * time.Second,
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			rt, err := ParseRetryAfter(test.value)
			require.NoError(t, err)

			assert.InDelta(t, test.expected.Seconds(), rt.Seconds(), 1)
		})
	}
}


================================================
FILE: acme/commons.go
================================================
// Package acme contains all objects related the ACME endpoints.
// https://www.rfc-editor.org/rfc/rfc8555.html
package acme

import (
	"encoding/json"
	"time"
)

// ACME status values of Account, Order, Authorization and Challenge objects.
// See https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.6 for details.
const (
	StatusDeactivated = "deactivated"
	StatusExpired     = "expired"
	StatusInvalid     = "invalid"
	StatusPending     = "pending"
	StatusProcessing  = "processing"
	StatusReady       = "ready"
	StatusRevoked     = "revoked"
	StatusUnknown     = "unknown"
	StatusValid       = "valid"
)

// CRL reason codes as defined in RFC 5280.
// https://datatracker.ietf.org/doc/html/rfc5280#section-5.3.1
const (
	CRLReasonUnspecified          uint = 0
	CRLReasonKeyCompromise        uint = 1
	CRLReasonCACompromise         uint = 2
	CRLReasonAffiliationChanged   uint = 3
	CRLReasonSuperseded           uint = 4
	CRLReasonCessationOfOperation uint = 5
	CRLReasonCertificateHold      uint = 6
	CRLReasonRemoveFromCRL        uint = 8
	CRLReasonPrivilegeWithdrawn   uint = 9
	CRLReasonAACompromise         uint = 10
)

// Directory the ACME directory object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.1
// - https://www.rfc-editor.org/rfc/rfc9773.html
type Directory struct {
	NewNonceURL   string `json:"newNonce"`
	NewAccountURL string `json:"newAccount"`
	NewOrderURL   string `json:"newOrder"`
	NewAuthzURL   string `json:"newAuthz"`
	RevokeCertURL string `json:"revokeCert"`
	KeyChangeURL  string `json:"keyChange"`
	Meta          Meta   `json:"meta"`
	RenewalInfo   string `json:"renewalInfo"`
}

// Meta the ACME meta object (related to Directory).
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.1
type Meta struct {
	// termsOfService (optional, string):
	// A URL identifying the current terms of service.
	TermsOfService string `json:"termsOfService"`

	// website (optional, string):
	// An HTTP or HTTPS URL locating a website providing more information about the ACME server.
	Website string `json:"website"`

	// caaIdentities (optional, array of string):
	// The hostnames that the ACME server recognizes as referring to itself
	// for the purposes of CAA record validation as defined in [RFC6844].
	// Each string MUST represent the same sequence of ASCII code points
	// that the server will expect to see as the "Issuer Domain Name" in a CAA issue or issuewild property tag.
	// This allows clients to determine the correct issuer domain name to use when configuring CAA records.
	CaaIdentities []string `json:"caaIdentities"`

	// externalAccountRequired (optional, boolean):
	// If this field is present and set to "true",
	// then the CA requires that all new-account requests include an "externalAccountBinding" field
	// associating the new account with an external account.
	ExternalAccountRequired bool `json:"externalAccountRequired"`

	// profiles (optional, object):
	// A map of profile names to human-readable descriptions of those profiles.
	// https://www.ietf.org/id/draft-ietf-acme-profiles-00.html#section-3
	Profiles map[string]string `json:"profiles"`
}

// ExtendedAccount an extended Account.
type ExtendedAccount struct {
	Account

	// Contains the value of the response header `Location`
	Location string `json:"-"`
}

// Account the ACME account Object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.2
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.3
type Account struct {
	// status (required, string):
	// The status of this account.
	// Possible values are: "valid", "deactivated", and "revoked".
	// The value "deactivated" should be used to indicate client-initiated deactivation
	// whereas "revoked" should be used to indicate server-initiated deactivation. (See Section 7.1.6)
	Status string `json:"status,omitempty"`

	// contact (optional, array of string):
	// An array of URLs that the server can use to contact the client for issues related to this account.
	// For example, the server may wish to notify the client about server-initiated revocation or certificate expiration.
	// For information on supported URL schemes, see Section 7.3
	Contact []string `json:"contact,omitempty"`

	// termsOfServiceAgreed (optional, boolean):
	// Including this field in a new-account request,
	// with a value of true, indicates the client's agreement with the terms of service.
	// This field is not updateable by the client.
	TermsOfServiceAgreed bool `json:"termsOfServiceAgreed,omitempty"`

	// orders (required, string):
	// A URL from which a list of orders submitted by this account can be fetched via a POST-as-GET request,
	// as described in Section 7.1.2.1.
	Orders string `json:"orders,omitempty"`

	// onlyReturnExisting (optional, boolean):
	// If this field is present with the value "true",
	// then the server MUST NOT create a new account if one does not already exist.
	// This allows a client to look up an account URL based on an account key (see Section 7.3.1).
	OnlyReturnExisting bool `json:"onlyReturnExisting,omitempty"`

	// externalAccountBinding (optional, object):
	// An optional field for binding the new account with an existing non-ACME account (see Section 7.3.4).
	ExternalAccountBinding json.RawMessage `json:"externalAccountBinding,omitempty"`
}

// ExtendedOrder a extended Order.
type ExtendedOrder struct {
	Order

	// The order URL, contains the value of the response header `Location`
	Location string `json:"-"`
}

// Order the ACME order Object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.3
type Order struct {
	// status (required, string):
	// The status of this order.
	// Possible values are: "pending", "ready", "processing", "valid", and "invalid".
	Status string `json:"status,omitempty"`

	// expires (optional, string):
	// The timestamp after which the server will consider this order invalid,
	// encoded in the format specified in RFC 3339 [RFC3339].
	// This field is REQUIRED for objects with "pending" or "valid" in the status field.
	Expires string `json:"expires,omitempty"`

	// identifiers (required, array of object):
	// An array of identifier objects that the order pertains to.
	Identifiers []Identifier `json:"identifiers"`

	// profile (string, optional):
	// A string uniquely identifying the profile
	// which will be used to affect issuance of the certificate requested by this Order.
	// https://www.ietf.org/id/draft-ietf-acme-profiles-00.html#section-4
	Profile string `json:"profile,omitempty"`

	// notBefore (optional, string):
	// The requested value of the notBefore field in the certificate,
	// in the date format defined in [RFC3339].
	NotBefore string `json:"notBefore,omitempty"`

	// notAfter (optional, string):
	// The requested value of the notAfter field in the certificate,
	// in the date format defined in [RFC3339].
	NotAfter string `json:"notAfter,omitempty"`

	// error (optional, object):
	// The error that occurred while processing the order, if any.
	// This field is structured as a problem document [RFC7807].
	Error *ProblemDetails `json:"error,omitempty"`

	// authorizations (required, array of string):
	// For pending orders,
	// the authorizations that the client needs to complete before the requested certificate can be issued (see Section 7.5),
	// including unexpired authorizations that the client has completed in the past for identifiers specified in the order.
	// The authorizations required are dictated by server policy
	// and there may not be a 1:1 relationship between the order identifiers and the authorizations required.
	// For final orders (in the "valid" or "invalid" state), the authorizations that were completed.
	// Each entry is a URL from which an authorization can be fetched with a POST-as-GET request.
	Authorizations []string `json:"authorizations,omitempty"`

	// finalize (required, string):
	// A URL that a CSR must be POSTed to once all of the order's authorizations are satisfied to finalize the order.
	// The result of a successful finalization will be the population of the certificate URL for the order.
	Finalize string `json:"finalize,omitempty"`

	// certificate (optional, string):
	// A URL for the certificate that has been issued in response to this order
	Certificate string `json:"certificate,omitempty"`

	// replaces (optional, string):
	// replaces (string, optional): A string uniquely identifying a
	// previously-issued certificate which this order is intended to replace.
	// - https://www.rfc-editor.org/rfc/rfc9773.html#section-5
	Replaces string `json:"replaces,omitempty"`
}

func (r *Order) Err() error {
	if r.Error != nil {
		return r.Error
	}

	return nil
}

// Authorization the ACME authorization object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.4
type Authorization struct {
	// status (required, string):
	// The status of this authorization.
	// Possible values are: "pending", "valid", "invalid", "deactivated", "expired", and "revoked".
	Status string `json:"status"`

	// expires (optional, string):
	// The timestamp after which the server will consider this authorization invalid,
	// encoded in the format specified in RFC 3339 [RFC3339].
	// This field is REQUIRED for objects with "valid" in the "status" field.
	Expires time.Time `json:"expires,omitzero"`

	// identifier (required, object):
	// The identifier that the account is authorized to represent
	Identifier Identifier `json:"identifier"`

	// challenges (required, array of objects):
	// For pending authorizations, the challenges that the client can fulfill in order to prove possession of the identifier.
	// For valid authorizations, the challenge that was validated.
	// For invalid authorizations, the challenge that was attempted and failed.
	// Each array entry is an object with parameters required to validate the challenge.
	// A client should attempt to fulfill one of these challenges,
	// and a server should consider any one of the challenges sufficient to make the authorization valid.
	Challenges []Challenge `json:"challenges,omitempty"`

	// wildcard (optional, boolean):
	// For authorizations created as a result of a newOrder request containing a DNS identifier
	// with a value that contained a wildcard prefix this field MUST be present, and true.
	Wildcard bool `json:"wildcard,omitempty"`
}

// ExtendedChallenge a extended Challenge.
type ExtendedChallenge struct {
	Challenge

	// Contains the value of the response header `Retry-After`
	RetryAfter string `json:"-"`
	// Contains the value of the response header `Link` rel="up"
	AuthorizationURL string `json:"-"`
}

// Challenge the ACME challenge object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.1.5
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-8
type Challenge struct {
	// type (required, string):
	// The type of challenge encoded in the object.
	Type string `json:"type"`

	// url (required, string):
	// The URL to which a response can be posted.
	URL string `json:"url"`

	// status (required, string):
	// The status of this challenge. Possible values are: "pending", "processing", "valid", and "invalid".
	Status string `json:"status"`

	// validated (optional, string):
	// The time at which the server validated this challenge,
	// encoded in the format specified in RFC 3339 [RFC3339].
	// This field is REQUIRED if the "status" field is "valid".
	Validated time.Time `json:"validated,omitzero"`

	// error (optional, object):
	// Error that occurred while the server was validating the challenge, if any,
	// structured as a problem document [RFC7807].
	// Multiple errors can be indicated by using subproblems Section 6.7.1.
	// A challenge object with an error MUST have status equal to "invalid".
	Error *ProblemDetails `json:"error,omitempty"`

	// token (required, string):
	// A random value that uniquely identifies the challenge.
	// This value MUST have at least 128 bits of entropy.
	// It MUST NOT contain any characters outside the base64url alphabet,
	// and MUST NOT include base64 padding characters ("=").
	// See [RFC4086] for additional information on randomness requirements.
	// https://www.rfc-editor.org/rfc/rfc8555.html#section-8.3
	// https://www.rfc-editor.org/rfc/rfc8555.html#section-8.4
	Token string `json:"token"`

	// https://www.rfc-editor.org/rfc/rfc8555.html#section-8.1
	KeyAuthorization string `json:"keyAuthorization"`
}

func (c *Challenge) Err() error {
	if c.Error != nil {
		return c.Error
	}

	return nil
}

// Identifier the ACME identifier object.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-9.7.7
type Identifier struct {
	Type  string `json:"type"`
	Value string `json:"value"`
}

// CSRMessage Certificate Signing Request.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.4
type CSRMessage struct {
	// csr (required, string):
	// A CSR encoding the parameters for the certificate being requested [RFC2986].
	// The CSR is sent in the base64url-encoded version of the DER format.
	// (Note: Because this field uses base64url, and does not include headers, it is different from PEM.).
	Csr string `json:"csr"`
}

// RevokeCertMessage a certificate revocation message.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.6
// - https://www.rfc-editor.org/rfc/rfc5280.html#section-5.3.1
type RevokeCertMessage struct {
	// certificate (required, string):
	// The certificate to be revoked, in the base64url-encoded version of the DER format.
	// (Note: Because this field uses base64url, and does not include headers, it is different from PEM.)
	Certificate string `json:"certificate"`

	// reason (optional, int):
	// One of the revocation reasonCodes defined in Section 5.3.1 of [RFC5280] to be used when generating OCSP responses and CRLs.
	// If this field is not set the server SHOULD omit the reasonCode CRL entry extension when generating OCSP responses and CRLs.
	// The server MAY disallow a subset of reasonCodes from being used by the user.
	// If a request contains a disallowed reasonCode the server MUST reject it with the error type "urn:ietf:params:acme:error:badRevocationReason".
	// The problem document detail SHOULD indicate which reasonCodes are allowed.
	Reason *uint `json:"reason,omitempty"`
}

// RawCertificate raw data of a certificate.
type RawCertificate struct {
	Cert   []byte
	Issuer []byte
}

// Window is a window of time.
type Window struct {
	Start time.Time `json:"start"`
	End   time.Time `json:"end"`
}

// RenewalInfoResponse is the response to GET requests made the renewalInfo endpoint.
// - (4.1. Getting Renewal Information) https://www.rfc-editor.org/rfc/rfc9773.html
type RenewalInfoResponse struct {
	// SuggestedWindow contains two fields, start and end,
	// whose values are timestamps which bound the window of time in which the CA recommends renewing the certificate.
	SuggestedWindow Window `json:"suggestedWindow"`
	//	ExplanationURL is an optional URL pointing to a page which may explain why the suggested renewal window is what it is.
	//	For example, it may be a page explaining the CA's dynamic load-balancing strategy,
	//	or a page documenting which certificates are affected by a mass revocation event.
	//	Callers SHOULD provide this URL to their operator, if present.
	ExplanationURL string `json:"explanationURL"`
}

// RenewalInfoUpdateRequest is the JWS payload for POST requests made to the renewalInfo endpoint.
// - (4.2. RenewalInfo Objects) https://www.rfc-editor.org/rfc/rfc9773.html#section-4.2
type RenewalInfoUpdateRequest struct {
	// CertID is a composite string in the format: base64url(AKI) || '.' || base64url(Serial), where AKI is the
	// certificate's authority key identifier and Serial is the certificate's serial number. For details, see:
	// https://www.rfc-editor.org/rfc/rfc9773.html#section-4.1
	CertID string `json:"certID"`
	// Replaced is required and indicates whether or not the client considers the certificate to have been replaced.
	// A certificate is considered replaced when its revocation would not disrupt any ongoing services,
	// for instance because it has been renewed and the new certificate is in use, or because it is no longer in use.
	// Clients SHOULD NOT send a request where this value is false.
	Replaced bool `json:"replaced"`
}


================================================
FILE: acme/errors.go
================================================
package acme

import (
	"fmt"
	"strings"
)

// Errors types.
const (
	errNS              = "urn:ietf:params:acme:error:"
	BadNonceErr        = errNS + "badNonce"
	AlreadyReplacedErr = errNS + "alreadyReplaced"
	RateLimitedErr     = errNS + "rateLimited"
)

// ProblemDetails the problem details object.
// - https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-7.3.3
type ProblemDetails struct {
	Type        string       `json:"type,omitempty"`
	Detail      string       `json:"detail,omitempty"`
	HTTPStatus  int          `json:"status,omitempty"`
	Instance    string       `json:"instance,omitempty"`
	SubProblems []SubProblem `json:"subproblems,omitempty"`

	// additional values to have a better error message (Not defined by the RFC)
	Method string `json:"method,omitempty"`
	URL    string `json:"url,omitempty"`
}

func (p *ProblemDetails) Error() string {
	msg := new(strings.Builder)

	_, _ = fmt.Fprintf(msg, "acme: error: %d", p.HTTPStatus)

	if p.Method != "" || p.URL != "" {
		_, _ = fmt.Fprintf(msg, " :: %s :: %s", p.Method, p.URL)
	}

	_, _ = fmt.Fprintf(msg, " :: %s :: %s", p.Type, p.Detail)

	for _, sub := range p.SubProblems {
		_, _ = fmt.Fprintf(msg, ", problem: %q :: %s", sub.Type, sub.Detail)
	}

	if p.Instance != "" {
		msg.WriteString(", url: " + p.Instance)
	}

	return msg.String()
}

// SubProblem a "subproblems".
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-6.7.1
type SubProblem struct {
	Type       string     `json:"type,omitempty"`
	Detail     string     `json:"detail,omitempty"`
	Identifier Identifier `json:"identifier"`
}

// NonceError represents the error which is returned
// if the nonce sent by the client was not accepted by the server.
type NonceError struct {
	*ProblemDetails
}

func (e *NonceError) Unwrap() error {
	return e.ProblemDetails
}

// AlreadyReplacedError represents the error which is returned
// if the Server rejects the request because the identified certificate has already been marked as replaced.
// - https://www.rfc-editor.org/rfc/rfc9773.html#section-5
type AlreadyReplacedError struct {
	*ProblemDetails
}

func (e *AlreadyReplacedError) Unwrap() error {
	return e.ProblemDetails
}

// RateLimitedError represents the error which is returned
// if the server rejects the request because the client has exceeded the rate limit.
// - https://www.rfc-editor.org/rfc/rfc8555.html#section-6.6
type RateLimitedError struct {
	*ProblemDetails

	RetryAfter string
}

func (e *RateLimitedError) Unwrap() error {
	return e.ProblemDetails
}


================================================
FILE: buildx.Dockerfile
================================================
# syntax=docker/dockerfile:1.4
FROM alpine:3

ARG TARGETPLATFORM

RUN apk --no-cache --no-progress add git ca-certificates tzdata \
    && rm -rf /var/cache/apk/*

COPY $TARGETPLATFORM/lego /

ENTRYPOINT ["/lego"]
EXPOSE 80


================================================
FILE: certcrypto/crypto.go
================================================
package certcrypto

import (
	"crypto"
	"crypto/ecdsa"
	"crypto/ed25519"
	"crypto/elliptic"
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"crypto/x509/pkix"
	"encoding/asn1"
	"encoding/pem"
	"errors"
	"fmt"
	"math/big"
	"net"
	"slices"
	"strings"
	"time"

	"golang.org/x/crypto/ocsp"
)

// Constants for all key types we support.
const (
	EC256   = KeyType("P256")
	EC384   = KeyType("P384")
	RSA2048 = KeyType("2048")
	RSA3072 = KeyType("3072")
	RSA4096 = KeyType("4096")
	RSA8192 = KeyType("8192")
)

const (
	// OCSPGood means that the certificate is valid.
	OCSPGood = ocsp.Good
	// OCSPRevoked means that the certificate has been deliberately revoked.
	OCSPRevoked = ocsp.Revoked
	// OCSPUnknown means that the OCSP responder doesn't know about the certificate.
	OCSPUnknown = ocsp.Unknown
	// OCSPServerFailed means that the OCSP responder failed to process the request.
	OCSPServerFailed = ocsp.ServerFailed
)

// Constants for OCSP must staple.
var (
	tlsFeatureExtensionOID = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 1, 24}
	ocspMustStapleFeature  = []byte{0x30, 0x03, 0x02, 0x01, 0x05}
)

// KeyType represents the key algo as well as the key size or curve to use.
type KeyType string

type DERCertificateBytes []byte

// ParsePEMBundle parses a certificate bundle from top to bottom and returns
// a slice of x509 certificates. This function will error if no certificates are found.
func ParsePEMBundle(bundle []byte) ([]*x509.Certificate, error) {
	var (
		certificates []*x509.Certificate
		certDERBlock *pem.Block
	)

	for {
		certDERBlock, bundle = pem.Decode(bundle)
		if certDERBlock == nil {
			break
		}

		if certDERBlock.Type == "CERTIFICATE" {
			cert, err := x509.ParseCertificate(certDERBlock.Bytes)
			if err != nil {
				return nil, err
			}

			certificates = append(certificates, cert)
		}
	}

	if len(certificates) == 0 {
		return nil, errors.New("no certificates were found while parsing the bundle")
	}

	return certificates, nil
}

// ParsePEMPrivateKey parses a private key from key, which is a PEM block.
// Borrowed from Go standard library, to handle various private key and PEM block types.
// https://github.com/golang/go/blob/693748e9fa385f1e2c3b91ca9acbb6c0ad2d133d/src/crypto/tls/tls.go#L291-L308
// https://github.com/golang/go/blob/693748e9fa385f1e2c3b91ca9acbb6c0ad2d133d/src/crypto/tls/tls.go#L238
func ParsePEMPrivateKey(key []byte) (crypto.PrivateKey, error) {
	keyBlockDER, _ := pem.Decode(key)
	if keyBlockDER == nil {
		return nil, errors.New("invalid PEM block")
	}

	if keyBlockDER.Type != "PRIVATE KEY" && !strings.HasSuffix(keyBlockDER.Type, " PRIVATE KEY") {
		return nil, fmt.Errorf("unknown PEM header %q", keyBlockDER.Type)
	}

	if key, err := x509.ParsePKCS1PrivateKey(keyBlockDER.Bytes); err == nil {
		return key, nil
	}

	if key, err := x509.ParsePKCS8PrivateKey(keyBlockDER.Bytes); err == nil {
		switch key := key.(type) {
		case *rsa.PrivateKey, *ecdsa.PrivateKey, ed25519.PrivateKey:
			return key, nil
		default:
			return nil, fmt.Errorf("found unknown private key type in PKCS#8 wrapping: %T", key)
		}
	}

	if key, err := x509.ParseECPrivateKey(keyBlockDER.Bytes); err == nil {
		return key, nil
	}

	return nil, errors.New("failed to parse private key")
}

func GeneratePrivateKey(keyType KeyType) (crypto.PrivateKey, error) {
	switch keyType {
	case EC256:
		return ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
	case EC384:
		return ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
	case RSA2048:
		return rsa.GenerateKey(rand.Reader, 2048)
	case RSA3072:
		return rsa.GenerateKey(rand.Reader, 3072)
	case RSA4096:
		return rsa.GenerateKey(rand.Reader, 4096)
	case RSA8192:
		return rsa.GenerateKey(rand.Reader, 8192)
	}

	return nil, fmt.Errorf("invalid KeyType: %s", keyType)
}

// Deprecated: uses [CreateCSR] instead.
func GenerateCSR(privateKey crypto.PrivateKey, domain string, san []string, mustStaple bool) ([]byte, error) {
	return CreateCSR(privateKey, CSROptions{
		Domain:     domain,
		SAN:        san,
		MustStaple: mustStaple,
	})
}

type CSROptions struct {
	Domain         string
	SAN            []string
	MustStaple     bool
	EmailAddresses []string
}

func CreateCSR(privateKey crypto.PrivateKey, opts CSROptions) ([]byte, error) {
	var (
		dnsNames    []string
		ipAddresses []net.IP
	)

	for _, altname := range opts.SAN {
		if ip := net.ParseIP(altname); ip != nil {
			ipAddresses = append(ipAddresses, ip)
		} else {
			dnsNames = append(dnsNames, altname)
		}
	}

	template := x509.CertificateRequest{
		Subject:        pkix.Name{CommonName: opts.Domain},
		DNSNames:       dnsNames,
		EmailAddresses: opts.EmailAddresses,
		IPAddresses:    ipAddresses,
	}

	if opts.MustStaple {
		template.ExtraExtensions = append(template.ExtraExtensions, pkix.Extension{
			Id:    tlsFeatureExtensionOID,
			Value: ocspMustStapleFeature,
		})
	}

	return x509.CreateCertificateRequest(rand.Reader, &template, privateKey)
}

func PEMEncode(data any) []byte {
	return pem.EncodeToMemory(PEMBlock(data))
}

func PEMBlock(data any) *pem.Block {
	var pemBlock *pem.Block

	switch key := data.(type) {
	case *ecdsa.PrivateKey:
		keyBytes, _ := x509.MarshalECPrivateKey(key)
		pemBlock = &pem.Block{Type: "EC PRIVATE KEY", Bytes: keyBytes}
	case *rsa.PrivateKey:
		pemBlock = &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}
	case *x509.CertificateRequest:
		pemBlock = &pem.Block{Type: "CERTIFICATE REQUEST", Bytes: key.Raw}
	case DERCertificateBytes:
		pemBlock = &pem.Block{Type: "CERTIFICATE", Bytes: []byte(data.(DERCertificateBytes))}
	}

	return pemBlock
}

func pemDecode(data []byte) (*pem.Block, error) {
	pemBlock, _ := pem.Decode(data)
	if pemBlock == nil {
		return nil, errors.New("PEM decode did not yield a valid block. Is the certificate in the right format?")
	}

	return pemBlock, nil
}

func PemDecodeTox509CSR(data []byte) (*x509.CertificateRequest, error) {
	pemBlock, err := pemDecode(data)
	if pemBlock == nil {
		return nil, err
	}

	if pemBlock.Type != "CERTIFICATE REQUEST" && pemBlock.Type != "NEW CERTIFICATE REQUEST" {
		return nil, errors.New("PEM block is not a certificate request")
	}

	return x509.ParseCertificateRequest(pemBlock.Bytes)
}

// ParsePEMCertificate returns Certificate from a PEM encoded certificate.
// The certificate has to be PEM encoded. Any other encodings like DER will fail.
func ParsePEMCertificate(cert []byte) (*x509.Certificate, error) {
	pemBlock, err := pemDecode(cert)
	if pemBlock == nil {
		return nil, err
	}

	// from a DER encoded certificate
	return x509.ParseCertificate(pemBlock.Bytes)
}

func GetCertificateMainDomain(cert *x509.Certificate) (string, error) {
	return getMainDomain(cert.Subject, cert.DNSNames, cert.IPAddresses)
}

func GetCSRMainDomain(cert *x509.CertificateRequest) (string, error) {
	return getMainDomain(cert.Subject, cert.DNSNames, cert.IPAddresses)
}

func getMainDomain(subject pkix.Name, dnsNames []string, ips []net.IP) (string, error) {
	if subject.CommonName == "" && len(dnsNames) == 0 && len(ips) == 0 {
		return "", errors.New("missing domain")
	}

	if subject.CommonName != "" {
		return subject.CommonName, nil
	}

	if len(dnsNames) > 0 {
		return dnsNames[0], nil
	}

	return ips[0].String(), nil
}

func ExtractDomains(cert *x509.Certificate) []string {
	var domains []string
	if cert.Subject.CommonName != "" {
		domains = append(domains, cert.Subject.CommonName)
	}

	// Check for SAN certificate
	for _, sanDomain := range cert.DNSNames {
		if sanDomain == cert.Subject.CommonName {
			continue
		}

		domains = append(domains, sanDomain)
	}

	commonNameIP := net.ParseIP(cert.Subject.CommonName)
	for _, sanIP := range cert.IPAddresses {
		if !commonNameIP.Equal(sanIP) {
			domains = append(domains, sanIP.String())
		}
	}

	return domains
}

func ExtractDomainsCSR(csr *x509.CertificateRequest) []string {
	var domains []string
	if csr.Subject.CommonName != "" {
		domains = append(domains, csr.Subject.CommonName)
	}

	// loop over the SubjectAltName DNS names
	for _, sanName := range csr.DNSNames {
		if slices.Contains(domains, sanName) {
			// Duplicate; skip this name
			continue
		}

		// Name is unique
		domains = append(domains, sanName)
	}

	cnip := net.ParseIP(csr.Subject.CommonName)
	for _, sanIP := range csr.IPAddresses {
		if !cnip.Equal(sanIP) {
			domains = append(domains, sanIP.String())
		}
	}

	return domains
}

func GeneratePemCert(privateKey *rsa.PrivateKey, domain string, extensions []pkix.Extension) ([]byte, error) {
	derBytes, err := generateDerCert(privateKey, time.Time{}, domain, extensions)
	if err != nil {
		return nil, err
	}

	return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes}), nil
}

func generateDerCert(privateKey *rsa.PrivateKey, expiration time.Time, domain string, extensions []pkix.Extension) ([]byte, error) {
	serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)

	serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
	if err != nil {
		return nil, err
	}

	if expiration.IsZero() {
		expiration = time.Now().AddDate(1, 0, 0)
	}

	template := x509.Certificate{
		SerialNumber: serialNumber,
		Subject: pkix.Name{
			CommonName: "ACME Challenge TEMP",
		},
		NotBefore: time.Now(),
		NotAfter:  expiration,

		KeyUsage:              x509.KeyUsageKeyEncipherment,
		BasicConstraintsValid: true,
		ExtraExtensions:       extensions,
	}

	// handling SAN filling as type suspected
	if ip := net.ParseIP(domain); ip != nil {
		template.IPAddresses = []net.IP{ip}
	} else {
		template.DNSNames = []string{domain}
	}

	return x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey)
}


================================================
FILE: certcrypto/crypto_test.go
================================================
package certcrypto

import (
	"bytes"
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"encoding/pem"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

const (
	testDomain1 = "lego.example"
	testDomain2 = "a.lego.example"
	testDomain3 = "b.lego.example"
	testDomain4 = "c.lego.example"
)

func TestGeneratePrivateKey(t *testing.T) {
	key, err := GeneratePrivateKey(RSA2048)
	require.NoError(t, err, "Error generating private key")

	assert.NotNil(t, key)
}

func TestGenerateCSR(t *testing.T) {
	privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
	require.NoError(t, err, "Error generating private key")

	type expected struct {
		len   int
		error bool
	}

	testCases := []struct {
		desc       string
		privateKey crypto.PrivateKey
		opts       CSROptions
		expected   expected
	}{
		{
			desc:       "without SAN (nil)",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:     testDomain1,
				MustStaple: true,
			},
			expected: expected{len: 382},
		},
		{
			desc:       "without SAN (empty)",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:     testDomain1,
				SAN:        []string{},
				MustStaple: true,
			},
			expected: expected{len: 382},
		},
		{
			desc:       "with SAN",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:     testDomain1,
				SAN:        []string{testDomain2, testDomain3, testDomain4},
				MustStaple: true,
			},
			expected: expected{len: 442},
		},
		{
			desc:       "no domain",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:     "",
				MustStaple: true,
			},
			expected: expected{len: 359},
		},
		{
			desc:       "no domain with SAN",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:     "",
				SAN:        []string{testDomain2, testDomain3, testDomain4},
				MustStaple: true,
			},
			expected: expected{len: 419},
		},
		{
			desc:       "private key nil",
			privateKey: nil,
			opts: CSROptions{
				Domain:     testDomain1,
				MustStaple: true,
			},
			expected: expected{error: true},
		},
		{
			desc:       "with email addresses",
			privateKey: privateKey,
			opts: CSROptions{
				Domain:         "example.com",
				SAN:            []string{"example.org"},
				EmailAddresses: []string{"foo@example.com", "bar@example.com"},
			},
			expected: expected{len: 421},
		},
	}

	for _, test := range testCases {
		t.Run(test.desc, func(t *testing.T) {
			t.Parallel()

			csr, err := CreateCSR(test.privateKey, test.opts)

			if test.expected.error {
				require.Error(t, err)
			} else {
				require.NoError(t, err, "Error generating CSR")

				assert.NotEmpty(t, csr)
				assert.Len(t, csr, test.expected.len)
			}
		})
	}
}

func TestPEMEncode(t *testing.T) {
	key, err := rsa.GenerateKey(rand.Reader, 1024)
	require.NoError(t, err, "Error generating private key")

	data := PEMEncode(key)
	require.NotNil(t, data)

	p, rest := pem.Decode(data)

	assert.Equal(t, "RSA PRIVATE KEY", p.Type)
	assert.Empty(t, rest)
	assert.Empty(t, p.Headers)
}

func TestParsePEMCertificate(t *testing.T) {
	privateKey, err := GeneratePrivateKey(RSA2048)
	require.NoError(t, err, "Error generating private key")

	expiration := time.Now().Add(365).Round(time.Second)
	certBytes, err := 
Download .txt
gitextract_89wpnizv/

├── .dockerignore
├── .gitattributes
├── .gitcookies.enc
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── new_dns_provider.yml
│   ├── PULL_REQUEST_TEMPLATE/
│   │   └── mnp.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── documentation.yml
│       ├── go-cross.yml
│       ├── pr.yml
│       └── release.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── acme/
│   ├── api/
│   │   ├── account.go
│   │   ├── account_test.go
│   │   ├── api.go
│   │   ├── authorization.go
│   │   ├── certificate.go
│   │   ├── certificate_test.go
│   │   ├── challenge.go
│   │   ├── identifier.go
│   │   ├── identifier_test.go
│   │   ├── internal/
│   │   │   ├── nonces/
│   │   │   │   ├── nonce_manager.go
│   │   │   │   └── nonce_manager_test.go
│   │   │   ├── secure/
│   │   │   │   ├── jws.go
│   │   │   │   └── jws_test.go
│   │   │   └── sender/
│   │   │       ├── sender.go
│   │   │       ├── sender_test.go
│   │   │       └── useragent.go
│   │   ├── order.go
│   │   ├── order_test.go
│   │   ├── renewal.go
│   │   ├── service.go
│   │   └── service_test.go
│   ├── commons.go
│   └── errors.go
├── buildx.Dockerfile
├── certcrypto/
│   ├── crypto.go
│   └── crypto_test.go
├── certificate/
│   ├── authorization.go
│   ├── certificates.go
│   ├── certificates_test.go
│   ├── errors.go
│   ├── errors_test.go
│   ├── renewal.go
│   └── renewal_test.go
├── challenge/
│   ├── challenges.go
│   ├── dns01/
│   │   ├── cname.go
│   │   ├── cname_test.go
│   │   ├── dns_challenge.go
│   │   ├── dns_challenge_manual.go
│   │   ├── dns_challenge_test.go
│   │   ├── domain.go
│   │   ├── domain_test.go
│   │   ├── fixtures/
│   │   │   └── resolv.conf.1
│   │   ├── fqdn.go
│   │   ├── fqdn_test.go
│   │   ├── mock_test.go
│   │   ├── nameserver.go
│   │   ├── nameserver_test.go
│   │   ├── nameserver_unix.go
│   │   ├── nameserver_windows.go
│   │   ├── precheck.go
│   │   └── precheck_test.go
│   ├── http01/
│   │   ├── domain_matcher.go
│   │   ├── domain_matcher_test.go
│   │   ├── http_challenge.go
│   │   ├── http_challenge_server.go
│   │   └── http_challenge_test.go
│   ├── provider.go
│   ├── resolver/
│   │   ├── errors.go
│   │   ├── errors_test.go
│   │   ├── prober.go
│   │   ├── prober_mock_test.go
│   │   ├── prober_test.go
│   │   ├── solver_manager.go
│   │   └── solver_manager_test.go
│   └── tlsalpn01/
│       ├── tls_alpn_challenge.go
│       ├── tls_alpn_challenge_server.go
│       └── tls_alpn_challenge_test.go
├── cmd/
│   ├── account.go
│   ├── accounts_storage.go
│   ├── certs_storage.go
│   ├── certs_storage_test.go
│   ├── cmd.go
│   ├── cmd_before.go
│   ├── cmd_dnshelp.go
│   ├── cmd_list.go
│   ├── cmd_renew.go
│   ├── cmd_renew_test.go
│   ├── cmd_revoke.go
│   ├── cmd_run.go
│   ├── flags.go
│   ├── hook.go
│   ├── hook_test.go
│   ├── lego/
│   │   ├── main.go
│   │   └── zz_gen_version.go
│   ├── setup.go
│   ├── setup_challenges.go
│   ├── testdata/
│   │   ├── sleeping_beauty.sh
│   │   └── sleepy.sh
│   └── zz_gen_cmd_dnshelp.go
├── docs/
│   ├── .gitignore
│   ├── Makefile
│   ├── archetypes/
│   │   └── default.md
│   ├── content/
│   │   ├── _index.md
│   │   ├── dns/
│   │   │   ├── _index.md
│   │   │   ├── zz_gen_acme-dns.md
│   │   │   ├── zz_gen_active24.md
│   │   │   ├── zz_gen_alidns.md
│   │   │   ├── zz_gen_aliesa.md
│   │   │   ├── zz_gen_allinkl.md
│   │   │   ├── zz_gen_alwaysdata.md
│   │   │   ├── zz_gen_anexia.md
│   │   │   ├── zz_gen_artfiles.md
│   │   │   ├── zz_gen_arvancloud.md
│   │   │   ├── zz_gen_auroradns.md
│   │   │   ├── zz_gen_autodns.md
│   │   │   ├── zz_gen_axelname.md
│   │   │   ├── zz_gen_azion.md
│   │   │   ├── zz_gen_azure.md
│   │   │   ├── zz_gen_azuredns.md
│   │   │   ├── zz_gen_baiducloud.md
│   │   │   ├── zz_gen_beget.md
│   │   │   ├── zz_gen_binarylane.md
│   │   │   ├── zz_gen_bindman.md
│   │   │   ├── zz_gen_bluecat.md
│   │   │   ├── zz_gen_bluecatv2.md
│   │   │   ├── zz_gen_bookmyname.md
│   │   │   ├── zz_gen_brandit.md
│   │   │   ├── zz_gen_bunny.md
│   │   │   ├── zz_gen_checkdomain.md
│   │   │   ├── zz_gen_civo.md
│   │   │   ├── zz_gen_clouddns.md
│   │   │   ├── zz_gen_cloudflare.md
│   │   │   ├── zz_gen_cloudns.md
│   │   │   ├── zz_gen_cloudru.md
│   │   │   ├── zz_gen_cloudxns.md
│   │   │   ├── zz_gen_com35.md
│   │   │   ├── zz_gen_conoha.md
│   │   │   ├── zz_gen_conohav3.md
│   │   │   ├── zz_gen_constellix.md
│   │   │   ├── zz_gen_corenetworks.md
│   │   │   ├── zz_gen_cpanel.md
│   │   │   ├── zz_gen_czechia.md
│   │   │   ├── zz_gen_ddnss.md
│   │   │   ├── zz_gen_derak.md
│   │   │   ├── zz_gen_desec.md
│   │   │   ├── zz_gen_designate.md
│   │   │   ├── zz_gen_digitalocean.md
│   │   │   ├── zz_gen_directadmin.md
│   │   │   ├── zz_gen_dnsexit.md
│   │   │   ├── zz_gen_dnshomede.md
│   │   │   ├── zz_gen_dnsimple.md
│   │   │   ├── zz_gen_dnsmadeeasy.md
│   │   │   ├── zz_gen_dnspod.md
│   │   │   ├── zz_gen_dode.md
│   │   │   ├── zz_gen_domeneshop.md
│   │   │   ├── zz_gen_dreamhost.md
│   │   │   ├── zz_gen_duckdns.md
│   │   │   ├── zz_gen_dyn.md
│   │   │   ├── zz_gen_dyndnsfree.md
│   │   │   ├── zz_gen_dynu.md
│   │   │   ├── zz_gen_easydns.md
│   │   │   ├── zz_gen_edgecenter.md
│   │   │   ├── zz_gen_edgedns.md
│   │   │   ├── zz_gen_edgeone.md
│   │   │   ├── zz_gen_efficientip.md
│   │   │   ├── zz_gen_epik.md
│   │   │   ├── zz_gen_eurodns.md
│   │   │   ├── zz_gen_excedo.md
│   │   │   ├── zz_gen_exec.md
│   │   │   ├── zz_gen_exoscale.md
│   │   │   ├── zz_gen_f5xc.md
│   │   │   ├── zz_gen_freemyip.md
│   │   │   ├── zz_gen_gandi.md
│   │   │   ├── zz_gen_gandiv5.md
│   │   │   ├── zz_gen_gcloud.md
│   │   │   ├── zz_gen_gcore.md
│   │   │   ├── zz_gen_gigahostno.md
│   │   │   ├── zz_gen_glesys.md
│   │   │   ├── zz_gen_godaddy.md
│   │   │   ├── zz_gen_googledomains.md
│   │   │   ├── zz_gen_gravity.md
│   │   │   ├── zz_gen_hetzner.md
│   │   │   ├── zz_gen_hostingde.md
│   │   │   ├── zz_gen_hostinger.md
│   │   │   ├── zz_gen_hostingnl.md
│   │   │   ├── zz_gen_hosttech.md
│   │   │   ├── zz_gen_httpnet.md
│   │   │   ├── zz_gen_httpreq.md
│   │   │   ├── zz_gen_huaweicloud.md
│   │   │   ├── zz_gen_hurricane.md
│   │   │   ├── zz_gen_hyperone.md
│   │   │   ├── zz_gen_ibmcloud.md
│   │   │   ├── zz_gen_iij.md
│   │   │   ├── zz_gen_iijdpf.md
│   │   │   ├── zz_gen_infoblox.md
│   │   │   ├── zz_gen_infomaniak.md
│   │   │   ├── zz_gen_internetbs.md
│   │   │   ├── zz_gen_inwx.md
│   │   │   ├── zz_gen_ionos.md
│   │   │   ├── zz_gen_ionoscloud.md
│   │   │   ├── zz_gen_ipv64.md
│   │   │   ├── zz_gen_ispconfig.md
│   │   │   ├── zz_gen_ispconfigddns.md
│   │   │   ├── zz_gen_iwantmyname.md
│   │   │   ├── zz_gen_jdcloud.md
│   │   │   ├── zz_gen_joker.md
│   │   │   ├── zz_gen_keyhelp.md
│   │   │   ├── zz_gen_leaseweb.md
│   │   │   ├── zz_gen_liara.md
│   │   │   ├── zz_gen_lightsail.md
│   │   │   ├── zz_gen_limacity.md
│   │   │   ├── zz_gen_linode.md
│   │   │   ├── zz_gen_liquidweb.md
│   │   │   ├── zz_gen_loopia.md
│   │   │   ├── zz_gen_luadns.md
│   │   │   ├── zz_gen_mailinabox.md
│   │   │   ├── zz_gen_manageengine.md
│   │   │   ├── zz_gen_manual.md
│   │   │   ├── zz_gen_metaname.md
│   │   │   ├── zz_gen_metaregistrar.md
│   │   │   ├── zz_gen_mijnhost.md
│   │   │   ├── zz_gen_mittwald.md
│   │   │   ├── zz_gen_myaddr.md
│   │   │   ├── zz_gen_mydnsjp.md
│   │   │   ├── zz_gen_mythicbeasts.md
│   │   │   ├── zz_gen_namecheap.md
│   │   │   ├── zz_gen_namedotcom.md
│   │   │   ├── zz_gen_namesilo.md
│   │   │   ├── zz_gen_namesurfer.md
│   │   │   ├── zz_gen_nearlyfreespeech.md
│   │   │   ├── zz_gen_neodigit.md
│   │   │   ├── zz_gen_netcup.md
│   │   │   ├── zz_gen_netlify.md
│   │   │   ├── zz_gen_nicmanager.md
│   │   │   ├── zz_gen_nicru.md
│   │   │   ├── zz_gen_nifcloud.md
│   │   │   ├── zz_gen_njalla.md
│   │   │   ├── zz_gen_nodion.md
│   │   │   ├── zz_gen_ns1.md
│   │   │   ├── zz_gen_octenium.md
│   │   │   ├── zz_gen_oraclecloud.md
│   │   │   ├── zz_gen_otc.md
│   │   │   ├── zz_gen_ovh.md
│   │   │   ├── zz_gen_pdns.md
│   │   │   ├── zz_gen_plesk.md
│   │   │   ├── zz_gen_porkbun.md
│   │   │   ├── zz_gen_rackspace.md
│   │   │   ├── zz_gen_rainyun.md
│   │   │   ├── zz_gen_rcodezero.md
│   │   │   ├── zz_gen_regfish.md
│   │   │   ├── zz_gen_regru.md
│   │   │   ├── zz_gen_rfc2136.md
│   │   │   ├── zz_gen_rimuhosting.md
│   │   │   ├── zz_gen_route53.md
│   │   │   ├── zz_gen_safedns.md
│   │   │   ├── zz_gen_sakuracloud.md
│   │   │   ├── zz_gen_scaleway.md
│   │   │   ├── zz_gen_selectel.md
│   │   │   ├── zz_gen_selectelv2.md
│   │   │   ├── zz_gen_selfhostde.md
│   │   │   ├── zz_gen_servercow.md
│   │   │   ├── zz_gen_shellrent.md
│   │   │   ├── zz_gen_simply.md
│   │   │   ├── zz_gen_sonic.md
│   │   │   ├── zz_gen_spaceship.md
│   │   │   ├── zz_gen_stackpath.md
│   │   │   ├── zz_gen_syse.md
│   │   │   ├── zz_gen_technitium.md
│   │   │   ├── zz_gen_tencentcloud.md
│   │   │   ├── zz_gen_timewebcloud.md
│   │   │   ├── zz_gen_todaynic.md
│   │   │   ├── zz_gen_transip.md
│   │   │   ├── zz_gen_ultradns.md
│   │   │   ├── zz_gen_uniteddomains.md
│   │   │   ├── zz_gen_variomedia.md
│   │   │   ├── zz_gen_vegadns.md
│   │   │   ├── zz_gen_vercel.md
│   │   │   ├── zz_gen_versio.md
│   │   │   ├── zz_gen_vinyldns.md
│   │   │   ├── zz_gen_virtualname.md
│   │   │   ├── zz_gen_vkcloud.md
│   │   │   ├── zz_gen_volcengine.md
│   │   │   ├── zz_gen_vscale.md
│   │   │   ├── zz_gen_vultr.md
│   │   │   ├── zz_gen_webnames.md
│   │   │   ├── zz_gen_webnamesca.md
│   │   │   ├── zz_gen_websupport.md
│   │   │   ├── zz_gen_wedos.md
│   │   │   ├── zz_gen_westcn.md
│   │   │   ├── zz_gen_yandex.md
│   │   │   ├── zz_gen_yandex360.md
│   │   │   ├── zz_gen_yandexcloud.md
│   │   │   ├── zz_gen_zoneedit.md
│   │   │   ├── zz_gen_zoneee.md
│   │   │   └── zz_gen_zonomi.md
│   │   ├── installation/
│   │   │   └── _index.md
│   │   └── usage/
│   │       ├── _index.md
│   │       ├── cli/
│   │       │   ├── General-Instructions.md
│   │       │   ├── Obtain-a-Certificate.md
│   │       │   ├── Options.md
│   │       │   ├── Renew-a-Certificate.md
│   │       │   ├── _index.md
│   │       │   └── examples.md
│   │       └── library/
│   │           ├── Writing-a-Challenge-Solver.md
│   │           └── _index.md
│   ├── data/
│   │   └── zz_cli_help.toml
│   ├── go.mod
│   ├── go.sum
│   ├── hugo.toml
│   ├── layouts/
│   │   ├── partials/
│   │   │   └── logo.html
│   │   └── shortcodes/
│   │       ├── clihelp.html
│   │       └── tableofdnsproviders.html
│   └── static/
│       ├── .nojekyll
│       └── css/
│           └── theme-custom.css
├── e2e/
│   ├── challenges_test.go
│   ├── dnschallenge/
│   │   └── dns_challenges_test.go
│   ├── fixtures/
│   │   ├── certs/
│   │   │   ├── README.md
│   │   │   ├── localhost/
│   │   │   │   ├── README.md
│   │   │   │   ├── cert.pem
│   │   │   │   └── key.pem
│   │   │   ├── pebble.minica.key.pem
│   │   │   └── pebble.minica.pem
│   │   ├── pebble-config-dns.json
│   │   ├── pebble-config.json
│   │   └── update-dns.sh
│   ├── loader/
│   │   └── loader.go
│   └── readme.md
├── go.mod
├── go.sum
├── internal/
│   ├── clihelp/
│   │   └── generator.go
│   ├── dns/
│   │   ├── descriptors/
│   │   │   └── descriptors.go
│   │   ├── docs/
│   │   │   ├── generator.go
│   │   │   └── templates/
│   │   │       ├── dns.go.tmpl
│   │   │       ├── dns.md.tmpl
│   │   │       └── readme.md.tmpl
│   │   └── providers/
│   │       ├── dns_providers.go.tmpl
│   │       └── generator.go
│   └── releaser/
│       ├── generator.go
│       ├── releaser.go
│       └── templates/
│           ├── dns.go.tmpl
│           ├── sender.go.tmpl
│           └── version.go.tmpl
├── lego/
│   ├── client.go
│   ├── client_config.go
│   └── client_test.go
├── log/
│   └── logger.go
├── platform/
│   ├── config/
│   │   └── env/
│   │       ├── env.go
│   │       └── env_test.go
│   ├── tester/
│   │   ├── api.go
│   │   ├── dnsmock/
│   │   │   ├── dnsmock.go
│   │   │   ├── dnsmock_test.go
│   │   │   ├── handlers.go
│   │   │   └── handlers_test.go
│   │   ├── env.go
│   │   ├── env_test.go
│   │   └── servermock/
│   │       ├── builder.go
│   │       ├── handler_dump.go
│   │       ├── handler_file.go
│   │       ├── handler_json.go
│   │       ├── handler_noop.go
│   │       ├── handler_raw.go
│   │       ├── link_form.go
│   │       ├── link_headers.go
│   │       ├── link_query.go
│   │       ├── link_request_body.go
│   │       └── link_request_body_json.go
│   └── wait/
│       ├── wait.go
│       └── wait_test.go
├── providers/
│   ├── dns/
│   │   ├── acmedns/
│   │   │   ├── acmedns.go
│   │   │   ├── acmedns.toml
│   │   │   ├── acmedns_test.go
│   │   │   ├── internal/
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── fetch-request.json
│   │   │   │   │   ├── fetch.json
│   │   │   │   │   └── fetch_all.json
│   │   │   │   ├── http_storage.go
│   │   │   │   ├── http_storage_test.go
│   │   │   │   └── readme.md
│   │   │   └── mock_test.go
│   │   ├── active24/
│   │   │   ├── active24.go
│   │   │   ├── active24.toml
│   │   │   └── active24_test.go
│   │   ├── alidns/
│   │   │   ├── alidns.go
│   │   │   ├── alidns.toml
│   │   │   └── alidns_test.go
│   │   ├── aliesa/
│   │   │   ├── aliesa.go
│   │   │   ├── aliesa.toml
│   │   │   └── aliesa_test.go
│   │   ├── allinkl/
│   │   │   ├── allinkl.go
│   │   │   ├── allinkl.toml
│   │   │   ├── allinkl_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_dns_settings-request.xml
│   │   │       │   ├── add_dns_settings.json
│   │   │       │   ├── add_dns_settings.xml
│   │   │       │   ├── auth-request.xml
│   │   │       │   ├── auth.xml
│   │   │       │   ├── auth_fault.xml
│   │   │       │   ├── delete_dns_settings-request.xml
│   │   │       │   ├── delete_dns_settings.json
│   │   │       │   ├── delete_dns_settings.xml
│   │   │       │   ├── flood_protection.xml
│   │   │       │   ├── get_dns_settings-request.xml
│   │   │       │   ├── get_dns_settings-zone_not_found.xml
│   │   │       │   ├── get_dns_settings-zone_syntax_incorrect.xml
│   │   │       │   ├── get_dns_settings.json
│   │   │       │   └── get_dns_settings.xml
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       ├── types.go
│   │   │       ├── types_api.go
│   │   │       └── types_auth.go
│   │   ├── alwaysdata/
│   │   │   ├── alwaysdata.go
│   │   │   ├── alwaysdata.toml
│   │   │   ├── alwaysdata_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains.json
│   │   │       │   ├── record_add-request.json
│   │   │       │   └── records.json
│   │   │       └── types.go
│   │   ├── anexia/
│   │   │   ├── anexia.go
│   │   │   ├── anexia.toml
│   │   │   ├── anexia_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── create_record_incomplete.json
│   │   │       │   ├── error.json
│   │   │       │   └── get_zone.json
│   │   │       └── types.go
│   │   ├── artfiles/
│   │   │   ├── artfiles.go
│   │   │   ├── artfiles.toml
│   │   │   ├── artfiles_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains.txt
│   │   │       │   ├── get_dns.json
│   │   │       │   ├── set_dns.json
│   │   │       │   ├── txt_record-multiple.txt
│   │   │       │   └── txt_record.txt
│   │   │       ├── types.go
│   │   │       └── types_test.go
│   │   ├── arvancloud/
│   │   │   ├── arvancloud.go
│   │   │   ├── arvancloud.toml
│   │   │   ├── arvancloud_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_txt_record.json
│   │   │       │   └── get_txt_record.json
│   │   │       └── types.go
│   │   ├── auroradns/
│   │   │   ├── auroradns.go
│   │   │   ├── auroradns.toml
│   │   │   └── auroradns_test.go
│   │   ├── autodns/
│   │   │   ├── autodns.go
│   │   │   ├── autodns.toml
│   │   │   ├── autodns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── add_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── remove_record-request.json
│   │   │       │   └── remove_record.json
│   │   │       └── types.go
│   │   ├── axelname/
│   │   │   ├── axelname.go
│   │   │   ├── axelname.toml
│   │   │   ├── axelname_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── dns_add.json
│   │   │       │   ├── dns_add_error.json
│   │   │       │   ├── dns_delete.json
│   │   │       │   ├── dns_delete_error.json
│   │   │       │   ├── dns_list.json
│   │   │       │   └── dns_list_error.json
│   │   │       └── types.go
│   │   ├── azion/
│   │   │   ├── azion.go
│   │   │   ├── azion.toml
│   │   │   ├── azion_test.go
│   │   │   └── fixtures/
│   │   │       ├── zones.json
│   │   │       └── zones_empty.json
│   │   ├── azure/
│   │   │   ├── azure.go
│   │   │   ├── azure.toml
│   │   │   ├── azure_test.go
│   │   │   ├── private.go
│   │   │   └── public.go
│   │   ├── azuredns/
│   │   │   ├── azuredns.go
│   │   │   ├── azuredns.toml
│   │   │   ├── azuredns_test.go
│   │   │   ├── credentials.go
│   │   │   ├── oidc.go
│   │   │   ├── private.go
│   │   │   ├── public.go
│   │   │   ├── servicediscovery.go
│   │   │   └── servicediscovery_test.go
│   │   ├── baiducloud/
│   │   │   ├── baiducloud.go
│   │   │   ├── baiducloud.toml
│   │   │   └── baiducloud_test.go
│   │   ├── beget/
│   │   │   ├── beget.go
│   │   │   ├── beget.toml
│   │   │   ├── beget_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── answer_error.json
│   │   │       │   ├── changeRecords-doc.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getData-doc.json
│   │   │       │   ├── getData-real.json
│   │   │       │   ├── getData.json
│   │   │       │   └── getData_empty.json
│   │   │       └── types.go
│   │   ├── binarylane/
│   │   │   ├── binarylane.go
│   │   │   ├── binarylane.toml
│   │   │   ├── binarylane_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   └── error.json
│   │   │       └── types.go
│   │   ├── bindman/
│   │   │   ├── bindman.go
│   │   │   ├── bindman.toml
│   │   │   ├── bindman_test.go
│   │   │   └── fixtures/
│   │   │       ├── add_record-request.json
│   │   │       └── error.json
│   │   ├── bluecat/
│   │   │   ├── bluecat.go
│   │   │   ├── bluecat.toml
│   │   │   ├── bluecat_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── bluecatv2/
│   │   │   ├── bluecatv2.go
│   │   │   ├── bluecatv2.toml
│   │   │   ├── bluecatv2_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── deleteResourceRecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getZoneDeployments.json
│   │   │       │   ├── postSession-request.json
│   │   │       │   ├── postSession.json
│   │   │       │   ├── postZoneDeployment-request.json
│   │   │       │   ├── postZoneDeployment.json
│   │   │       │   ├── postZoneResourceRecord-request.json
│   │   │       │   ├── postZoneResourceRecord.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       ├── predicates.go
│   │   │       ├── predicates_test.go
│   │   │       └── types.go
│   │   ├── bookmyname/
│   │   │   ├── bookmyname.go
│   │   │   ├── bookmyname.toml
│   │   │   ├── bookmyname_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_success.txt
│   │   │       │   ├── error.txt
│   │   │       │   └── remove_success.txt
│   │   │       └── types.go
│   │   ├── brandit/
│   │   │   ├── brandit.go
│   │   │   ├── brandit.toml
│   │   │   ├── brandit_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   ├── delete-record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── list-records.json
│   │   │       │   └── status-domain.json
│   │   │       └── types.go
│   │   ├── bunny/
│   │   │   ├── bunny.go
│   │   │   ├── bunny.toml
│   │   │   └── bunny_test.go
│   │   ├── checkdomain/
│   │   │   ├── checkdomain.go
│   │   │   ├── checkdomain.toml
│   │   │   ├── checkdomain_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   └── delete_txt_record-request.json
│   │   │       └── types.go
│   │   ├── civo/
│   │   │   ├── civo.go
│   │   │   ├── civo.toml
│   │   │   ├── civo_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_dns_record-request.json
│   │   │       │   ├── create_dns_record.json
│   │   │       │   ├── delete_dns_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── list_dns_records.json
│   │   │       │   └── list_domain_names.json
│   │   │       └── types.go
│   │   ├── clouddns/
│   │   │   ├── clouddns.go
│   │   │   ├── clouddns.toml
│   │   │   ├── clouddns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domain-request.json
│   │   │       │   ├── domain_search-request.json
│   │   │       │   ├── domain_search.json
│   │   │       │   ├── login-request.json
│   │   │       │   ├── login.json
│   │   │       │   ├── publish-request.json
│   │   │       │   └── record_txt-request.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cloudflare/
│   │   │   ├── cloudflare.go
│   │   │   ├── cloudflare.toml
│   │   │   ├── cloudflare_test.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── delete_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zones.json
│   │   │   │   ├── options.go
│   │   │   │   └── types.go
│   │   │   └── wrapper.go
│   │   ├── cloudns/
│   │   │   ├── cloudns.go
│   │   │   ├── cloudns.toml
│   │   │   ├── cloudns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── cloudru/
│   │   │   ├── cloudru.go
│   │   │   ├── cloudru.toml
│   │   │   ├── cloudru_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── auth-error.json
│   │   │       │   ├── auth.json
│   │   │       │   ├── record.json
│   │   │       │   ├── records.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cloudxns/
│   │   │   ├── cloudxns.go
│   │   │   └── cloudxns.toml
│   │   ├── com35/
│   │   │   ├── com35.go
│   │   │   ├── com35.toml
│   │   │   └── com35_test.go
│   │   ├── conoha/
│   │   │   ├── conoha.go
│   │   │   ├── conoha.toml
│   │   │   ├── conoha_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-records_GET.json
│   │   │       │   ├── domains-records_POST.json
│   │   │       │   ├── domains_GET.json
│   │   │       │   ├── empty.json
│   │   │       │   └── tokens_POST.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── conohav3/
│   │   │   ├── conohav3.go
│   │   │   ├── conohav3.toml
│   │   │   ├── conohav3_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-records_GET.json
│   │   │       │   ├── domains-records_POST.json
│   │   │       │   ├── domains_GET.json
│   │   │       │   └── empty.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── constellix/
│   │   │   ├── constellix.go
│   │   │   ├── constellix.toml
│   │   │   ├── constellix_test.go
│   │   │   └── internal/
│   │   │       ├── auth.go
│   │   │       ├── auth_test.go
│   │   │       ├── client.go
│   │   │       ├── domains.go
│   │   │       ├── domains_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── domains-GetAll.json
│   │   │       │   ├── domains-Search.json
│   │   │       │   ├── records-Create.json
│   │   │       │   ├── records-Get.json
│   │   │       │   ├── records-GetAll.json
│   │   │       │   └── records-Search.json
│   │   │       ├── txtrecords.go
│   │   │       ├── txtrecords_test.go
│   │   │       └── types.go
│   │   ├── corenetworks/
│   │   │   ├── corenetworks.go
│   │   │   ├── corenetworks.toml
│   │   │   ├── corenetworks_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── GetZoneDetails.json
│   │   │       │   ├── ListRecords.json
│   │   │       │   ├── ListZone.json
│   │   │       │   └── auth.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── cpanel/
│   │   │   ├── cpanel.go
│   │   │   ├── cpanel.toml
│   │   │   ├── cpanel_test.go
│   │   │   └── internal/
│   │   │       ├── cpanel/
│   │   │       │   ├── client.go
│   │   │       │   ├── client_test.go
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── update-zone.json
│   │   │       │   │   ├── update-zone_error.json
│   │   │       │   │   ├── zone-info.json
│   │   │       │   │   └── zone-info_error.json
│   │   │       │   └── types.go
│   │   │       ├── shared/
│   │   │       │   └── types.go
│   │   │       └── whm/
│   │   │           ├── client.go
│   │   │           ├── client_test.go
│   │   │           ├── fixtures/
│   │   │           │   ├── update-zone.json
│   │   │           │   ├── update-zone_error.json
│   │   │           │   ├── zone-info.json
│   │   │           │   └── zone-info_error.json
│   │   │           └── types.go
│   │   ├── czechia/
│   │   │   ├── czechia.go
│   │   │   ├── czechia.toml
│   │   │   ├── czechia_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record-request.json
│   │   │       │   └── delete_txt_record-request.json
│   │   │       └── types.go
│   │   ├── ddnss/
│   │   │   ├── ddnss.go
│   │   │   ├── ddnss.toml
│   │   │   ├── ddnss_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.html
│   │   │       │   └── success.html
│   │   │       └── types.go
│   │   ├── derak/
│   │   │   ├── derak.go
│   │   │   ├── derak.toml
│   │   │   ├── derak_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.json
│   │   │       │   ├── record-DELETE.json
│   │   │       │   ├── record-GET.json
│   │   │       │   ├── record-PATCH.json
│   │   │       │   ├── record-PUT.json
│   │   │       │   ├── records-GET.json
│   │   │       │   └── service-cdn-zones.json
│   │   │       ├── readme.md
│   │   │       └── types.go
│   │   ├── desec/
│   │   │   ├── desec.go
│   │   │   ├── desec.toml
│   │   │   └── desec_test.go
│   │   ├── designate/
│   │   │   ├── designate.go
│   │   │   ├── designate.toml
│   │   │   └── designate_test.go
│   │   ├── digitalocean/
│   │   │   ├── digitalocean.go
│   │   │   ├── digitalocean.toml
│   │   │   ├── digitalocean_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   └── domains-records_POST.json
│   │   │       └── types.go
│   │   ├── directadmin/
│   │   │   ├── directadmin.go
│   │   │   ├── directadmin.toml
│   │   │   ├── directadmin_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── dns_providers_test.go
│   │   ├── dnsexit/
│   │   │   ├── dnsexit.go
│   │   │   ├── dnsexit.toml
│   │   │   ├── dnsexit_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── delete_record-request.json
│   │   │       │   ├── error.json
│   │   │       │   └── success.json
│   │   │       └── types.go
│   │   ├── dnshomede/
│   │   │   ├── dnshomede.go
│   │   │   ├── dnshomede.toml
│   │   │   ├── dnshomede_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── readme.md
│   │   ├── dnsimple/
│   │   │   ├── dnsimple.go
│   │   │   ├── dnsimple.toml
│   │   │   └── dnsimple_test.go
│   │   ├── dnsmadeeasy/
│   │   │   ├── dnsmadeeasy.go
│   │   │   ├── dnsmadeeasy.toml
│   │   │   ├── dnsmadeeasy_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   └── get_records.json
│   │   │       └── types.go
│   │   ├── dnspod/
│   │   │   ├── dnspod.go
│   │   │   ├── dnspod.toml
│   │   │   └── dnspod_test.go
│   │   ├── dode/
│   │   │   ├── dode.go
│   │   │   ├── dode.toml
│   │   │   ├── dode_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   └── success.json
│   │   │       └── types.go
│   │   ├── domeneshop/
│   │   │   ├── domeneshop.go
│   │   │   ├── domeneshop.toml
│   │   │   ├── domeneshop_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── getDnsRecords.json
│   │   │       │   └── getDomains.json
│   │   │       └── types.go
│   │   ├── dreamhost/
│   │   │   ├── dreamhost.go
│   │   │   ├── dreamhost.toml
│   │   │   ├── dreamhost_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       └── types.go
│   │   ├── duckdns/
│   │   │   ├── duckdns.go
│   │   │   ├── duckdns.toml
│   │   │   ├── duckdns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── dyn/
│   │   │   ├── dyn.go
│   │   │   ├── dyn.toml
│   │   │   ├── dyn_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create-txt-record.json
│   │   │       │   ├── login.json
│   │   │       │   └── publish.json
│   │   │       ├── session.go
│   │   │       ├── session_test.go
│   │   │       └── types.go
│   │   ├── dyndnsfree/
│   │   │   ├── dyndnsfree.go
│   │   │   ├── dyndnsfree.toml
│   │   │   ├── dyndnsfree_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── dynu/
│   │   │   ├── dynu.go
│   │   │   ├── dynu.toml
│   │   │   ├── dynu_test.go
│   │   │   └── internal/
│   │   │       ├── auth.go
│   │   │       ├── auth_test.go
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_new_record-request.json
│   │   │       │   ├── add_new_record.json
│   │   │       │   ├── add_new_record_invalid.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── delete_record_invalid.json
│   │   │       │   ├── get_records.json
│   │   │       │   ├── get_records_empty.json
│   │   │       │   ├── get_records_invalid.json
│   │   │       │   ├── get_root_domain.json
│   │   │       │   └── get_root_domain_invalid.json
│   │   │       └── types.go
│   │   ├── easydns/
│   │   │   ├── easydns.go
│   │   │   ├── easydns.toml
│   │   │   ├── easydns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── error1.json
│   │   │       │   └── list-zone.json
│   │   │       ├── readme.md
│   │   │       └── types.go
│   │   ├── edgecenter/
│   │   │   ├── edgecenter.go
│   │   │   ├── edgecenter.toml
│   │   │   └── edgecenter_test.go
│   │   ├── edgedns/
│   │   │   ├── edgedns.go
│   │   │   ├── edgedns.toml
│   │   │   ├── edgedns_integration_test.go
│   │   │   └── edgedns_test.go
│   │   ├── edgeone/
│   │   │   ├── edgeone.go
│   │   │   ├── edgeone.toml
│   │   │   ├── edgeone_test.go
│   │   │   └── wrapper.go
│   │   ├── efficientip/
│   │   │   ├── efficientip.go
│   │   │   ├── efficientip.toml
│   │   │   ├── efficientip_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── dns_rr_add.json
│   │   │       │   ├── dns_rr_delete-error.json
│   │   │       │   ├── dns_rr_delete.json
│   │   │       │   ├── dns_rr_info.json
│   │   │       │   └── dns_rr_list.json
│   │   │       └── types.go
│   │   ├── epik/
│   │   │   ├── epik.go
│   │   │   ├── epik.toml
│   │   │   ├── epik_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── createHostRecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getDnsRecord.json
│   │   │       │   └── removeHostRecord.json
│   │   │       └── types.go
│   │   ├── eurodns/
│   │   │   ├── eurodns.go
│   │   │   ├── eurodns.toml
│   │   │   ├── eurodns_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error.json
│   │   │       │   ├── zone_add.json
│   │   │       │   ├── zone_add_empty_forwards.json
│   │   │       │   ├── zone_add_validate_ko.json
│   │   │       │   ├── zone_add_validate_ok.json
│   │   │       │   ├── zone_get.json
│   │   │       │   └── zone_remove.json
│   │   │       └── types.go
│   │   ├── excedo/
│   │   │   ├── excedo.go
│   │   │   ├── excedo.toml
│   │   │   ├── excedo_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── addrecord.json
│   │   │       │   ├── deleterecord.json
│   │   │       │   ├── error.json
│   │   │       │   ├── getrecords.json
│   │   │       │   └── login.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── exec/
│   │   │   ├── exec.go
│   │   │   ├── exec.toml
│   │   │   ├── exec_test.go
│   │   │   └── log_mock_test.go
│   │   ├── exoscale/
│   │   │   ├── exoscale.go
│   │   │   ├── exoscale.toml
│   │   │   └── exoscale_test.go
│   │   ├── f5xc/
│   │   │   ├── f5xc.go
│   │   │   ├── f5xc.toml
│   │   │   ├── f5xc_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create.json
│   │   │       │   ├── delete.json
│   │   │       │   ├── error_404.json
│   │   │       │   ├── error_503.json
│   │   │       │   ├── get.json
│   │   │       │   └── replace.json
│   │   │       └── types.go
│   │   ├── freemyip/
│   │   │   ├── freemyip.go
│   │   │   ├── freemyip.toml
│   │   │   └── freemyip_test.go
│   │   ├── gandi/
│   │   │   ├── gandi.go
│   │   │   ├── gandi.toml
│   │   │   ├── gandi_mock_test.go
│   │   │   ├── gandi_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record-request.xml
│   │   │       │   ├── clone_zone-request.xml
│   │   │       │   ├── clone_zone.xml
│   │   │       │   ├── delete_zone-request.xml
│   │   │       │   ├── delete_zone.xml
│   │   │       │   ├── empty.xml
│   │   │       │   ├── get_zone_id-request.xml
│   │   │       │   ├── get_zone_id.xml
│   │   │       │   ├── new_zone_version-request.xml
│   │   │       │   ├── new_zone_version.xml
│   │   │       │   ├── set_zone-request.xml
│   │   │       │   ├── set_zone.xml
│   │   │       │   ├── set_zone_version-request.xml
│   │   │       │   └── set_zone_version.xml
│   │   │       └── types.go
│   │   ├── gandiv5/
│   │   │   ├── gandiv5.go
│   │   │   ├── gandiv5.toml
│   │   │   ├── gandiv5_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_txt_record_get.json
│   │   │       │   └── api_response.json
│   │   │       └── types.go
│   │   ├── gcloud/
│   │   │   ├── fixtures/
│   │   │   │   └── gce_account_service_file.json
│   │   │   ├── gcloud.toml
│   │   │   ├── googlecloud.go
│   │   │   └── googlecloud_test.go
│   │   ├── gcore/
│   │   │   ├── gcore.go
│   │   │   ├── gcore.toml
│   │   │   └── gcore_test.go
│   │   ├── gigahostno/
│   │   │   ├── gigahostno.go
│   │   │   ├── gigahostno.toml
│   │   │   ├── gigahostno_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── authenticate-request.json
│   │   │       │   ├── authenticate.json
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── create_record.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── error.json
│   │   │       │   ├── zone_records.json
│   │   │       │   └── zones.json
│   │   │       ├── identity.go
│   │   │       ├── identity_test.go
│   │   │       └── types.go
│   │   ├── glesys/
│   │   │   ├── glesys.go
│   │   │   ├── glesys.toml
│   │   │   ├── glesys_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add-record.json
│   │   │       │   └── delete-record.json
│   │   │       └── types.go
│   │   ├── godaddy/
│   │   │   ├── godaddy.go
│   │   │   ├── godaddy.toml
│   │   │   ├── godaddy_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error-extended.json
│   │   │       │   ├── errors.json
│   │   │       │   ├── getrecords.json
│   │   │       │   └── update_records-request.json
│   │   │       └── types.go
│   │   ├── googledomains/
│   │   │   ├── googledomains.go
│   │   │   └── googledomains.toml
│   │   ├── gravity/
│   │   │   ├── gravity.go
│   │   │   ├── gravity.toml
│   │   │   ├── gravity_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_record-request.json
│   │   │       │   ├── error.json
│   │   │       │   ├── login-request.json
│   │   │       │   ├── login.json
│   │   │       │   ├── me.json
│   │   │       │   ├── me_unauthenticated.json
│   │   │       │   ├── zones.json
│   │   │       │   └── zones_empty.json
│   │   │       └── types.go
│   │   ├── hetzner/
│   │   │   ├── hetzner.go
│   │   │   ├── hetzner.toml
│   │   │   ├── hetzner_test.go
│   │   │   └── internal/
│   │   │       ├── hetznerv1/
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── add_rrset_records-request.json
│   │   │       │   │   ├── add_rrset_records.json
│   │   │       │   │   ├── get_action_error.json
│   │   │       │   │   ├── get_action_running.json
│   │   │       │   │   ├── get_action_success.json
│   │   │       │   │   ├── remove_rrset_records-request.json
│   │   │       │   │   └── remove_rrset_records.json
│   │   │       │   ├── hetznerv1.go
│   │   │       │   ├── hetznerv1_test.go
│   │   │       │   └── internal/
│   │   │       │       ├── client.go
│   │   │       │       ├── client_test.go
│   │   │       │       ├── fixtures/
│   │   │       │       │   ├── add_rrset_records-request.json
│   │   │       │       │   ├── add_rrset_records.json
│   │   │       │       │   ├── error-deprecated_api_endpoint.json
│   │   │       │       │   ├── error-invalid_input.json
│   │   │       │       │   ├── error-resource_limit_exceeded.json
│   │   │       │       │   ├── get_action.json
│   │   │       │       │   ├── remove_rrset_records-request.json
│   │   │       │       │   └── remove_rrset_records.json
│   │   │       │       └── types.go
│   │   │       └── legacy/
│   │   │           ├── hetzner.go
│   │   │           ├── hetzner_test.go
│   │   │           └── internal/
│   │   │               ├── client.go
│   │   │               ├── client_test.go
│   │   │               ├── fixtures/
│   │   │               │   ├── create_txt_record-request.json
│   │   │               │   ├── create_txt_record.json
│   │   │               │   ├── get_txt_record.json
│   │   │               │   └── get_zone_id.json
│   │   │               └── types.go
│   │   ├── hostingde/
│   │   │   ├── hostingde.go
│   │   │   ├── hostingde.toml
│   │   │   └── hostingde_test.go
│   │   ├── hostinger/
│   │   │   ├── hostinger.go
│   │   │   ├── hostinger.toml
│   │   │   ├── hostinger_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── delete_dns_records.json
│   │   │       │   ├── error_401.json
│   │   │       │   ├── error_422.json
│   │   │       │   ├── get_dns_records.json
│   │   │       │   ├── get_dns_records_acme.json
│   │   │       │   ├── get_dns_records_empty.json
│   │   │       │   ├── update_dns_records-request.json
│   │   │       │   ├── update_dns_records.json
│   │   │       │   └── update_dns_records_base-request.json
│   │   │       └── types.go
│   │   ├── hostingnl/
│   │   │   ├── hostingnl.go
│   │   │   ├── hostingnl.toml
│   │   │   ├── hostingnl_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── add_record-request.json
│   │   │       │   ├── add_record.json
│   │   │       │   ├── delete_record-request.json
│   │   │       │   ├── delete_record.json
│   │   │       │   ├── error.json
│   │   │       │   └── error_other.json
│   │   │       └── types.go
│   │   ├── hosttech/
│   │   │   ├── hosttech.go
│   │   │   ├── hosttech.toml
│   │   │   ├── hosttech_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── error-details.json
│   │   │       │   ├── error.json
│   │   │       │   ├── record.json
│   │   │       │   ├── records.json
│   │   │       │   ├── zone.json
│   │   │       │   └── zones.json
│   │   │       └── types.go
│   │   ├── httpnet/
│   │   │   ├── httpnet.go
│   │   │   ├── httpnet.toml
│   │   │   └── httpnet_test.go
│   │   ├── httpreq/
│   │   │   ├── httpreq.go
│   │   │   ├── httpreq.toml
│   │   │   └── httpreq_test.go
│   │   ├── huaweicloud/
│   │   │   ├── huaweicloud.go
│   │   │   ├── huaweicloud.toml
│   │   │   ├── huaweicloud_test.go
│   │   │   └── internal/
│   │   │       └── client.go
│   │   ├── hurricane/
│   │   │   ├── hurricane.go
│   │   │   ├── hurricane.toml
│   │   │   ├── hurricane_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       └── client_test.go
│   │   ├── hyperone/
│   │   │   ├── hyperone.go
│   │   │   ├── hyperone.toml
│   │   │   ├── hyperone_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── createRecord.json
│   │   │       │   ├── createRecordset.json
│   │   │       │   ├── invalidPassport.json
│   │   │       │   ├── record.json
│   │   │       │   ├── recordset.json
│   │   │       │   ├── validPassport.json
│   │   │       │   └── zones.json
│   │   │       ├── passport.go
│   │   │       ├── passport_test.go
│   │   │       ├── token.go
│   │   │       ├── token_test.go
│   │   │       └── types.go
│   │   ├── ibmcloud/
│   │   │   ├── ibmcloud.go
│   │   │   ├── ibmcloud.toml
│   │   │   ├── ibmcloud_test.go
│   │   │   └── internal/
│   │   │       └── wrapper.go
│   │   ├── iij/
│   │   │   ├── iij.go
│   │   │   ├── iij.toml
│   │   │   └── iij_test.go
│   │   ├── iijdpf/
│   │   │   ├── iijdpf.go
│   │   │   ├── iijdpf.toml
│   │   │   ├── iijdpf_test.go
│   │   │   └── wrapper.go
│   │   ├── infoblox/
│   │   │   ├── infoblox.go
│   │   │   ├── infoblox.toml
│   │   │   └── infoblox_test.go
│   │   ├── infomaniak/
│   │   │   ├── infomaniak.go
│   │   │   ├── infomaniak.toml
│   │   │   ├── infomaniak_test.go
│   │   │   └── internal/
│   │   │       ├── client.go
│   │   │       ├── client_test.go
│   │   │       ├── fixtures/
│   │   │       │   ├── create_dns_record-request.json
│   │   │       │   └── get_domain_name.json
│   │   │       └── types.go
│   │   ├── internal/
│   │   │   ├── active24/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── error_403.json
│   │   │   │   │   │   ├── error_422.json
│   │   │   │   │   │   ├── error_v1.json
│   │   │   │   │   │   ├── records.json
│   │   │   │   │   │   └── services.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── clientdebug/
│   │   │   │   ├── .gitattributes
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── testdata/
│   │   │   │       ├── env_vars.txt
│   │   │   │       ├── headers.txt
│   │   │   │       └── values.txt
│   │   │   ├── errutils/
│   │   │   │   └── client.go
│   │   │   ├── gcore/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── hostingde/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── zoneConfigsFind-request.json
│   │   │   │   │   │   ├── zoneConfigsFind.json
│   │   │   │   │   │   ├── zoneConfigsFind_error.json
│   │   │   │   │   │   ├── zoneUpdate-request.json
│   │   │   │   │   │   ├── zoneUpdate.json
│   │   │   │   │   │   └── zoneUpdate_error.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── ionos/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── get_records.json
│   │   │   │   │   │   ├── get_records_error.json
│   │   │   │   │   │   ├── list_zones.json
│   │   │   │   │   │   ├── list_zones_error.json
│   │   │   │   │   │   ├── remove_record_error.json
│   │   │   │   │   │   └── replace_records_error.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── ptr/
│   │   │   │   └── types.go
│   │   │   ├── rimuhosting/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── add_record.xml
│   │   │   │   │   │   ├── add_record_error.xml
│   │   │   │   │   │   ├── add_record_same_domain.xml
│   │   │   │   │   │   ├── delete_record.xml
│   │   │   │   │   │   ├── delete_record_error.xml
│   │   │   │   │   │   ├── delete_record_nothing.xml
│   │   │   │   │   │   ├── find_records.xml
│   │   │   │   │   │   ├── find_records_empty.xml
│   │   │   │   │   │   └── find_records_pattern.xml
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── selectel/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   │   ├── add_record.json
│   │   │   │   │   │   ├── domains.json
│   │   │   │   │   │   ├── error.json
│   │   │   │   │   │   └── list_records.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── tecnocratica/
│   │   │   │   ├── internal/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   │   ├── create_record.json
│   │   │   │   │   │   ├── get_records.json
│   │   │   │   │   │   └── get_zones.json
│   │   │   │   │   └── types.go
│   │   │   │   ├── provider.go
│   │   │   │   └── provider_test.go
│   │   │   ├── useragent/
│   │   │   │   └── useragent.go
│   │   │   └── westcn/
│   │   │       ├── internal/
│   │   │       │   ├── client.go
│   │   │       │   ├── client_test.go
│   │   │       │   ├── fixtures/
│   │   │       │   │   ├── adddnsrecord.json
│   │   │       │   │   ├── deldnsrecord.json
│   │   │       │   │   └── error.json
│   │   │       │   └── types.go
│   │   │       ├── provider.go
│   │   │       └── provider_test.go
│   │   ├── internetbs/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── Domain_DnsRecord_Add_FAILURE.json
│   │   │   │   │   ├── Domain_DnsRecord_Add_SUCCESS.json
│   │   │   │   │   ├── Domain_DnsRecord_List_FAILURE.json
│   │   │   │   │   ├── Domain_DnsRecord_List_SUCCESS.json
│   │   │   │   │   ├── Domain_DnsRecord_Remove_SUCCESS.json
│   │   │   │   │   └── auth_error.json
│   │   │   │   └── types.go
│   │   │   ├── internetbs.go
│   │   │   ├── internetbs.toml
│   │   │   └── internetbs_test.go
│   │   ├── inwx/
│   │   │   ├── inwx.go
│   │   │   ├── inwx.toml
│   │   │   └── inwx_test.go
│   │   ├── ionos/
│   │   │   ├── ionos.go
│   │   │   ├── ionos.toml
│   │   │   └── ionos_test.go
│   │   ├── ionoscloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zones.json
│   │   │   │   └── types.go
│   │   │   ├── ionoscloud.go
│   │   │   ├── ionoscloud.toml
│   │   │   └── ionoscloud_test.go
│   │   ├── ipv64/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-error.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── del_record-error.json
│   │   │   │   │   ├── del_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── get_domains.json
│   │   │   │   └── types.go
│   │   │   ├── ipv64.go
│   │   │   ├── ipv64.toml
│   │   │   └── ipv64_test.go
│   │   ├── ispconfig/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── client_get_id-request.json
│   │   │   │   │   ├── client_get_id.json
│   │   │   │   │   ├── dns_txt_add-request.json
│   │   │   │   │   ├── dns_txt_add.json
│   │   │   │   │   ├── dns_txt_delete-request.json
│   │   │   │   │   ├── dns_txt_delete.json
│   │   │   │   │   ├── dns_txt_get-request.json
│   │   │   │   │   ├── dns_txt_get.json
│   │   │   │   │   ├── dns_zone_get-request.json
│   │   │   │   │   ├── dns_zone_get.json
│   │   │   │   │   ├── dns_zone_get_id-request.json
│   │   │   │   │   ├── dns_zone_get_id.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── login-request.json
│   │   │   │   │   └── login.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── ispconfig.go
│   │   │   ├── ispconfig.toml
│   │   │   └── ispconfig_test.go
│   │   ├── ispconfigddns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── ispconfigddns.go
│   │   │   ├── ispconfigddns.toml
│   │   │   └── ispconfigddns_test.go
│   │   ├── iwantmyname/
│   │   │   ├── iwantmyname.go
│   │   │   └── iwantmyname.toml
│   │   ├── jdcloud/
│   │   │   ├── fixtures/
│   │   │   │   ├── create_record-request.json
│   │   │   │   ├── create_record.json
│   │   │   │   ├── delete_record.json
│   │   │   │   ├── describe_domains_page1.json
│   │   │   │   └── describe_domains_page2.json
│   │   │   ├── jdcloud.go
│   │   │   ├── jdcloud.toml
│   │   │   └── jdcloud_test.go
│   │   ├── joker/
│   │   │   ├── internal/
│   │   │   │   ├── dmapi/
│   │   │   │   │   ├── client.go
│   │   │   │   │   ├── client_test.go
│   │   │   │   │   ├── identity.go
│   │   │   │   │   └── identity_test.go
│   │   │   │   └── svc/
│   │   │   │       ├── client.go
│   │   │   │       └── client_test.go
│   │   │   ├── joker.go
│   │   │   ├── joker.toml
│   │   │   ├── joker_test.go
│   │   │   ├── provider_dmapi.go
│   │   │   ├── provider_dmapi_test.go
│   │   │   ├── provider_svc.go
│   │   │   └── provider_svc_test.go
│   │   ├── keyhelp/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get_domain_records.json
│   │   │   │   │   ├── get_domain_records2.json
│   │   │   │   │   ├── get_domains.json
│   │   │   │   │   ├── update_domain_records-request.json
│   │   │   │   │   ├── update_domain_records-request2.json
│   │   │   │   │   └── update_domain_records.json
│   │   │   │   └── types.go
│   │   │   ├── keyhelp.go
│   │   │   ├── keyhelp.toml
│   │   │   └── keyhelp_test.go
│   │   ├── leaseweb/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── createResourceRecordSet-request.json
│   │   │   │   │   ├── createResourceRecordSet.json
│   │   │   │   │   ├── error_400.json
│   │   │   │   │   ├── error_401.json
│   │   │   │   │   ├── error_404.json
│   │   │   │   │   ├── getResourceRecordSet.json
│   │   │   │   │   ├── getResourceRecordSet2.json
│   │   │   │   │   ├── updateResourceRecordSet-request.json
│   │   │   │   │   ├── updateResourceRecordSet-request2.json
│   │   │   │   │   └── updateResourceRecordSet.json
│   │   │   │   └── types.go
│   │   │   ├── leaseweb.go
│   │   │   ├── leaseweb.toml
│   │   │   └── leaseweb_test.go
│   │   ├── liara/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── RecordResponse.json
│   │   │   │   │   ├── RecordsResponse.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── liara.go
│   │   │   ├── liara.toml
│   │   │   └── liara_test.go
│   │   ├── lightsail/
│   │   │   ├── lightsail.go
│   │   │   ├── lightsail.toml
│   │   │   ├── lightsail_integration_test.go
│   │   │   └── lightsail_test.go
│   │   ├── limacity/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get-domains.json
│   │   │   │   │   ├── get-records.json
│   │   │   │   │   └── ok.json
│   │   │   │   └── types.go
│   │   │   ├── limacity.go
│   │   │   ├── limacity.toml
│   │   │   └── limacity_test.go
│   │   ├── linode/
│   │   │   ├── linode.go
│   │   │   ├── linode.toml
│   │   │   └── linode_test.go
│   │   ├── liquidweb/
│   │   │   ├── liquidweb.go
│   │   │   ├── liquidweb.toml
│   │   │   ├── liquidweb_test.go
│   │   │   └── servermock_test.go
│   │   ├── loopia/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── mock_test.go
│   │   │   │   └── types.go
│   │   │   ├── loopia.go
│   │   │   ├── loopia.toml
│   │   │   ├── loopia_mock_test.go
│   │   │   └── loopia_test.go
│   │   ├── luadns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   ├── delete_record.json
│   │   │   │   │   └── list_zones.json
│   │   │   │   └── types.go
│   │   │   ├── luadns.go
│   │   │   ├── luadns.toml
│   │   │   └── luadns_test.go
│   │   ├── mailinabox/
│   │   │   ├── mailinabox.go
│   │   │   ├── mailinabox.toml
│   │   │   └── mailinabox_test.go
│   │   ├── manageengine/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── error_bad_request.json
│   │   │   │   │   ├── zone_domains_all.json
│   │   │   │   │   ├── zone_record_create.json
│   │   │   │   │   ├── zone_record_delete.json
│   │   │   │   │   ├── zone_record_update.json
│   │   │   │   │   └── zone_records_all.json
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── manageengine.go
│   │   │   ├── manageengine.toml
│   │   │   └── manageengine_test.go
│   │   ├── manual/
│   │   │   ├── manual.go
│   │   │   ├── manual.toml
│   │   │   └── manual_test.go
│   │   ├── metaname/
│   │   │   ├── metaname.go
│   │   │   ├── metaname.toml
│   │   │   └── metaname_test.go
│   │   ├── metaregistrar/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error-response.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── update-dns-zone.json
│   │   │   │   └── types.go
│   │   │   ├── metaregistrar.go
│   │   │   ├── metaregistrar.toml
│   │   │   └── metaregistrar_test.go
│   │   ├── mijnhost/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── get-dns-records.json
│   │   │   │   │   ├── list-domains.json
│   │   │   │   │   └── update-dns-records.json
│   │   │   │   └── types.go
│   │   │   ├── mijnhost.go
│   │   │   ├── mijnhost.toml
│   │   │   └── mijnhost_test.go
│   │   ├── mittwald/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns-create-dns-zone.json
│   │   │   │   │   ├── dns-get-dns-zone.json
│   │   │   │   │   ├── dns-list-dns-zones.json
│   │   │   │   │   ├── domain-list-domains.json
│   │   │   │   │   ├── error-client.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── mittwald.go
│   │   │   ├── mittwald.toml
│   │   │   └── mittwald_test.go
│   │   ├── myaddr/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── error.txt
│   │   │   │   └── types.go
│   │   │   ├── myaddr.go
│   │   │   ├── myaddr.toml
│   │   │   └── myaddr_test.go
│   │   ├── mydnsjp/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── client_test.go
│   │   │   ├── mydnsjp.go
│   │   │   ├── mydnsjp.toml
│   │   │   └── mydnsjp_test.go
│   │   ├── mythicbeasts/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── delete-zoneszonerecords.json
│   │   │   │   │   ├── post-zoneszonerecords.json
│   │   │   │   │   └── token.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   └── types.go
│   │   │   ├── mythicbeasts.go
│   │   │   ├── mythicbeasts.toml
│   │   │   └── mythicbeasts_test.go
│   │   ├── namecheap/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── getHosts.xml
│   │   │   │   │   ├── getHosts_errorBadAPIKey1.xml
│   │   │   │   │   ├── getHosts_success1.xml
│   │   │   │   │   ├── getHosts_success2.xml
│   │   │   │   │   ├── setHosts.xml
│   │   │   │   │   ├── setHosts_errorBadAPIKey1.xml
│   │   │   │   │   ├── setHosts_success1.xml
│   │   │   │   │   └── setHosts_success2.xml
│   │   │   │   ├── ip.go
│   │   │   │   └── types.go
│   │   │   ├── namecheap.go
│   │   │   ├── namecheap.toml
│   │   │   ├── namecheap_test.go
│   │   │   ├── transport.go
│   │   │   └── transport_test.go
│   │   ├── namedotcom/
│   │   │   ├── namedotcom.go
│   │   │   ├── namedotcom.toml
│   │   │   └── namedotcom_test.go
│   │   ├── namesilo/
│   │   │   ├── namesilo.go
│   │   │   ├── namesilo.toml
│   │   │   └── namesilo_test.go
│   │   ├── namesurfer/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── addDNSRecord-request.json
│   │   │   │   │   ├── addDNSRecord.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── listZones-request.json
│   │   │   │   │   ├── listZones.json
│   │   │   │   │   ├── searchDNSHosts-request.json
│   │   │   │   │   ├── searchDNSHosts.json
│   │   │   │   │   ├── updateDNSHost-request.json
│   │   │   │   │   └── updateDNSHost.json
│   │   │   │   └── types.go
│   │   │   ├── namesurfer.go
│   │   │   ├── namesurfer.toml
│   │   │   └── namesurfer_test.go
│   │   ├── nearlyfreespeech/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── nearlyfreespeech.go
│   │   │   ├── nearlyfreespeech.toml
│   │   │   └── nearlyfreespeech_test.go
│   │   ├── neodigit/
│   │   │   ├── neodigit.go
│   │   │   ├── neodigit.toml
│   │   │   └── neodigit_test.go
│   │   ├── netcup/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_live_test.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── get_dns_records-request.json
│   │   │   │   │   ├── get_dns_records.json
│   │   │   │   │   ├── get_dns_records_error.json
│   │   │   │   │   ├── get_dns_records_error_unmarshal.json
│   │   │   │   │   ├── login-request.json
│   │   │   │   │   ├── login.json
│   │   │   │   │   ├── login_error.json
│   │   │   │   │   ├── login_error_unmarshal.json
│   │   │   │   │   ├── logout-request.json
│   │   │   │   │   ├── logout.json
│   │   │   │   │   └── logout_error.json
│   │   │   │   ├── session.go
│   │   │   │   ├── session_test.go
│   │   │   │   └── types.go
│   │   │   ├── netcup.go
│   │   │   ├── netcup.toml
│   │   │   └── netcup_test.go
│   │   ├── netlify/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record.json
│   │   │   │   │   └── get_records.json
│   │   │   │   └── types.go
│   │   │   ├── netlify.go
│   │   │   ├── netlify.toml
│   │   │   └── netlify_test.go
│   │   ├── nicmanager/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── zone.json
│   │   │   │   └── types.go
│   │   │   ├── nicmanager.go
│   │   │   ├── nicmanager.toml
│   │   │   └── nicmanager_test.go
│   │   ├── nicru/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── commit_POST.xml
│   │   │   │   │   ├── errors.xml
│   │   │   │   │   ├── record_DELETE.xml
│   │   │   │   │   ├── records_GET.xml
│   │   │   │   │   ├── records_PUT.xml
│   │   │   │   │   ├── services_GET.xml
│   │   │   │   │   ├── zones_GET.xml
│   │   │   │   │   └── zones_all_GET.xml
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── nicru.go
│   │   │   ├── nicru.toml
│   │   │   └── nicru_test.go
│   │   ├── nifcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── nifcloud.go
│   │   │   ├── nifcloud.toml
│   │   │   └── nifcloud_test.go
│   │   ├── njalla/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── auth_error.json
│   │   │   │   │   ├── list_records-request.json
│   │   │   │   │   ├── list_records.json
│   │   │   │   │   ├── remove_record-request.json
│   │   │   │   │   ├── remove_record_error_missing_domain.json
│   │   │   │   │   └── remove_record_error_missing_id.json
│   │   │   │   └── types.go
│   │   │   ├── njalla.go
│   │   │   ├── njalla.toml
│   │   │   └── njalla_test.go
│   │   ├── nodion/
│   │   │   ├── nodion.go
│   │   │   ├── nodion.toml
│   │   │   └── nodion_test.go
│   │   ├── ns1/
│   │   │   ├── ns1.go
│   │   │   ├── ns1.toml
│   │   │   └── ns1_test.go
│   │   ├── octenium/
│   │   │   ├── fixtures/
│   │   │   │   ├── add_dns_record.json
│   │   │   │   ├── delete_dns_record.json
│   │   │   │   ├── list_dns_records.json
│   │   │   │   └── list_domains.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_dns_record.json
│   │   │   │   │   ├── delete_dns_record.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── list_dns_records.json
│   │   │   │   │   └── list_domains.json
│   │   │   │   └── types.go
│   │   │   ├── octenium.go
│   │   │   ├── octenium.toml
│   │   │   └── octenium_test.go
│   │   ├── oraclecloud/
│   │   │   ├── configurationprovider.go
│   │   │   ├── fixtures/
│   │   │   │   ├── cert.pem
│   │   │   │   └── key.pem
│   │   │   ├── oraclecloud.go
│   │   │   ├── oraclecloud.toml
│   │   │   └── oraclecloud_test.go
│   │   ├── otc/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── zones-recordsets_DELETE.json
│   │   │   │   │   ├── zones-recordsets_GET.json
│   │   │   │   │   ├── zones-recordsets_GET_empty.json
│   │   │   │   │   ├── zones-recordsets_POST-request.json
│   │   │   │   │   ├── zones-recordsets_POST.json
│   │   │   │   │   ├── zones_GET.json
│   │   │   │   │   └── zones_GET_empty.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   ├── mock.go
│   │   │   │   └── types.go
│   │   │   ├── otc.go
│   │   │   ├── otc.toml
│   │   │   └── otc_test.go
│   │   ├── ovh/
│   │   │   ├── ovh.go
│   │   │   ├── ovh.toml
│   │   │   └── ovh_test.go
│   │   ├── pdns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── versions.json
│   │   │   │   │   ├── zone-request.json
│   │   │   │   │   └── zone.json
│   │   │   │   └── types.go
│   │   │   ├── pdns.go
│   │   │   ├── pdns.toml
│   │   │   └── pdns_test.go
│   │   ├── plesk/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record-error.xml
│   │   │   │   │   ├── add-record.xml
│   │   │   │   │   ├── delete-record-error.xml
│   │   │   │   │   ├── delete-record.xml
│   │   │   │   │   ├── get-site-error.xml
│   │   │   │   │   ├── get-site.xml
│   │   │   │   │   └── global-error.xml
│   │   │   │   └── types.go
│   │   │   ├── plesk.go
│   │   │   ├── plesk.toml
│   │   │   └── plesk_test.go
│   │   ├── porkbun/
│   │   │   ├── porkbun.go
│   │   │   ├── porkbun.toml
│   │   │   └── porkbun_test.go
│   │   ├── rackspace/
│   │   │   ├── fixtures/
│   │   │   │   ├── delete.json
│   │   │   │   ├── identity.json
│   │   │   │   ├── record.json
│   │   │   │   ├── record_details.json
│   │   │   │   └── zone_details.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-records.json
│   │   │   │   │   ├── delete-records_error.json
│   │   │   │   │   ├── list-domains-by-name.json
│   │   │   │   │   ├── search-records.json
│   │   │   │   │   └── tokens.json
│   │   │   │   ├── identity.go
│   │   │   │   ├── identity_test.go
│   │   │   │   └── types.go
│   │   │   ├── rackspace.go
│   │   │   ├── rackspace.toml
│   │   │   └── rackspace_test.go
│   │   ├── rainyun/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── domains.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── records.json
│   │   │   │   └── types.go
│   │   │   ├── rainyun.go
│   │   │   ├── rainyun.toml
│   │   │   └── rainyun_test.go
│   │   ├── rcodezero/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── rrsets-response.json
│   │   │   │   └── types.go
│   │   │   ├── rcodezero.go
│   │   │   ├── rcodezero.toml
│   │   │   └── rcodezero_test.go
│   │   ├── regfish/
│   │   │   ├── regfish.go
│   │   │   ├── regfish.toml
│   │   │   └── regfish_test.go
│   │   ├── regru/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_txt_record.json
│   │   │   │   │   ├── add_txt_record_error_auth.json
│   │   │   │   │   ├── add_txt_record_error_domain.json
│   │   │   │   │   ├── remove_record.json
│   │   │   │   │   ├── remove_record_error_auth.json
│   │   │   │   │   └── remove_record_error_domain.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── regru.go
│   │   │   ├── regru.toml
│   │   │   └── regru_test.go
│   │   ├── rfc2136/
│   │   │   ├── internal/
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── invalid_field.conf
│   │   │   │   │   ├── invalid_key.conf
│   │   │   │   │   ├── mising_algo.conf
│   │   │   │   │   ├── missing_secret.conf
│   │   │   │   │   ├── sample.conf
│   │   │   │   │   ├── text_after.conf
│   │   │   │   │   └── text_before.conf
│   │   │   │   ├── readme.md
│   │   │   │   ├── tsigkey.go
│   │   │   │   └── tsigkey_test.go
│   │   │   ├── rfc2136.go
│   │   │   ├── rfc2136.toml
│   │   │   └── rfc2136_test.go
│   │   ├── rimuhosting/
│   │   │   ├── rimuhosting.go
│   │   │   ├── rimuhosting.toml
│   │   │   └── rimuhosting_test.go
│   │   ├── route53/
│   │   │   ├── fixtures/
│   │   │   │   ├── changeResourceRecordSetsResponse.xml
│   │   │   │   ├── getChangeResponse.xml
│   │   │   │   └── listHostedZonesByNameResponse.xml
│   │   │   ├── route53.go
│   │   │   ├── route53.toml
│   │   │   ├── route53_integration_test.go
│   │   │   └── route53_test.go
│   │   ├── safedns/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record-request.json
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── safedns.go
│   │   │   ├── safedns.toml
│   │   │   └── safedns_test.go
│   │   ├── sakuracloud/
│   │   │   ├── sakuracloud.go
│   │   │   ├── sakuracloud.toml
│   │   │   ├── sakuracloud_test.go
│   │   │   ├── wrapper.go
│   │   │   └── wrapper_test.go
│   │   ├── scaleway/
│   │   │   ├── scaleway.go
│   │   │   ├── scaleway.toml
│   │   │   └── scaleway_test.go
│   │   ├── selectel/
│   │   │   ├── selectel.go
│   │   │   ├── selectel.toml
│   │   │   └── selectel_test.go
│   │   ├── selectelv2/
│   │   │   ├── selectelv2.go
│   │   │   ├── selectelv2.toml
│   │   │   └── selectelv2_test.go
│   │   ├── selfhostde/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── readme.md
│   │   │   ├── mapping.go
│   │   │   ├── mapping_test.go
│   │   │   ├── selfhostde.go
│   │   │   ├── selfhostde.toml
│   │   │   └── selfhostde_test.go
│   │   ├── servercow/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   └── records-01.json
│   │   │   │   ├── types.go
│   │   │   │   └── types_test.go
│   │   │   ├── servercow.go
│   │   │   ├── servercow.toml
│   │   │   └── servercow_test.go
│   │   ├── shellrent/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns_record-remove.json
│   │   │   │   │   ├── dns_record-store.json
│   │   │   │   │   ├── domain-details.json
│   │   │   │   │   ├── error.json
│   │   │   │   │   ├── purchase-details.json
│   │   │   │   │   └── purchase.json
│   │   │   │   └── types.go
│   │   │   ├── shellrent.go
│   │   │   ├── shellrent.toml
│   │   │   └── shellrent_test.go
│   │   ├── simply/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── bad_auth_error.json
│   │   │   │   │   ├── bad_zone_error.json
│   │   │   │   │   ├── get_records.json
│   │   │   │   │   ├── invalid_record_id_error.json
│   │   │   │   │   └── success.json
│   │   │   │   └── types.go
│   │   │   ├── simply.go
│   │   │   ├── simply.toml
│   │   │   └── simply_test.go
│   │   ├── sonic/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── sonic.go
│   │   │   ├── sonic.toml
│   │   │   └── sonic_test.go
│   │   ├── spaceship/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── get-records.json
│   │   │   │   └── types.go
│   │   │   ├── spaceship.go
│   │   │   ├── spaceship.toml
│   │   │   └── spaceship_test.go
│   │   ├── stackpath/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── get_zone_records.json
│   │   │   │   │   └── get_zones.json
│   │   │   │   ├── identity.go
│   │   │   │   └── types.go
│   │   │   ├── stackpath.go
│   │   │   ├── stackpath.toml
│   │   │   └── stackpath_test.go
│   │   ├── syse/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create_record-request.json
│   │   │   │   │   └── create_record.json
│   │   │   │   └── types.go
│   │   │   ├── syse.go
│   │   │   ├── syse.toml
│   │   │   └── syse_test.go
│   │   ├── technitium/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record.json
│   │   │   │   │   ├── delete-record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── technitium.go
│   │   │   ├── technitium.toml
│   │   │   └── technitium_test.go
│   │   ├── tencentcloud/
│   │   │   ├── tencentcloud.go
│   │   │   ├── tencentcloud.toml
│   │   │   ├── tencentcloud_test.go
│   │   │   └── wrapper.go
│   │   ├── timewebcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── createDomainDNSRecord.json
│   │   │   │   │   ├── error_bad_request.json
│   │   │   │   │   └── error_unauthorized.json
│   │   │   │   ├── readme.md
│   │   │   │   └── types.go
│   │   │   ├── timewebcloud.go
│   │   │   ├── timewebcloud.toml
│   │   │   └── timewebcloud_test.go
│   │   ├── todaynic/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── todaynic.go
│   │   │   ├── todaynic.toml
│   │   │   └── todaynic_test.go
│   │   ├── transip/
│   │   │   ├── fixtures/
│   │   │   │   └── private.key
│   │   │   ├── transip.go
│   │   │   ├── transip.toml
│   │   │   └── transip_test.go
│   │   ├── ultradns/
│   │   │   ├── ultradns.go
│   │   │   ├── ultradns.toml
│   │   │   └── ultradns_test.go
│   │   ├── uniteddomains/
│   │   │   ├── uniteddomains.go
│   │   │   ├── uniteddomains.toml
│   │   │   └── uniteddomains_test.go
│   │   ├── variomedia/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── DELETE_dns-records_done.json
│   │   │   │   │   ├── DELETE_dns-records_pending.json
│   │   │   │   │   ├── GET_dns-records.json
│   │   │   │   │   ├── GET_queue-jobs.json
│   │   │   │   │   ├── POST_dns-records.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── variomedia.go
│   │   │   ├── variomedia.toml
│   │   │   └── variomedia_test.go
│   │   ├── vegadns/
│   │   │   ├── fixtures/
│   │   │   │   ├── create_record.json
│   │   │   │   ├── record_delete.json
│   │   │   │   ├── records.json
│   │   │   │   └── token.json
│   │   │   ├── vegadns.go
│   │   │   ├── vegadns.toml
│   │   │   └── vegadns_test.go
│   │   ├── vercel/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   └── types.go
│   │   │   ├── vercel.go
│   │   │   ├── vercel.toml
│   │   │   └── vercel_test.go
│   │   ├── versio/
│   │   │   ├── fixtures/
│   │   │   │   ├── error_failToCreateTXT.json
│   │   │   │   ├── error_failToFindZone.json
│   │   │   │   └── token.json
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── get-domain-error.json
│   │   │   │   │   ├── get-domain.json
│   │   │   │   │   ├── update-domain-error.json
│   │   │   │   │   ├── update-domain-request.json
│   │   │   │   │   └── update-domain.json
│   │   │   │   └── types.go
│   │   │   ├── versio.go
│   │   │   ├── versio.toml
│   │   │   └── versio_test.go
│   │   ├── vinyldns/
│   │   │   ├── fixtures/
│   │   │   │   ├── recordSetChange-create.json
│   │   │   │   ├── recordSetChange-delete.json
│   │   │   │   ├── recordSetDelete.json
│   │   │   │   ├── recordSetUpdate-create.json
│   │   │   │   ├── recordSetsListAll-empty.json
│   │   │   │   ├── recordSetsListAll.json
│   │   │   │   └── zoneByName.json
│   │   │   ├── vinyldns.go
│   │   │   ├── vinyldns.toml
│   │   │   ├── vinyldns_test.go
│   │   │   └── wrapper.go
│   │   ├── virtualname/
│   │   │   ├── virtualname.go
│   │   │   ├── virtualname.toml
│   │   │   └── virtualname_test.go
│   │   ├── vkcloud/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── types.go
│   │   │   ├── vkcloud.go
│   │   │   ├── vkcloud.toml
│   │   │   └── vkcloud_test.go
│   │   ├── volcengine/
│   │   │   ├── volcengine.go
│   │   │   ├── volcengine.toml
│   │   │   └── volcengine_test.go
│   │   ├── vscale/
│   │   │   ├── vscale.go
│   │   │   ├── vscale.toml
│   │   │   └── vscale_test.go
│   │   ├── vultr/
│   │   │   ├── vultr.go
│   │   │   ├── vultr.toml
│   │   │   └── vultr_test.go
│   │   ├── webnames/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.json
│   │   │   │   │   └── ok.json
│   │   │   │   └── types.go
│   │   │   ├── webnames.go
│   │   │   ├── webnames.toml
│   │   │   └── webnames_test.go
│   │   ├── webnamesca/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_txt_record.json
│   │   │   │   │   ├── delete_txt_record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── webnamesca.go
│   │   │   ├── webnamesca.toml
│   │   │   └── webnamesca_test.go
│   │   ├── websupport/
│   │   │   ├── websupport.go
│   │   │   ├── websupport.toml
│   │   │   └── websupport_test.go
│   │   ├── wedos/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── dns-domain-commit.json
│   │   │   │   │   ├── dns-row-add.json
│   │   │   │   │   ├── dns-row-delete.json
│   │   │   │   │   ├── dns-row-update.json
│   │   │   │   │   └── dns-rows-list.json
│   │   │   │   ├── token.go
│   │   │   │   └── types.go
│   │   │   ├── wedos.go
│   │   │   ├── wedos.toml
│   │   │   └── wedos_test.go
│   │   ├── westcn/
│   │   │   ├── westcn.go
│   │   │   ├── westcn.toml
│   │   │   └── westcn_test.go
│   │   ├── yandex/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add_record.json
│   │   │   │   │   ├── add_record_error.json
│   │   │   │   │   ├── get_records.json
│   │   │   │   │   ├── get_records_error.json
│   │   │   │   │   ├── remove_record.json
│   │   │   │   │   └── remove_record_error.json
│   │   │   │   └── types.go
│   │   │   ├── yandex.go
│   │   │   ├── yandex.toml
│   │   │   └── yandex_test.go
│   │   ├── yandex360/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── add-record.json
│   │   │   │   │   ├── delete-record.json
│   │   │   │   │   └── error.json
│   │   │   │   └── types.go
│   │   │   ├── yandex360.go
│   │   │   ├── yandex360.toml
│   │   │   └── yandex360_test.go
│   │   ├── yandexcloud/
│   │   │   ├── yandexcloud.go
│   │   │   ├── yandexcloud.toml
│   │   │   └── yandexcloud_test.go
│   │   ├── zoneedit/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── error.xml
│   │   │   │   │   └── success.xml
│   │   │   │   └── types.go
│   │   │   ├── zoneedit.go
│   │   │   ├── zoneedit.toml
│   │   │   └── zoneedit_test.go
│   │   ├── zoneee/
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   ├── client_test.go
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── create-txt-record.json
│   │   │   │   │   └── get-txt-records.json
│   │   │   │   └── types.go
│   │   │   ├── zoneee.go
│   │   │   ├── zoneee.toml
│   │   │   └── zoneee_test.go
│   │   ├── zonomi/
│   │   │   ├── zonomi.go
│   │   │   ├── zonomi.toml
│   │   │   └── zonomi_test.go
│   │   └── zz_gen_dns_providers.go
│   └── http/
│       ├── memcached/
│       │   ├── README.md
│       │   ├── memcached.go
│       │   └── memcached_test.go
│       ├── s3/
│       │   ├── s3.go
│       │   ├── s3.toml
│       │   └── s3_test.go
│       └── webroot/
│           ├── webroot.go
│           └── webroot_test.go
└── registration/
    ├── registar.go
    ├── registar_test.go
    ├── user.go
    └── user_test.go
Download .txt
Showing preview only (804K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8972 symbols across 1006 files)

FILE: acme/api/account.go
  type AccountService (line 11) | type AccountService
    method New (line 14) | func (a *AccountService) New(req acme.Account) (acme.ExtendedAccount, ...
    method NewEAB (line 32) | func (a *AccountService) NewEAB(accMsg acme.Account, kid, hmacEncoded ...
    method Get (line 49) | func (a *AccountService) Get(accountURL string) (acme.Account, error) {
    method Update (line 65) | func (a *AccountService) Update(accountURL string, req acme.Account) (...
    method Deactivate (line 81) | func (a *AccountService) Deactivate(accountURL string) error {
  function decodeEABHmac (line 92) | func decodeEABHmac(hmacEncoded string) ([]byte, error) {

FILE: acme/api/account_test.go
  function Test_decodeEABHmac (line 10) | func Test_decodeEABHmac(t *testing.T) {

FILE: acme/api/api.go
  type Core (line 22) | type Core struct
    method post (line 64) | func (a *Core) post(uri string, reqBody, response any) (*http.Response...
    method postAsGet (line 75) | func (a *Core) postAsGet(uri string, response any) (*http.Response, er...
    method retrievablePost (line 79) | func (a *Core) retrievablePost(uri string, content []byte, response an...
    method signedPost (line 112) | func (a *Core) signedPost(uri string, content []byte, response any) (*...
    method signEABContent (line 131) | func (a *Core) signEABContent(newAccountURL, kid string, hmac []byte) ...
    method GetKeyAuthorization (line 141) | func (a *Core) GetKeyAuthorization(token string) (string, error) {
    method GetDirectory (line 145) | func (a *Core) GetDirectory() acme.Directory {
  function New (line 38) | func New(httpClient *http.Client, userAgent, caDirURL, kid string, priva...
  function getDirectory (line 149) | func getDirectory(do *sender.Doer, caDirURL string) (acme.Directory, err...

FILE: acme/api/authorization.go
  type AuthorizationService (line 9) | type AuthorizationService
    method Get (line 12) | func (c *AuthorizationService) Get(authzURL string) (acme.Authorizatio...
    method Deactivate (line 28) | func (c *AuthorizationService) Deactivate(authzURL string) error {

FILE: acme/api/certificate.go
  constant maxBodySize (line 14) | maxBodySize = 1024 * 1024
  type CertificateService (line 16) | type CertificateService
    method Get (line 20) | func (c *CertificateService) Get(certURL string, bundle bool) ([]byte,...
    method GetAll (line 31) | func (c *CertificateService) GetAll(certURL string, bundle bool) (map[...
    method Revoke (line 56) | func (c *CertificateService) Revoke(req acme.RevokeCertMessage) error {
    method get (line 62) | func (c *CertificateService) get(certURL string, bundle bool) (*acme.R...
    method getCertificateChain (line 83) | func (c *CertificateService) getCertificateChain(cert []byte, bundle b...

FILE: acme/api/certificate_test.go
  constant certResponseMock (line 14) | certResponseMock = `-----BEGIN CERTIFICATE-----
  constant issuerMock (line 54) | issuerMock = `-----BEGIN CERTIFICATE-----
  function TestCertificateService_Get_issuerRelUp (line 75) | func TestCertificateService_Get_issuerRelUp(t *testing.T) {
  function TestCertificateService_Get_embeddedIssuer (line 92) | func TestCertificateService_Get_embeddedIssuer(t *testing.T) {

FILE: acme/api/challenge.go
  type ChallengeService (line 9) | type ChallengeService
    method New (line 12) | func (c *ChallengeService) New(chlgURL string) (acme.ExtendedChallenge...
    method Get (line 33) | func (c *ChallengeService) Get(chlgURL string) (acme.ExtendedChallenge...

FILE: acme/api/identifier.go
  function createIdentifiers (line 11) | func createIdentifiers(domains []string) []acme.Identifier {
  function compareIdentifiers (line 36) | func compareIdentifiers(a, b []acme.Identifier) int {
  function compareIdentifier (line 47) | func compareIdentifier(right, left acme.Identifier) int {

FILE: acme/api/identifier_test.go
  function Test_compareIdentifiers (line 10) | func Test_compareIdentifiers(t *testing.T) {

FILE: acme/api/internal/nonces/nonce_manager.go
  type Manager (line 13) | type Manager struct
    method Pop (line 30) | func (n *Manager) Pop() (string, bool) {
    method Push (line 45) | func (n *Manager) Push(nonce string) {
    method Nonce (line 53) | func (n *Manager) Nonce() (string, error) {
    method getNonce (line 61) | func (n *Manager) getNonce() (string, error) {
  function NewManager (line 22) | func NewManager(do *sender.Doer, nonceURL string) *Manager {
  function GetFromResponse (line 71) | func GetFromResponse(resp *http.Response) (string, error) {

FILE: acme/api/internal/nonces/nonce_manager_test.go
  function TestNotHoldingLockWhileMakingHTTPRequests (line 14) | func TestNotHoldingLockWhileMakingHTTPRequests(t *testing.T) {

FILE: acme/api/internal/secure/jws.go
  type JWS (line 16) | type JWS struct
    method SetKid (line 32) | func (j *JWS) SetKid(kid string) {
    method SignContent (line 37) | func (j *JWS) SignContent(url string, content []byte) (*jose.JSONWebSi...
    method SignEABContent (line 81) | func (j *JWS) SignEABContent(url, kid string, hmac []byte) (*jose.JSON...
    method GetKeyAuthorization (line 112) | func (j *JWS) GetKeyAuthorization(token string) (string, error) {
  function NewJWS (line 23) | func NewJWS(privateKey crypto.PrivateKey, kid string, nonceManager *nonc...

FILE: acme/api/internal/secure/jws_test.go
  function TestNotHoldingLockWhileMakingHTTPRequests (line 15) | func TestNotHoldingLockWhileMakingHTTPRequests(t *testing.T) {

FILE: acme/api/internal/sender/sender.go
  type RequestOption (line 14) | type RequestOption
  function contentType (line 16) | func contentType(ct string) RequestOption {
  type Doer (line 23) | type Doer struct
    method Get (line 40) | func (d *Doer) Get(url string, response any) (*http.Response, error) {
    method Head (line 51) | func (d *Doer) Head(url string) (*http.Response, error) {
    method Post (line 62) | func (d *Doer) Post(url string, body io.Reader, bodyType string, respo...
    method newRequest (line 71) | func (d *Doer) newRequest(method, uri string, body io.Reader, opts ......
    method do (line 89) | func (d *Doer) do(req *http.Request, response any) (*http.Response, er...
    method formatUserAgent (line 117) | func (d *Doer) formatUserAgent() string {
  function NewDoer (line 29) | func NewDoer(client *http.Client, userAgent string) *Doer {
  function checkError (line 122) | func checkError(req *http.Request, resp *http.Response) error {
  type httpsOnly (line 165) | type httpsOnly struct
    method RoundTrip (line 182) | func (r *httpsOnly) RoundTrip(req *http.Request) (*http.Response, erro...
  function newHTTPSOnly (line 169) | func newHTTPSOnly(client *http.Client) *httpsOnly {

FILE: acme/api/internal/sender/sender_test.go
  function TestDo_UserAgentOnAllHTTPMethod (line 16) | func TestDo_UserAgentOnAllHTTPMethod(t *testing.T) {
  function TestDo_CustomUserAgent (line 60) | func TestDo_CustomUserAgent(t *testing.T) {
  function TestDo_failWithHTTP (line 75) | func TestDo_failWithHTTP(t *testing.T) {
  function Test_checkError (line 85) | func Test_checkError(t *testing.T) {
  function errorAs (line 145) | func errorAs[T error](t *testing.T, err error) {

FILE: acme/api/internal/sender/useragent.go
  constant ourUserAgent (line 7) | ourUserAgent = "xenolf-acme/4.33.0"
  constant ourUserAgentComment (line 12) | ourUserAgentComment = "detach"

FILE: acme/api/order.go
  type OrderOptions (line 14) | type OrderOptions struct
  type OrderService (line 29) | type OrderService
    method New (line 32) | func (o *OrderService) New(domains []string) (acme.ExtendedOrder, erro...
    method NewWithOptions (line 37) | func (o *OrderService) NewWithOptions(domains []string, opts *OrderOpt...
    method Get (line 105) | func (o *OrderService) Get(orderURL string) (acme.ExtendedOrder, error) {
    method UpdateForCSR (line 121) | func (o *OrderService) UpdateForCSR(orderURL string, csr []byte) (acme...

FILE: acme/api/order_test.go
  function TestOrderService_NewWithOptions (line 20) | func TestOrderService_NewWithOptions(t *testing.T) {
  function readSignedBody (line 104) | func readSignedBody(r *http.Request, privateKey *rsa.PrivateKey) ([]byte...

FILE: acme/api/renewal.go
  method GetRenewalInfo (line 18) | func (c *CertificateService) GetRenewalInfo(certID string) (*http.Respon...

FILE: acme/api/service.go
  type service (line 11) | type service struct
  function getLink (line 16) | func getLink(header http.Header, rel string) string {
  function getLinks (line 25) | func getLinks(header http.Header, rel string) []string {
  function getLocation (line 46) | func getLocation(resp *http.Response) string {
  function getRetryAfter (line 55) | func getRetryAfter(resp *http.Response) string {
  function ParseRetryAfter (line 68) | func ParseRetryAfter(value string) (time.Duration, error) {

FILE: acme/api/service_test.go
  function Test_getLink (line 12) | func Test_getLink(t *testing.T) {
  function TestParseRetryAfter (line 59) | func TestParseRetryAfter(t *testing.T) {

FILE: acme/commons.go
  constant StatusDeactivated (line 13) | StatusDeactivated = "deactivated"
  constant StatusExpired (line 14) | StatusExpired     = "expired"
  constant StatusInvalid (line 15) | StatusInvalid     = "invalid"
  constant StatusPending (line 16) | StatusPending     = "pending"
  constant StatusProcessing (line 17) | StatusProcessing  = "processing"
  constant StatusReady (line 18) | StatusReady       = "ready"
  constant StatusRevoked (line 19) | StatusRevoked     = "revoked"
  constant StatusUnknown (line 20) | StatusUnknown     = "unknown"
  constant StatusValid (line 21) | StatusValid       = "valid"
  constant CRLReasonUnspecified (line 27) | CRLReasonUnspecified          uint = 0
  constant CRLReasonKeyCompromise (line 28) | CRLReasonKeyCompromise        uint = 1
  constant CRLReasonCACompromise (line 29) | CRLReasonCACompromise         uint = 2
  constant CRLReasonAffiliationChanged (line 30) | CRLReasonAffiliationChanged   uint = 3
  constant CRLReasonSuperseded (line 31) | CRLReasonSuperseded           uint = 4
  constant CRLReasonCessationOfOperation (line 32) | CRLReasonCessationOfOperation uint = 5
  constant CRLReasonCertificateHold (line 33) | CRLReasonCertificateHold      uint = 6
  constant CRLReasonRemoveFromCRL (line 34) | CRLReasonRemoveFromCRL        uint = 8
  constant CRLReasonPrivilegeWithdrawn (line 35) | CRLReasonPrivilegeWithdrawn   uint = 9
  constant CRLReasonAACompromise (line 36) | CRLReasonAACompromise         uint = 10
  type Directory (line 42) | type Directory struct
  type Meta (line 55) | type Meta struct
  type ExtendedAccount (line 85) | type ExtendedAccount struct
  type Account (line 95) | type Account struct
  type ExtendedOrder (line 132) | type ExtendedOrder struct
  type Order (line 141) | type Order struct
    method Err (line 204) | func (r *Order) Err() error {
  type Authorization (line 214) | type Authorization struct
  type ExtendedChallenge (line 246) | type ExtendedChallenge struct
  type Challenge (line 258) | type Challenge struct
    method Err (line 298) | func (c *Challenge) Err() error {
  type Identifier (line 308) | type Identifier struct
  type CSRMessage (line 315) | type CSRMessage struct
  type RevokeCertMessage (line 326) | type RevokeCertMessage struct
  type RawCertificate (line 342) | type RawCertificate struct
  type Window (line 348) | type Window struct
  type RenewalInfoResponse (line 355) | type RenewalInfoResponse struct
  type RenewalInfoUpdateRequest (line 368) | type RenewalInfoUpdateRequest struct

FILE: acme/errors.go
  constant errNS (line 10) | errNS              = "urn:ietf:params:acme:error:"
  constant BadNonceErr (line 11) | BadNonceErr        = errNS + "badNonce"
  constant AlreadyReplacedErr (line 12) | AlreadyReplacedErr = errNS + "alreadyReplaced"
  constant RateLimitedErr (line 13) | RateLimitedErr     = errNS + "rateLimited"
  type ProblemDetails (line 19) | type ProblemDetails struct
    method Error (line 31) | func (p *ProblemDetails) Error() string {
  type SubProblem (line 55) | type SubProblem struct
  type NonceError (line 63) | type NonceError struct
    method Unwrap (line 67) | func (e *NonceError) Unwrap() error {
  type AlreadyReplacedError (line 74) | type AlreadyReplacedError struct
    method Unwrap (line 78) | func (e *AlreadyReplacedError) Unwrap() error {
  type RateLimitedError (line 85) | type RateLimitedError struct
    method Unwrap (line 91) | func (e *RateLimitedError) Unwrap() error {

FILE: certcrypto/crypto.go
  constant EC256 (line 27) | EC256   = KeyType("P256")
  constant EC384 (line 28) | EC384   = KeyType("P384")
  constant RSA2048 (line 29) | RSA2048 = KeyType("2048")
  constant RSA3072 (line 30) | RSA3072 = KeyType("3072")
  constant RSA4096 (line 31) | RSA4096 = KeyType("4096")
  constant RSA8192 (line 32) | RSA8192 = KeyType("8192")
  constant OCSPGood (line 37) | OCSPGood = ocsp.Good
  constant OCSPRevoked (line 39) | OCSPRevoked = ocsp.Revoked
  constant OCSPUnknown (line 41) | OCSPUnknown = ocsp.Unknown
  constant OCSPServerFailed (line 43) | OCSPServerFailed = ocsp.ServerFailed
  type KeyType (line 53) | type KeyType
  type DERCertificateBytes (line 55) | type DERCertificateBytes
  function ParsePEMBundle (line 59) | func ParsePEMBundle(bundle []byte) ([]*x509.Certificate, error) {
  function ParsePEMPrivateKey (line 92) | func ParsePEMPrivateKey(key []byte) (crypto.PrivateKey, error) {
  function GeneratePrivateKey (line 122) | func GeneratePrivateKey(keyType KeyType) (crypto.PrivateKey, error) {
  function GenerateCSR (line 142) | func GenerateCSR(privateKey crypto.PrivateKey, domain string, san []stri...
  type CSROptions (line 150) | type CSROptions struct
  function CreateCSR (line 157) | func CreateCSR(privateKey crypto.PrivateKey, opts CSROptions) ([]byte, e...
  function PEMEncode (line 188) | func PEMEncode(data any) []byte {
  function PEMBlock (line 192) | func PEMBlock(data any) *pem.Block {
  function pemDecode (line 210) | func pemDecode(data []byte) (*pem.Block, error) {
  function PemDecodeTox509CSR (line 219) | func PemDecodeTox509CSR(data []byte) (*x509.CertificateRequest, error) {
  function ParsePEMCertificate (line 234) | func ParsePEMCertificate(cert []byte) (*x509.Certificate, error) {
  function GetCertificateMainDomain (line 244) | func GetCertificateMainDomain(cert *x509.Certificate) (string, error) {
  function GetCSRMainDomain (line 248) | func GetCSRMainDomain(cert *x509.CertificateRequest) (string, error) {
  function getMainDomain (line 252) | func getMainDomain(subject pkix.Name, dnsNames []string, ips []net.IP) (...
  function ExtractDomains (line 268) | func ExtractDomains(cert *x509.Certificate) []string {
  function ExtractDomainsCSR (line 293) | func ExtractDomainsCSR(csr *x509.CertificateRequest) []string {
  function GeneratePemCert (line 320) | func GeneratePemCert(privateKey *rsa.PrivateKey, domain string, extensio...
  function generateDerCert (line 329) | func generateDerCert(privateKey *rsa.PrivateKey, expiration time.Time, d...

FILE: certcrypto/crypto_test.go
  constant testDomain1 (line 17) | testDomain1 = "lego.example"
  constant testDomain2 (line 18) | testDomain2 = "a.lego.example"
  constant testDomain3 (line 19) | testDomain3 = "b.lego.example"
  constant testDomain4 (line 20) | testDomain4 = "c.lego.example"
  function TestGeneratePrivateKey (line 23) | func TestGeneratePrivateKey(t *testing.T) {
  function TestGenerateCSR (line 30) | func TestGenerateCSR(t *testing.T) {
  function TestPEMEncode (line 132) | func TestPEMEncode(t *testing.T) {
  function TestParsePEMCertificate (line 146) | func TestParsePEMCertificate(t *testing.T) {
  function TestParsePEMPrivateKey (line 172) | func TestParsePEMPrivateKey(t *testing.T) {

FILE: certificate/authorization.go
  method getAuthorizations (line 10) | func (c *Certifier) getAuthorizations(order acme.ExtendedOrder) ([]acme....
  method deactivateAuthorizations (line 52) | func (c *Certifier) deactivateAuthorizations(order acme.ExtendedOrder, f...

FILE: certificate/certificates.go
  constant DefaultOverallRequestLimit (line 33) | DefaultOverallRequestLimit = 18
  constant maxBodySize (line 37) | maxBodySize = 1024 * 1024
  type Resource (line 44) | type Resource struct
  type ObtainRequest (line 67) | type ObtainRequest struct
  type ObtainForCSRRequest (line 97) | type ObtainForCSRRequest struct
  type resolver (line 120) | type resolver interface
  type CertifierOptions (line 124) | type CertifierOptions struct
  type Certifier (line 132) | type Certifier struct
    method Obtain (line 159) | func (c *Certifier) Obtain(request ObtainRequest) (*Resource, error) {
    method ObtainForCSR (line 225) | func (c *Certifier) ObtainForCSR(request ObtainForCSRRequest) (*Resour...
    method getForOrder (line 294) | func (c *Certifier) getForOrder(domains []string, order acme.ExtendedO...
    method getForCSR (line 344) | func (c *Certifier) getForCSR(domains []string, order acme.ExtendedOrd...
    method checkResponse (line 398) | func (c *Certifier) checkResponse(order acme.ExtendedOrder, certRes *R...
    method Revoke (line 445) | func (c *Certifier) Revoke(cert []byte) error {
    method RevokeWithReason (line 450) | func (c *Certifier) RevokeWithReason(cert []byte, reason *uint) error {
    method Renew (line 497) | func (c *Certifier) Renew(certRes Resource, bundle, mustStaple bool, p...
    method RenewWithOptions (line 515) | func (c *Certifier) RenewWithOptions(certRes Resource, options *RenewO...
    method GetOCSP (line 591) | func (c *Certifier) GetOCSP(bundle []byte) ([]byte, *ocsp.Response, er...
    method Get (line 669) | func (c *Certifier) Get(url string, bundle bool) (*Resource, error) {
  function NewCertifier (line 140) | func NewCertifier(core *api.Core, resolver resolver, options CertifierOp...
  type RenewOptions (line 470) | type RenewOptions struct
  function hasPreferredChain (line 695) | func hasPreferredChain(issuer []byte, preferredChain string) (bool, erro...
  function checkOrderStatus (line 710) | func checkOrderStatus(order acme.ExtendedOrder) (bool, error) {
  function sanitizeDomain (line 726) | func sanitizeDomain(domains []string) []string {

FILE: certificate/certificates_test.go
  constant certResponseNoBundleMock (line 19) | certResponseNoBundleMock = `-----BEGIN CERTIFICATE-----
  constant certResponseMock (line 40) | certResponseMock = `-----BEGIN CERTIFICATE-----
  constant issuerMock (line 80) | issuerMock = `-----BEGIN CERTIFICATE-----
  constant certResponseMock2 (line 101) | certResponseMock2 = `
  constant issuerMock2 (line 155) | issuerMock2 = `-----BEGIN CERTIFICATE-----
  function Test_checkResponse (line 177) | func Test_checkResponse(t *testing.T) {
  function Test_checkResponse_issuerRelUp (line 211) | func Test_checkResponse_issuerRelUp(t *testing.T) {
  function Test_checkResponse_no_bundle (line 245) | func Test_checkResponse_no_bundle(t *testing.T) {
  function Test_checkResponse_alternate (line 279) | func Test_checkResponse_alternate(t *testing.T) {
  function Test_Get (line 323) | func Test_Get(t *testing.T) {
  function Test_checkOrderStatus (line 349) | func Test_checkOrderStatus(t *testing.T) {
  type resolverMock (line 394) | type resolverMock struct
    method Solve (line 398) | func (r *resolverMock) Solve(_ []acme.Authorization) error {

FILE: certificate/errors.go
  type obtainError (line 8) | type obtainError struct
    method Add (line 16) | func (e *obtainError) Add(domain string, err error) {
    method Join (line 20) | func (e *obtainError) Join() error {
  function newObtainError (line 12) | func newObtainError() *obtainError {
  type domainError (line 37) | type domainError struct

FILE: certificate/errors_test.go
  type TomatoError (line 10) | type TomatoError struct
    method Error (line 12) | func (t TomatoError) Error() string {
  type CarrotError (line 16) | type CarrotError struct
    method Error (line 18) | func (t CarrotError) Error() string {
  function Test_obtainError_Join (line 22) | func Test_obtainError_Join(t *testing.T) {
  function Test_obtainError_Join_multiple_domains (line 33) | func Test_obtainError_Join_multiple_domains(t *testing.T) {
  function Test_obtainError_Join_no_error (line 48) | func Test_obtainError_Join_no_error(t *testing.T) {
  function Test_obtainError_Join_same_domain (line 54) | func Test_obtainError_Join_same_domain(t *testing.T) {

FILE: certificate/renewal.go
  type RenewalInfoRequest (line 18) | type RenewalInfoRequest struct
  type RenewalInfoResponse (line 23) | type RenewalInfoResponse struct
    method ShouldRenewAt (line 38) | func (r *RenewalInfoResponse) ShouldRenewAt(now time.Time, willingToSl...
  method GetRenewalInfo (line 76) | func (c *Certifier) GetRenewalInfo(req RenewalInfoRequest) (*RenewalInfo...
  function MakeARICertID (line 106) | func MakeARICertID(leaf *x509.Certificate) (string, error) {

FILE: certificate/renewal_test.go
  constant ariLeafPEM (line 20) | ariLeafPEM = `-----BEGIN CERTIFICATE-----
  constant ariLeafCertID (line 29) | ariLeafCertID = "aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE"
  function Test_makeCertID (line 32) | func Test_makeCertID(t *testing.T) {
  function TestCertifier_GetRenewalInfo (line 41) | func TestCertifier_GetRenewalInfo(t *testing.T) {
  function TestCertifier_GetRenewalInfo_retryAfter (line 77) | func TestCertifier_GetRenewalInfo_retryAfter(t *testing.T) {
  function TestCertifier_GetRenewalInfo_errors (line 113) | func TestCertifier_GetRenewalInfo_errors(t *testing.T) {
  function TestRenewalInfoResponse_ShouldRenew (line 171) | func TestRenewalInfoResponse_ShouldRenew(t *testing.T) {

FILE: challenge/challenges.go
  type Type (line 10) | type Type
    method String (line 25) | func (t Type) String() string {
  constant HTTP01 (line 15) | HTTP01 = Type("http-01")
  constant DNS01 (line 19) | DNS01 = Type("dns-01")
  constant TLSALPN01 (line 22) | TLSALPN01 = Type("tls-alpn-01")
  function FindChallenge (line 29) | func FindChallenge(chlgType Type, authz acme.Authorization) (acme.Challe...
  function GetTargetedDomain (line 39) | func GetTargetedDomain(authz acme.Authorization) string {

FILE: challenge/dns01/cname.go
  function updateDomainWithCName (line 10) | func updateDomainWithCName(r *dns.Msg, fqdn string) string {

FILE: challenge/dns01/cname_test.go
  function Test_updateDomainWithCName_caseInsensitive (line 11) | func Test_updateDomainWithCName_caseInsensitive(t *testing.T) {

FILE: challenge/dns01/dns_challenge.go
  constant DefaultPropagationTimeout (line 22) | DefaultPropagationTimeout = 60 * time.Second
  constant DefaultPollingInterval (line 25) | DefaultPollingInterval = 2 * time.Second
  constant DefaultTTL (line 28) | DefaultTTL = 120
  type ValidateFunc (line 31) | type ValidateFunc
  type ChallengeOption (line 33) | type ChallengeOption
  function CondOption (line 36) | func CondOption(condition bool, opt ChallengeOption) ChallengeOption {
  type Challenge (line 48) | type Challenge struct
    method PreSolve (line 77) | func (c *Challenge) PreSolve(authz acme.Authorization) error {
    method Solve (line 104) | func (c *Challenge) Solve(authz acme.Authorization) error {
    method CleanUp (line 152) | func (c *Challenge) CleanUp(authz acme.Authorization) error {
    method Sequential (line 168) | func (c *Challenge) Sequential() (bool, time.Duration) {
  function NewChallenge (line 56) | func NewChallenge(core *api.Core, validate ValidateFunc, provider challe...
  type sequential (line 176) | type sequential interface
  function GetRecord (line 183) | func GetRecord(domain, keyAuth string) (fqdn, value string) {
  type ChallengeInfo (line 190) | type ChallengeInfo struct
  function GetChallengeInfo (line 202) | func GetChallengeInfo(domain, keyAuth string) ChallengeInfo {
  function getChallengeFQDN (line 216) | func getChallengeFQDN(domain string, followCNAME bool) string {

FILE: challenge/dns01/dns_challenge_manual.go
  constant dnsTemplate (line 11) | dnsTemplate = `%s %d IN TXT %q`
  type DNSProviderManual (line 18) | type DNSProviderManual struct
    method Present (line 28) | func (*DNSProviderManual) Present(domain, token, keyAuth string) error {
    method CleanUp (line 49) | func (*DNSProviderManual) CleanUp(domain, token, keyAuth string) error {
    method Sequential (line 65) | func (d *DNSProviderManual) Sequential() time.Duration {
  function NewDNSProviderManual (line 23) | func NewDNSProviderManual() (*DNSProviderManual, error) {

FILE: challenge/dns01/dns_challenge_test.go
  type providerMock (line 19) | type providerMock struct
    method Present (line 23) | func (p *providerMock) Present(domain, token, keyAuth string) error { ...
    method CleanUp (line 24) | func (p *providerMock) CleanUp(domain, token, keyAuth string) error { ...
  type providerTimeoutMock (line 26) | type providerTimeoutMock struct
    method Present (line 31) | func (p *providerTimeoutMock) Present(domain, token, keyAuth string) e...
    method CleanUp (line 32) | func (p *providerTimeoutMock) CleanUp(domain, token, keyAuth string) e...
    method Timeout (line 33) | func (p *providerTimeoutMock) Timeout() (time.Duration, time.Duration)...
  function TestChallenge_PreSolve (line 35) | func TestChallenge_PreSolve(t *testing.T) {
  function TestChallenge_Solve (line 117) | func TestChallenge_Solve(t *testing.T) {
  function TestChallenge_CleanUp (line 209) | func TestChallenge_CleanUp(t *testing.T) {
  function TestGetChallengeInfo (line 291) | func TestGetChallengeInfo(t *testing.T) {
  function TestGetChallengeInfo_CNAME (line 307) | func TestGetChallengeInfo_CNAME(t *testing.T) {
  function TestGetChallengeInfo_CNAME_disabled (line 324) | func TestGetChallengeInfo_CNAME_disabled(t *testing.T) {

FILE: challenge/dns01/domain.go
  function ExtractSubDomain (line 11) | func ExtractSubDomain(domain, zone string) (string, error) {

FILE: challenge/dns01/domain_test.go
  function TestExtractSubDomain (line 10) | func TestExtractSubDomain(t *testing.T) {
  function TestExtractSubDomain_errors (line 61) | func TestExtractSubDomain_errors(t *testing.T) {

FILE: challenge/dns01/fqdn.go
  function ToFqdn (line 12) | func ToFqdn(name string) string {
  function UnFqdn (line 17) | func UnFqdn(name string) string {
  function UnFqdnDomainsSeq (line 27) | func UnFqdnDomainsSeq(fqdn string) iter.Seq[string] {
  function DomainsSeq (line 42) | func DomainsSeq(fqdn string) iter.Seq[string] {

FILE: challenge/dns01/fqdn_test.go
  function TestUnFqdn (line 10) | func TestUnFqdn(t *testing.T) {
  function TestUnFqdnDomainsSeq (line 39) | func TestUnFqdnDomainsSeq(t *testing.T) {
  function TestDomainsSeq (line 80) | func TestDomainsSeq(t *testing.T) {

FILE: challenge/dns01/mock_test.go
  function fakeNS (line 13) | func fakeNS(name, ns string) *dns.NS {
  function fakeA (line 20) | func fakeA(name, ip string) *dns.A {
  function fakeTXT (line 27) | func fakeTXT(name, value string) *dns.TXT {
  function mockResolver (line 36) | func mockResolver(t *testing.T, addr net.Addr) {
  function useAsNameserver (line 66) | func useAsNameserver(t *testing.T, addr net.Addr) {

FILE: challenge/dns01/nameserver.go
  constant defaultResolvConf (line 17) | defaultResolvConf = "/etc/resolv.conf"
  type soaCacheEntry (line 30) | type soaCacheEntry struct
    method isExpired (line 45) | func (cache *soaCacheEntry) isExpired() bool {
  function newSoaCacheEntry (line 36) | func newSoaCacheEntry(soa *dns.SOA) *soaCacheEntry {
  function ClearFqdnCache (line 50) | func ClearFqdnCache() {
  function AddDNSTimeout (line 58) | func AddDNSTimeout(timeout time.Duration) ChallengeOption {
  function AddRecursiveNameservers (line 65) | func AddRecursiveNameservers(nameservers []string) ChallengeOption {
  function getNameservers (line 73) | func getNameservers(path string, defaults []string) []string {
  function ParseNameservers (line 82) | func ParseNameservers(servers []string) []string {
  function lookupNameservers (line 98) | func lookupNameservers(fqdn string) ([]string, error) {
  function FindPrimaryNsByFqdn (line 126) | func FindPrimaryNsByFqdn(fqdn string) (string, error) {
  function FindPrimaryNsByFqdnCustom (line 132) | func FindPrimaryNsByFqdnCustom(fqdn string, nameservers []string) (strin...
  function FindZoneByFqdn (line 143) | func FindZoneByFqdn(fqdn string) (string, error) {
  function FindZoneByFqdnCustom (line 149) | func FindZoneByFqdnCustom(fqdn string, nameservers []string) (string, er...
  function lookupSoaByFqdn (line 158) | func lookupSoaByFqdn(fqdn string, nameservers []string) (*soaCacheEntry,...
  function fetchSoaByFqdn (line 178) | func fetchSoaByFqdn(fqdn string, nameservers []string) (*soaCacheEntry, ...
  function dnsMsgContainsCNAME (line 224) | func dnsMsgContainsCNAME(msg *dns.Msg) bool {
  function dnsQuery (line 231) | func dnsQuery(fqdn string, rtype uint16, nameservers []string, recursive...
  function createDNSMsg (line 260) | func createDNSMsg(fqdn string, rtype uint16, recursive bool) *dns.Msg {
  function sendDNSQuery (line 272) | func sendDNSQuery(m *dns.Msg, ns string) (*dns.Msg, error) {
  type DNSError (line 301) | type DNSError struct
    method Error (line 309) | func (d *DNSError) Error() string {
    method Unwrap (line 343) | func (d *DNSError) Unwrap() error {
  function formatQuestions (line 347) | func formatQuestions(questions []dns.Question) string {

FILE: challenge/dns01/nameserver_test.go
  function Test_lookupNameserversOK (line 14) | func Test_lookupNameserversOK(t *testing.T) {
  function Test_lookupNameserversErr (line 81) | func Test_lookupNameserversErr(t *testing.T) {
  type lookupSoaByFqdnTestCase (line 124) | type lookupSoaByFqdnTestCase struct
  function lookupSoaByFqdnTestCases (line 133) | func lookupSoaByFqdnTestCases(t *testing.T) []lookupSoaByFqdnTestCase {
  function TestFindZoneByFqdnCustom (line 237) | func TestFindZoneByFqdnCustom(t *testing.T) {
  function TestFindPrimaryNsByFqdnCustom (line 254) | func TestFindPrimaryNsByFqdnCustom(t *testing.T) {
  function Test_getNameservers_ResolveConfServers (line 271) | func Test_getNameservers_ResolveConfServers(t *testing.T) {
  function TestDNSError_Error (line 301) | func TestDNSError_Error(t *testing.T) {

FILE: challenge/dns01/precheck.go
  type PreCheckFunc (line 17) | type PreCheckFunc
  type WrapPreCheckFunc (line 21) | type WrapPreCheckFunc
  function WrapPreCheck (line 24) | func WrapPreCheck(wrap WrapPreCheckFunc) ChallengeOption {
  function DisableCompletePropagationRequirement (line 34) | func DisableCompletePropagationRequirement() ChallengeOption {
  function DisableAuthoritativeNssPropagationRequirement (line 38) | func DisableAuthoritativeNssPropagationRequirement() ChallengeOption {
  function RecursiveNSsPropagationRequirement (line 45) | func RecursiveNSsPropagationRequirement() ChallengeOption {
  function PropagationWait (line 52) | func PropagationWait(wait time.Duration, skipCheck bool) ChallengeOption {
  type preCheck (line 64) | type preCheck struct
    method call (line 81) | func (p preCheck) call(domain, fqdn, value string) (bool, error) {
    method checkDNSPropagation (line 90) | func (p preCheck) checkDNSPropagation(fqdn, value string) (bool, error) {
  function newPreCheck (line 75) | func newPreCheck() preCheck {
  function checkNameserversPropagation (line 126) | func checkNameserversPropagation(fqdn, value string, nameservers []strin...

FILE: challenge/dns01/precheck_test.go
  function Test_preCheck_checkDNSPropagation (line 12) | func Test_preCheck_checkDNSPropagation(t *testing.T) {
  function Test_checkNameserversPropagation_authoritativeNss (line 82) | func Test_checkNameserversPropagation_authoritativeNss(t *testing.T) {

FILE: challenge/http01/domain_matcher.go
  type domainMatcher (line 41) | type domainMatcher interface
  type hostMatcher (line 51) | type hostMatcher struct
    method name (line 53) | func (m *hostMatcher) name() string {
    method matches (line 57) | func (m *hostMatcher) matches(r *http.Request, domain string) bool {
  type arbitraryMatcher (line 62) | type arbitraryMatcher
    method name (line 64) | func (m arbitraryMatcher) name() string {
    method matches (line 68) | func (m arbitraryMatcher) matches(r *http.Request, domain string) bool {
  type forwardedMatcher (line 74) | type forwardedMatcher struct
    method name (line 76) | func (m *forwardedMatcher) name() string {
    method matches (line 80) | func (m *forwardedMatcher) matches(r *http.Request, domain string) bool {
  function parseForwardedHeader (line 96) | func parseForwardedHeader(s string) (elements []map[string]string, err e...
  function tchar (line 178) | func tchar(r rune) bool {
  function skipWS (line 185) | func skipWS(s string, i int) int {
  function isWS (line 193) | func isWS(r rune) bool {
  function matchDomain (line 197) | func matchDomain(src, domain string) bool {

FILE: challenge/http01/domain_matcher_test.go
  function Test_parseForwardedHeader (line 12) | func Test_parseForwardedHeader(t *testing.T) {
  function Test_hostMatcher_matches (line 89) | func Test_hostMatcher_matches(t *testing.T) {

FILE: challenge/http01/http_challenge.go
  type ValidateFunc (line 13) | type ValidateFunc
  type ChallengeOption (line 15) | type ChallengeOption
  function SetDelay (line 18) | func SetDelay(delay time.Duration) ChallengeOption {
  function ChallengePath (line 26) | func ChallengePath(token string) string {
  type Challenge (line 30) | type Challenge struct
    method SetProvider (line 54) | func (c *Challenge) SetProvider(provider challenge.Provider) {
    method Solve (line 58) | func (c *Challenge) Solve(authz acme.Authorization) error {
  function NewChallenge (line 37) | func NewChallenge(core *api.Core, validate ValidateFunc, provider challe...

FILE: challenge/http01/http_challenge_server.go
  type ProviderServer (line 18) | type ProviderServer struct
    method Present (line 45) | func (s *ProviderServer) Present(domain, token, keyAuth string) error {
    method GetAddress (line 66) | func (s *ProviderServer) GetAddress() string {
    method CleanUp (line 71) | func (s *ProviderServer) CleanUp(domain, token, keyAuth string) error {
    method SetProxyHeader (line 95) | func (s *ProviderServer) SetProxyHeader(headerName string) {
    method serve (line 106) | func (s *ProviderServer) serve(domain, token, keyAuth string) {
  function NewProviderServer (line 32) | func NewProviderServer(iface, port string) *ProviderServer {
  function NewUnixProviderServer (line 40) | func NewUnixProviderServer(socketPath string, mode fs.FileMode) *Provide...

FILE: challenge/http01/http_challenge_test.go
  function TestProviderServer_GetAddress (line 26) | func TestProviderServer_GetAddress(t *testing.T) {
  function TestChallenge (line 69) | func TestChallenge(t *testing.T) {
  function TestChallengeUnix (line 122) | func TestChallengeUnix(t *testing.T) {
  function TestChallengeInvalidPort (line 192) | func TestChallengeInvalidPort(t *testing.T) {
  type testProxyHeader (line 220) | type testProxyHeader struct
    method update (line 225) | func (h *testProxyHeader) update(r *http.Request) {
  function TestChallengeWithProxy (line 237) | func TestChallengeWithProxy(t *testing.T) {
  function testServeWithProxy (line 374) | func testServeWithProxy(t *testing.T, header, extra *testProxyHeader, ex...

FILE: challenge/provider.go
  type Provider (line 9) | type Provider interface
  type ProviderTimeout (line 25) | type ProviderTimeout interface

FILE: challenge/resolver/errors.go
  type obtainError (line 12) | type obtainError
    method Error (line 14) | func (e obtainError) Error() string {
    method Unwrap (line 31) | func (e obtainError) Unwrap() []error {

FILE: challenge/resolver/errors_test.go
  function Test_obtainError_Error (line 12) | func Test_obtainError_Error(t *testing.T) {
  function Test_obtainError_Unwrap (line 26) | func Test_obtainError_Unwrap(t *testing.T) {

FILE: challenge/resolver/prober.go
  type solver (line 13) | type solver interface
  type preSolver (line 19) | type preSolver interface
  type cleanup (line 24) | type cleanup interface
  type sequential (line 28) | type sequential interface
  type selectedAuthSolver (line 33) | type selectedAuthSolver struct
  type Prober (line 38) | type Prober struct
    method Solve (line 50) | func (p *Prober) Solve(authorizations []acme.Authorization) error {
  function NewProber (line 42) | func NewProber(solverManager *SolverManager) *Prober {
  function sequentialSolve (line 100) | func sequentialSolve(authSolvers []*selectedAuthSolver, failures obtainE...
  function parallelSolve (line 159) | func parallelSolve(authSolvers []*selectedAuthSolver, failures obtainErr...
  function cleanUp (line 220) | func cleanUp(solvr solver, authz acme.Authorization) {

FILE: challenge/resolver/prober_mock_test.go
  type preSolverMock (line 11) | type preSolverMock struct
    method PreSolve (line 21) | func (s *preSolverMock) PreSolve(authorization acme.Authorization) err...
    method Solve (line 27) | func (s *preSolverMock) Solve(authorization acme.Authorization) error {
    method CleanUp (line 33) | func (s *preSolverMock) CleanUp(authorization acme.Authorization) error {
    method String (line 39) | func (s *preSolverMock) String() string {
  function createStubAuthorizationHTTP01 (line 43) | func createStubAuthorizationHTTP01(domain, status string) acme.Authoriza...
  function createStubAuthorizationDNS01 (line 50) | func createStubAuthorizationDNS01(domain string, wildcard bool) acme.Aut...
  function createStubAuthorization (line 68) | func createStubAuthorization(domain, status string, wildcard bool, chlgs...

FILE: challenge/resolver/prober_test.go
  function TestProber_Solve (line 14) | func TestProber_Solve(t *testing.T) {

FILE: challenge/resolver/solver_manager.go
  type byType (line 21) | type byType
    method Len (line 23) | func (a byType) Len() int           { return len(a) }
    method Swap (line 24) | func (a byType) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    method Less (line 25) | func (a byType) Less(i, j int) bool { return a[i].Type > a[j].Type }
  type SolverManager (line 27) | type SolverManager struct
    method SetHTTP01Provider (line 40) | func (c *SolverManager) SetHTTP01Provider(p challenge.Provider, opts ....
    method SetTLSALPN01Provider (line 46) | func (c *SolverManager) SetTLSALPN01Provider(p challenge.Provider, opt...
    method SetDNS01Provider (line 52) | func (c *SolverManager) SetDNS01Provider(p challenge.Provider, opts .....
    method Remove (line 58) | func (c *SolverManager) Remove(chlgType challenge.Type) {
    method chooseSolver (line 63) | func (c *SolverManager) chooseSolver(authz acme.Authorization) solver {
  function NewSolversManager (line 32) | func NewSolversManager(core *api.Core) *SolverManager {
  function validate (line 80) | func validate(core *api.Core, domain string, chlg acme.Challenge) error {
  function checkChallengeStatus (line 137) | func checkChallengeStatus(chlng acme.ExtendedChallenge) (bool, error) {
  function checkAuthorizationStatus (line 150) | func checkAuthorizationStatus(authz acme.Authorization) (bool, error) {

FILE: challenge/resolver/solver_manager_test.go
  function TestByType (line 21) | func TestByType(t *testing.T) {
  function TestValidate (line 35) | func TestValidate(t *testing.T) {
  function Test_checkChallengeStatus (line 132) | func Test_checkChallengeStatus(t *testing.T) {
  function Test_checkAuthorizationStatus (line 183) | func Test_checkAuthorizationStatus(t *testing.T) {
  function validateNoBody (line 256) | func validateNoBody(privateKey *rsa.PrivateKey, r *http.Request) error {

FILE: challenge/tlsalpn01/tls_alpn_challenge.go
  type ValidateFunc (line 23) | type ValidateFunc
  type ChallengeOption (line 25) | type ChallengeOption
  function SetDelay (line 28) | func SetDelay(delay time.Duration) ChallengeOption {
  type Challenge (line 35) | type Challenge struct
    method SetProvider (line 59) | func (c *Challenge) SetProvider(provider challenge.Provider) {
    method Solve (line 64) | func (c *Challenge) Solve(authz acme.Authorization) error {
  function NewChallenge (line 42) | func NewChallenge(core *api.Core, validate ValidateFunc, provider challe...
  function ChallengeBlocks (line 102) | func ChallengeBlocks(domain, keyAuth string) ([]byte, []byte, error) {
  function ChallengeCert (line 144) | func ChallengeCert(domain, keyAuth string) (*tls.Certificate, error) {

FILE: challenge/tlsalpn01/tls_alpn_challenge_server.go
  constant ACMETLS1Protocol (line 16) | ACMETLS1Protocol = "acme-tls/1"
  constant defaultTLSPort (line 20) | defaultTLSPort = "443"
  type ProviderServer (line 26) | type ProviderServer struct
    method GetAddress (line 39) | func (s *ProviderServer) GetAddress() string {
    method Present (line 45) | func (s *ProviderServer) Present(domain, token, keyAuth string) error {
    method CleanUp (line 85) | func (s *ProviderServer) CleanUp(domain, token, keyAuth string) error {
  function NewProviderServer (line 35) | func NewProviderServer(iface, port string) *ProviderServer {

FILE: challenge/tlsalpn01/tls_alpn_challenge_test.go
  function TestChallenge (line 22) | func TestChallenge(t *testing.T) {
  function TestChallengeInvalidPort (line 95) | func TestChallengeInvalidPort(t *testing.T) {
  function TestChallengeIPaddress (line 125) | func TestChallengeIPaddress(t *testing.T) {

FILE: cmd/account.go
  type Account (line 10) | type Account struct
    method GetEmail (line 19) | func (a *Account) GetEmail() string {
    method GetPrivateKey (line 24) | func (a *Account) GetPrivateKey() crypto.PrivateKey {
    method GetRegistration (line 29) | func (a *Account) GetRegistration() *registration.Resource {

FILE: cmd/accounts_storage.go
  constant userIDPlaceholder (line 19) | userIDPlaceholder = "noemail@example.com"
  constant baseAccountsRootFolderName (line 22) | baseAccountsRootFolderName = "accounts"
  constant baseKeysFolderName (line 23) | baseKeysFolderName         = "keys"
  constant accountFileName (line 24) | accountFileName            = "account.json"
  type AccountsStorage (line 60) | type AccountsStorage struct
    method ExistsAccountFilePath (line 101) | func (s *AccountsStorage) ExistsAccountFilePath() bool {
    method GetRootPath (line 112) | func (s *AccountsStorage) GetRootPath() string {
    method GetRootUserPath (line 116) | func (s *AccountsStorage) GetRootUserPath() string {
    method GetUserID (line 120) | func (s *AccountsStorage) GetUserID() string {
    method GetEmail (line 124) | func (s *AccountsStorage) GetEmail() string {
    method Save (line 128) | func (s *AccountsStorage) Save(account *Account) error {
    method LoadAccount (line 137) | func (s *AccountsStorage) LoadAccount(privateKey crypto.PrivateKey) *A...
    method GetPrivateKey (line 169) | func (s *AccountsStorage) GetPrivateKey(keyType certcrypto.KeyType) cr...
    method createKeysFolder (line 194) | func (s *AccountsStorage) createKeysFolder() {
  function NewAccountsStorage (line 71) | func NewAccountsStorage(ctx *cli.Context) *AccountsStorage {
  function generatePrivateKey (line 200) | func generatePrivateKey(file string, keyType certcrypto.KeyType) (crypto...
  function loadPrivateKey (line 222) | func loadPrivateKey(file string) (crypto.PrivateKey, error) {
  function tryRecoverRegistration (line 236) | func tryRecoverRegistration(ctx *cli.Context, privateKey crypto.PrivateK...

FILE: cmd/certs_storage.go
  constant baseCertificatesFolderName (line 25) | baseCertificatesFolderName = "certificates"
  constant baseArchivesFolderName (line 26) | baseArchivesFolderName     = "archives"
  constant issuerExt (line 30) | issuerExt   = ".issuer.crt"
  constant certExt (line 31) | certExt     = ".crt"
  constant keyExt (line 32) | keyExt      = ".key"
  constant pemExt (line 33) | pemExt      = ".pem"
  constant pfxExt (line 34) | pfxExt      = ".pfx"
  constant resourceExt (line 35) | resourceExt = ".json"
  type CertificatesStorage (line 51) | type CertificatesStorage struct
    method CreateRootFolder (line 82) | func (s *CertificatesStorage) CreateRootFolder() {
    method CreateArchiveFolder (line 89) | func (s *CertificatesStorage) CreateArchiveFolder() {
    method GetRootPath (line 96) | func (s *CertificatesStorage) GetRootPath() string {
    method SaveResource (line 100) | func (s *CertificatesStorage) SaveResource(certRes *certificate.Resour...
    method ReadResource (line 139) | func (s *CertificatesStorage) ReadResource(domain string) certificate....
    method ExistsFile (line 153) | func (s *CertificatesStorage) ExistsFile(domain, extension string) bool {
    method ReadFile (line 165) | func (s *CertificatesStorage) ReadFile(domain, extension string) ([]by...
    method GetFileName (line 169) | func (s *CertificatesStorage) GetFileName(domain, extension string) st...
    method ReadCertificate (line 174) | func (s *CertificatesStorage) ReadCertificate(domain, extension string...
    method WriteFile (line 184) | func (s *CertificatesStorage) WriteFile(domain, extension string, data...
    method WriteCertificateFiles (line 197) | func (s *CertificatesStorage) WriteCertificateFiles(domain string, cer...
    method WritePFXFile (line 220) | func (s *CertificatesStorage) WritePFXFile(domain string, certRes *cer...
    method MoveToArchive (line 254) | func (s *CertificatesStorage) MoveToArchive(domain string) error {
  function NewCertificatesStorage (line 62) | func NewCertificatesStorage(ctx *cli.Context) *CertificatesStorage {
  function getCertificateChain (line 280) | func getCertificateChain(certRes *certificate.Resource) ([]*x509.Certifi...
  function getPFXEncoder (line 301) | func getPFXEncoder(pfxFormat string) (*pkcs12.Encoder, error) {
  function sanitizedDomain (line 319) | func sanitizedDomain(domain string) string {

FILE: cmd/certs_storage_test.go
  function TestCertificatesStorage_MoveToArchive (line 13) | func TestCertificatesStorage_MoveToArchive(t *testing.T) {
  function TestCertificatesStorage_MoveToArchive_noFileRelatedToDomain (line 41) | func TestCertificatesStorage_MoveToArchive_noFileRelatedToDomain(t *test...
  function TestCertificatesStorage_MoveToArchive_ambiguousDomain (line 68) | func TestCertificatesStorage_MoveToArchive_ambiguousDomain(t *testing.T) {
  function generateTestFiles (line 101) | func generateTestFiles(t *testing.T, dir, domain string) []string {

FILE: cmd/cmd.go
  function CreateCommands (line 6) | func CreateCommands() []*cli.Command {

FILE: cmd/cmd_before.go
  function Before (line 8) | func Before(ctx *cli.Context) error {

FILE: cmd/cmd_dnshelp.go
  constant flgCode (line 12) | flgCode = "code"
  function createDNSHelp (line 14) | func createDNSHelp() *cli.Command {
  function dnsHelp (line 29) | func dnsHelp(ctx *cli.Context) error {
  type errWriter (line 56) | type errWriter struct
    method writeln (line 61) | func (ew *errWriter) writeln(a ...any) {
    method writef (line 69) | func (ew *errWriter) writef(format string, a ...any) {

FILE: cmd/cmd_list.go
  constant flgAccounts (line 17) | flgAccounts = "accounts"
  constant flgNames (line 18) | flgNames    = "names"
  function createList (line 21) | func createList() *cli.Command {
  function list (line 47) | func list(ctx *cli.Context) error {
  function listCertificates (line 57) | func listCertificates(ctx *cli.Context) error {
  function listAccount (line 118) | func listAccount(ctx *cli.Context) error {
  function formatIPAddresses (line 160) | func formatIPAddresses(ipAddresses []net.IP) string {

FILE: cmd/cmd_renew.go
  constant flgRenewDays (line 23) | flgRenewDays              = "days"
  constant flgRenewDynamic (line 24) | flgRenewDynamic           = "dynamic"
  constant flgARIDisable (line 25) | flgARIDisable             = "ari-disable"
  constant flgARIWaitToRenewDuration (line 26) | flgARIWaitToRenewDuration = "ari-wait-to-renew-duration"
  constant flgReuseKey (line 27) | flgReuseKey               = "reuse-key"
  constant flgRenewHook (line 28) | flgRenewHook              = "renew-hook"
  constant flgRenewHookTimeout (line 29) | flgRenewHookTimeout       = "renew-hook-timeout"
  constant flgNoRandomSleep (line 30) | flgNoRandomSleep          = "no-random-sleep"
  constant flgForceCertDomains (line 31) | flgForceCertDomains       = "force-cert-domains"
  function createRenew (line 34) | func createRenew() *cli.Command {
  function renew (line 136) | func renew(ctx *cli.Context) error {
  function renewForDomains (line 160) | func renewForDomains(ctx *cli.Context, account *Account, keyType certcry...
  function renewForCSR (line 280) | func renewForCSR(ctx *cli.Context, account *Account, keyType certcrypto....
  function needRenewal (line 366) | func needRenewal(x509Cert *x509.Certificate, domain string, days int, dy...
  function needRenewalDynamic (line 390) | func needRenewalDynamic(x509Cert *x509.Certificate, domain string, now t...
  function getARIRenewalTime (line 411) | func getARIRenewalTime(ctx *cli.Context, cert *x509.Certificate, domain ...
  function merge (line 446) | func merge(prevDomains, nextDomains []string) []string {

FILE: cmd/cmd_renew_test.go
  function Test_merge (line 11) | func Test_merge(t *testing.T) {
  function Test_needRenewal (line 60) | func Test_needRenewal(t *testing.T) {
  function Test_needRenewalDynamic (line 118) | func Test_needRenewalDynamic(t *testing.T) {

FILE: cmd/cmd_revoke.go
  constant flgKeep (line 11) | flgKeep   = "keep"
  constant flgReason (line 12) | flgReason = "reason"
  function createRevoke (line 15) | func createRevoke() *cli.Command {
  function revoke (line 40) | func revoke(ctx *cli.Context) error {

FILE: cmd/cmd_run.go
  constant flgNoBundle (line 19) | flgNoBundle                       = "no-bundle"
  constant flgMustStaple (line 20) | flgMustStaple                     = "must-staple"
  constant flgNotBefore (line 21) | flgNotBefore                      = "not-before"
  constant flgNotAfter (line 22) | flgNotAfter                       = "not-after"
  constant flgPrivateKey (line 23) | flgPrivateKey                     = "private-key"
  constant flgPreferredChain (line 24) | flgPreferredChain                 = "preferred-chain"
  constant flgProfile (line 25) | flgProfile                        = "profile"
  constant flgAlwaysDeactivateAuthorizations (line 26) | flgAlwaysDeactivateAuthorizations = "always-deactivate-authorizations"
  constant flgRunHook (line 27) | flgRunHook                        = "run-hook"
  constant flgRunHookTimeout (line 28) | flgRunHookTimeout                 = "run-hook-timeout"
  function createRun (line 31) | func createRun() *cli.Command {
  constant rootPathWarningMessage (line 101) | rootPathWarningMessage = `!!!! HEADS UP !!!!
  function run (line 112) | func run(ctx *cli.Context) error {
  function handleTOS (line 154) | func handleTOS(ctx *cli.Context, client *lego.Client) bool {
  function register (line 184) | func register(ctx *cli.Context, client *lego.Client) (*registration.Reso...
  function obtainCertificate (line 208) | func obtainCertificate(ctx *cli.Context, client *lego.Client) (*certific...

FILE: cmd/flags.go
  constant flgDomains (line 15) | flgDomains                  = "domains"
  constant flgServer (line 16) | flgServer                   = "server"
  constant flgAcceptTOS (line 17) | flgAcceptTOS                = "accept-tos"
  constant flgEmail (line 18) | flgEmail                    = "email"
  constant flgDisableCommonName (line 19) | flgDisableCommonName        = "disable-cn"
  constant flgCSR (line 20) | flgCSR                      = "csr"
  constant flgEAB (line 21) | flgEAB                      = "eab"
  constant flgKID (line 22) | flgKID                      = "kid"
  constant flgHMAC (line 23) | flgHMAC                     = "hmac"
  constant flgKeyType (line 24) | flgKeyType                  = "key-type"
  constant flgFilename (line 25) | flgFilename                 = "filename"
  constant flgPath (line 26) | flgPath                     = "path"
  constant flgHTTP (line 27) | flgHTTP                     = "http"
  constant flgHTTPPort (line 28) | flgHTTPPort                 = "http.port"
  constant flgHTTPDelay (line 29) | flgHTTPDelay                = "http.delay"
  constant flgHTTPProxyHeader (line 30) | flgHTTPProxyHeader          = "http.proxy-header"
  constant flgHTTPWebroot (line 31) | flgHTTPWebroot              = "http.webroot"
  constant flgHTTPMemcachedHost (line 32) | flgHTTPMemcachedHost        = "http.memcached-host"
  constant flgHTTPS3Bucket (line 33) | flgHTTPS3Bucket             = "http.s3-bucket"
  constant flgTLS (line 34) | flgTLS                      = "tls"
  constant flgTLSPort (line 35) | flgTLSPort                  = "tls.port"
  constant flgTLSDelay (line 36) | flgTLSDelay                 = "tls.delay"
  constant flgDNS (line 37) | flgDNS                      = "dns"
  constant flgDNSDisableCP (line 38) | flgDNSDisableCP             = "dns.disable-cp"
  constant flgDNSPropagationWait (line 39) | flgDNSPropagationWait       = "dns.propagation-wait"
  constant flgDNSPropagationDisableANS (line 40) | flgDNSPropagationDisableANS = "dns.propagation-disable-ans"
  constant flgDNSPropagationRNS (line 41) | flgDNSPropagationRNS        = "dns.propagation-rns"
  constant flgDNSResolvers (line 42) | flgDNSResolvers             = "dns.resolvers"
  constant flgHTTPTimeout (line 43) | flgHTTPTimeout              = "http-timeout"
  constant flgTLSSkipVerify (line 44) | flgTLSSkipVerify            = "tls-skip-verify"
  constant flgDNSTimeout (line 45) | flgDNSTimeout               = "dns-timeout"
  constant flgPEM (line 46) | flgPEM                      = "pem"
  constant flgPFX (line 47) | flgPFX                      = "pfx"
  constant flgPFXPass (line 48) | flgPFXPass                  = "pfx.pass"
  constant flgPFXFormat (line 49) | flgPFXFormat                = "pfx.format"
  constant flgCertTimeout (line 50) | flgCertTimeout              = "cert.timeout"
  constant flgOverallRequestLimit (line 51) | flgOverallRequestLimit      = "overall-request-limit"
  constant flgUserAgent (line 52) | flgUserAgent                = "user-agent"
  constant envEAB (line 56) | envEAB         = "LEGO_EAB"
  constant envEABHMAC (line 57) | envEABHMAC     = "LEGO_EAB_HMAC"
  constant envEABKID (line 58) | envEABKID      = "LEGO_EAB_KID"
  constant envEmail (line 59) | envEmail       = "LEGO_EMAIL"
  constant envPath (line 60) | envPath        = "LEGO_PATH"
  constant envPFX (line 61) | envPFX         = "LEGO_PFX"
  constant envPFXFormat (line 62) | envPFXFormat   = "LEGO_PFX_FORMAT"
  constant envPFXPassword (line 63) | envPFXPassword = "LEGO_PFX_PASSWORD"
  constant envServer (line 64) | envServer      = "LEGO_SERVER"
  function CreateFlags (line 67) | func CreateFlags(defaultPath string) []cli.Flag {
  function getTime (line 256) | func getTime(ctx *cli.Context, name string) time.Time {

FILE: cmd/hook.go
  constant hookEnvAccountEmail (line 17) | hookEnvAccountEmail      = "LEGO_ACCOUNT_EMAIL"
  constant hookEnvCertDomain (line 18) | hookEnvCertDomain        = "LEGO_CERT_DOMAIN"
  constant hookEnvCertPath (line 19) | hookEnvCertPath          = "LEGO_CERT_PATH"
  constant hookEnvCertKeyPath (line 20) | hookEnvCertKeyPath       = "LEGO_CERT_KEY_PATH"
  constant hookEnvIssuerCertKeyPath (line 21) | hookEnvIssuerCertKeyPath = "LEGO_ISSUER_CERT_PATH"
  constant hookEnvCertPEMPath (line 22) | hookEnvCertPEMPath       = "LEGO_CERT_PEM_PATH"
  constant hookEnvCertPFXPath (line 23) | hookEnvCertPFXPath       = "LEGO_CERT_PFX_PATH"
  function launchHook (line 26) | func launchHook(hook string, timeout time.Duration, meta map[string]stri...
  function metaToEnv (line 78) | func metaToEnv(meta map[string]string) []string {
  function addPathToMetadata (line 88) | func addPathToMetadata(meta map[string]string, domain string, certRes *c...

FILE: cmd/hook_test.go
  function Test_launchHook (line 11) | func Test_launchHook(t *testing.T) {
  function Test_launchHook_errors (line 16) | func Test_launchHook_errors(t *testing.T) {

FILE: cmd/lego/main.go
  function main (line 16) | func main() {

FILE: cmd/lego/zz_gen_version.go
  constant defaultVersion (line 5) | defaultVersion = "v4.33.0+dev-detach"
  function getVersion (line 9) | func getVersion() string {

FILE: cmd/setup.go
  constant filePerm (line 24) | filePerm os.FileMode = 0o600
  function setupClient (line 27) | func setupClient(ctx *cli.Context, account *Account, keyType certcrypto....
  function setupAccount (line 35) | func setupAccount(ctx *cli.Context, accountsStorage *AccountsStorage) (*...
  function newClient (line 49) | func newClient(ctx *cli.Context, acc registration.User, keyType certcryp...
  function getKeyType (line 99) | func getKeyType(ctx *cli.Context) certcrypto.KeyType {
  function getUserAgent (line 121) | func getUserAgent(ctx *cli.Context) string {
  function createNonExistingFolder (line 125) | func createNonExistingFolder(path string) error {
  function readCSRFile (line 135) | func readCSRFile(filename string) (*x509.CertificateRequest, error) {
  function checkRetry (line 168) | func checkRetry(ctx context.Context, resp *http.Response, err error) (bo...

FILE: cmd/setup_challenges.go
  function setupChallenges (line 22) | func setupChallenges(ctx *cli.Context, client *lego.Client) {
  function setupHTTPProvider (line 50) | func setupHTTPProvider(ctx *cli.Context) challenge.Provider {
  function setupTLSProvider (line 103) | func setupTLSProvider(ctx *cli.Context) challenge.Provider {
  function setupDNS (line 125) | func setupDNS(ctx *cli.Context, client *lego.Client) error {
  function checkPropagationExclusiveOptions (line 165) | func checkPropagationExclusiveOptions(ctx *cli.Context) error {
  function isSetBool (line 181) | func isSetBool(ctx *cli.Context, name string) bool {

FILE: cmd/zz_gen_cmd_dnshelp.go
  function allDNSCodes (line 13) | func allDNSCodes() string {
  function displayDNSHelp (line 211) | func displayDNSHelp(w io.Writer, name string) error {

FILE: e2e/challenges_test.go
  constant testDomain1 (line 27) | testDomain1 = "acme.localhost"
  constant testDomain2 (line 28) | testDomain2 = "lego.localhost"
  constant testDomain3 (line 29) | testDomain3 = "acme.lego.localhost"
  constant testDomain4 (line 30) | testDomain4 = "légô.localhost"
  constant testEmail1 (line 34) | testEmail1 = "lego@example.com"
  constant testEmail2 (line 35) | testEmail2 = "acme@example.com"
  function TestMain (line 50) | func TestMain(m *testing.M) {
  function TestHelp (line 54) | func TestHelp(t *testing.T) {
  function TestChallengeHTTP_Run (line 64) | func TestChallengeHTTP_Run(t *testing.T) {
  function TestChallengeTLS_Run_Domains (line 80) | func TestChallengeTLS_Run_Domains(t *testing.T) {
  function TestChallengeTLS_Run_IP (line 96) | func TestChallengeTLS_Run_IP(t *testing.T) {
  function TestChallengeTLS_Run_CSR (line 112) | func TestChallengeTLS_Run_CSR(t *testing.T) {
  function TestChallengeTLS_Run_CSR_PEM (line 130) | func TestChallengeTLS_Run_CSR_PEM(t *testing.T) {
  function TestChallengeTLS_Run_Revoke (line 148) | func TestChallengeTLS_Run_Revoke(t *testing.T) {
  function TestChallengeTLS_Run_Revoke_Non_ASCII (line 177) | func TestChallengeTLS_Run_Revoke_Non_ASCII(t *testing.T) {
  function TestChallengeHTTP_Client_Obtain (line 205) | func TestChallengeHTTP_Client_Obtain(t *testing.T) {
  function TestChallengeHTTP_Client_Obtain_profile (line 245) | func TestChallengeHTTP_Client_Obtain_profile(t *testing.T) {
  function TestChallengeHTTP_Client_Obtain_emails_csr (line 286) | func TestChallengeHTTP_Client_Obtain_emails_csr(t *testing.T) {
  function TestChallengeHTTP_Client_Obtain_notBefore_notAfter (line 327) | func TestChallengeHTTP_Client_Obtain_notBefore_notAfter(t *testing.T) {
  function TestChallengeHTTP_Client_Registration_QueryRegistration (line 376) | func TestChallengeHTTP_Client_Registration_QueryRegistration(t *testing....
  function TestChallengeTLS_Client_Obtain (line 410) | func TestChallengeTLS_Client_Obtain(t *testing.T) {
  function TestChallengeTLS_Client_ObtainForCSR (line 455) | func TestChallengeTLS_Client_ObtainForCSR(t *testing.T) {
  function TestChallengeTLS_Client_ObtainForCSR_profile (line 497) | func TestChallengeTLS_Client_ObtainForCSR_profile(t *testing.T) {
  function TestRegistrar_UpdateAccount (line 540) | func TestRegistrar_UpdateAccount(t *testing.T) {
  type fakeUser (line 572) | type fakeUser struct
    method GetEmail (line 578) | func (f *fakeUser) GetEmail() string                        { return f...
    method GetRegistration (line 579) | func (f *fakeUser) GetRegistration() *registration.Resource { return f...
    method GetPrivateKey (line 580) | func (f *fakeUser) GetPrivateKey() crypto.PrivateKey        { return f...
  function createTestCSRFile (line 582) | func createTestCSRFile(t *testing.T, raw bool) string {
  function createTestCSR (line 614) | func createTestCSR(t *testing.T) []byte {

FILE: e2e/dnschallenge/dns_challenges_test.go
  constant testDomain1 (line 22) | testDomain1 = "légo.localhost"
  constant testDomain2 (line 23) | testDomain2 = "*.légo.localhost"
  function TestMain (line 43) | func TestMain(m *testing.M) {
  function TestDNSHelp (line 47) | func TestDNSHelp(t *testing.T) {
  function TestChallengeDNS_Run (line 57) | func TestChallengeDNS_Run(t *testing.T) {
  function TestChallengeDNS_Client_Obtain (line 74) | func TestChallengeDNS_Client_Obtain(t *testing.T) {
  function TestChallengeDNS_Client_Obtain_profile (line 131) | func TestChallengeDNS_Client_Obtain_profile(t *testing.T) {
  type fakeUser (line 189) | type fakeUser struct
    method GetEmail (line 195) | func (f *fakeUser) GetEmail() string                        { return f...
    method GetRegistration (line 196) | func (f *fakeUser) GetRegistration() *registration.Resource { return f...
    method GetPrivateKey (line 197) | func (f *fakeUser) GetPrivateKey() crypto.PrivateKey        { return f...

FILE: e2e/loader/loader.go
  constant cmdNamePebble (line 24) | cmdNamePebble   = "pebble"
  constant cmdNameChallSrv (line 25) | cmdNameChallSrv = "pebble-challtestsrv"
  type CmdOption (line 28) | type CmdOption struct
  type EnvLoader (line 35) | type EnvLoader struct
    method MainTest (line 42) | func (l *EnvLoader) MainTest(m *testing.M) int {
    method RunLegoCombinedOutput (line 98) | func (l *EnvLoader) RunLegoCombinedOutput(arg ...string) ([]byte, erro...
    method RunLego (line 107) | func (l *EnvLoader) RunLego(arg ...string) error {
    method launchPebble (line 138) | func (l *EnvLoader) launchPebble() func() {
    method cmdPebble (line 162) | func (l *EnvLoader) cmdPebble() (*exec.Cmd, *bytes.Buffer) {
    method launchChallSrv (line 203) | func (l *EnvLoader) launchChallSrv() func() {
    method cmdChallSrv (line 227) | func (l *EnvLoader) cmdChallSrv() (*exec.Cmd, *bytes.Buffer) {
  function pebbleHealthCheck (line 183) | func pebbleHealthCheck(options *CmdOption) {
  function buildLego (line 240) | func buildLego() (string, func(), error) {
  function getProjectRoot (line 284) | func getProjectRoot() (string, error) {
  function build (line 296) | func build(binary string) error {
  function goToolPath (line 313) | func goToolPath() (string, error) {
  function goTool (line 326) | func goTool() (string, error) {
  function CleanLegoFiles (line 350) | func CleanLegoFiles() {

FILE: internal/clihelp/generator.go
  constant outputFile (line 17) | outputFile = "../../docs/data/zz_cli_help.toml"
  constant baseTemplate (line 19) | baseTemplate = `# THIS FILE IS AUTO-GENERATED. PLEASE DO NOT EDIT.
  type commandHelp (line 30) | type commandHelp struct
  function main (line 35) | func main() {
  function generate (line 46) | func generate() error {
  function createStubApp (line 91) | func createStubApp() *cli.App {
  function run (line 102) | func run(app *cli.App, args []string) (h commandHelp, err error) {

FILE: internal/dns/descriptors/descriptors.go
  type Providers (line 10) | type Providers struct
  type Provider (line 14) | type Provider struct
  type Configuration (line 28) | type Configuration struct
  type Links (line 33) | type Links struct
  function GetProviderInformation (line 39) | func GetProviderInformation(root string) (*Providers, error) {
  function walker (line 50) | func walker(root string, prs *Providers) func(string, os.FileInfo, error...

FILE: internal/dns/docs/generator.go
  constant root (line 27) | root = "../../../"
  constant cliOutput (line 29) | cliOutput  = root + "cmd/zz_gen_cmd_dnshelp.go"
  constant docOutput (line 30) | docOutput  = root + "docs/content/dns"
  constant readmePath (line 31) | readmePath = root + "README.md"
  constant mdTemplate (line 35) | mdTemplate     = "templates/dns.md.tmpl"
  constant cliTemplate (line 36) | cliTemplate    = "templates/dns.go.tmpl"
  constant readmeTemplate (line 37) | readmeTemplate = "templates/readme.md.tmpl"
  constant startLine (line 41) | startLine = "<!-- START DNS PROVIDERS LIST -->"
  constant endLine (line 42) | endLine   = "<!-- END DNS PROVIDERS LIST -->"
  function main (line 45) | func main() {
  function cleanDocumentation (line 79) | func cleanDocumentation() error {
  function generateDocumentation (line 95) | func generateDocumentation(m descriptors.Provider) error {
  function generateCLIHelp (line 108) | func generateCLIHelp(models *descriptors.Providers) error {
  function generateReadMe (line 142) | func generateReadMe(models *descriptors.Providers) error {
  function orderProviders (line 192) | func orderProviders(models *descriptors.Providers) [][]descriptors.Provi...

FILE: internal/dns/providers/generator.go
  constant root (line 20) | root = "../../../"
  constant outputPath (line 22) | outputPath = "providers/dns/zz_gen_dns_providers.go"
  function main (line 28) | func main() {
  function generate (line 35) | func generate() error {

FILE: internal/releaser/generator.go
  constant dnsTemplate (line 14) | dnsTemplate   = "templates/dns.go.tmpl"
  constant dnsTargetFile (line 15) | dnsTargetFile = "./providers/dns/internal/useragent/useragent.go"
  constant senderTemplate (line 19) | senderTemplate   = "templates/sender.go.tmpl"
  constant senderTargetFile (line 20) | senderTargetFile = "./acme/api/internal/sender/useragent.go"
  constant versionTemplate (line 24) | versionTemplate   = "templates/version.go.tmpl"
  constant versionTargetFile (line 25) | versionTargetFile = "./cmd/lego/zz_gen_version.go"
  type Generator (line 31) | type Generator struct
    method Generate (line 40) | func (g *Generator) Generate(version, comment string) error {
  function NewGenerator (line 36) | func NewGenerator(templatePath, targetFile string) *Generator {
  function generate (line 69) | func generate(targetVersion, comment string) error {

FILE: internal/releaser/releaser.go
  constant flgMode (line 16) | flgMode = "mode"
  constant modePatch (line 19) | modePatch = "patch"
  constant modeMinor (line 20) | modeMinor = "minor"
  constant modeMajor (line 21) | modeMajor = "major"
  constant versionSourceFile (line 24) | versionSourceFile = "./cmd/lego/zz_gen_version.go"
  constant commentRelease (line 27) | commentRelease = "release"
  constant commentDetach (line 28) | commentDetach  = "detach"
  function main (line 31) | func main() {
  function release (line 72) | func release(ctx *cli.Context) error {
  function detach (line 93) | func detach(_ *cli.Context) error {
  function readCurrentVersion (line 109) | func readCurrentVersion(filename string) (*hcversion.Version, error) {
  type visitor (line 128) | type visitor struct
    method Visit (line 132) | func (v visitor) Visit(n ast.Node) ast.Visitor {
  function bumpVersion (line 174) | func bumpVersion(mode string, v *hcversion.Version) (string, error) {

FILE: lego/client.go
  type Client (line 14) | type Client struct
    method GetToSURL (line 75) | func (c *Client) GetToSURL() string {
    method GetExternalAccountRequired (line 80) | func (c *Client) GetExternalAccountRequired() bool {
  function NewClient (line 24) | func NewClient(config *Config) (*Client, error) {

FILE: lego/client_config.go
  constant caCertificatesEnvVar (line 24) | caCertificatesEnvVar = "LEGO_CA_CERTIFICATES"
  constant caSystemCertPool (line 28) | caSystemCertPool = "LEGO_CA_SYSTEM_CERT_POOL"
  constant caServerNameEnvVar (line 34) | caServerNameEnvVar = "LEGO_CA_SERVER_NAME"
  constant LEDirectoryProduction (line 37) | LEDirectoryProduction = "https://acme-v02.api.letsencrypt.org/directory"
  constant LEDirectoryStaging (line 40) | LEDirectoryStaging = "https://acme-staging-v02.api.letsencrypt.org/direc...
  type Config (line 43) | type Config struct
  function NewConfig (line 51) | func NewConfig(user registration.User) *Config {
  type CertificateConfig (line 63) | type CertificateConfig struct
  function createDefaultHTTPClient (line 73) | func createDefaultHTTPClient() *http.Client {
  function initCertPool (line 98) | func initCertPool() *x509.CertPool {
  function CreateCertPool (line 117) | func CreateCertPool(caCerts []string, useSystemCertPool bool) (*x509.Cer...
  function newCertPool (line 138) | func newCertPool(useSystemCertPool bool) *x509.CertPool {

FILE: lego/client_test.go
  function TestNewClient (line 15) | func TestNewClient(t *testing.T) {
  type mockUser (line 37) | type mockUser struct
    method GetEmail (line 43) | func (u mockUser) GetEmail() string                        { return u....
    method GetRegistration (line 44) | func (u mockUser) GetRegistration() *registration.Resource { return u....
    method GetPrivateKey (line 45) | func (u mockUser) GetPrivateKey() crypto.PrivateKey        { return u....

FILE: log/logger.go
  type StdLogger (line 12) | type StdLogger interface
  function Fatal (line 23) | func Fatal(args ...any) {
  function Fatalf (line 29) | func Fatalf(format string, args ...any) {
  function Print (line 35) | func Print(args ...any) {
  function Println (line 41) | func Println(args ...any) {
  function Printf (line 47) | func Printf(format string, args ...any) {
  function Warnf (line 52) | func Warnf(format string, args ...any) {
  function Infof (line 57) | func Infof(format string, args ...any) {

FILE: platform/config/env/env.go
  function Get (line 15) | func Get(names ...string) (map[string]string, error) {
  function GetWithFallback (line 59) | func GetWithFallback(groups ...[]string) (map[string]string, error) {
  function GetOneWithFallback (line 85) | func GetOneWithFallback[T any](main string, defaultValue T, fn func(stri...
  function getOneWithFallback (line 96) | func getOneWithFallback(main string, names ...string) (string, string) {
  function GetOrDefaultString (line 114) | func GetOrDefaultString(envVar, defaultValue string) string {
  function GetOrDefaultBool (line 120) | func GetOrDefaultBool(envVar string, defaultValue bool) bool {
  function GetOrDefaultInt (line 126) | func GetOrDefaultInt(envVar string, defaultValue int) int {
  function GetOrDefaultSecond (line 132) | func GetOrDefaultSecond(envVar string, defaultValue time.Duration) time....
  function getOrDefault (line 136) | func getOrDefault[T any](envVar string, defaultValue T, fn func(string) ...
  function GetOrFile (line 148) | func GetOrFile(envVar string) string {
  function ParseSecond (line 171) | func ParseSecond(s string) (time.Duration, error) {
  function ParseString (line 185) | func ParseString(s string) (string, error) {
  function ParsePairs (line 195) | func ParsePairs(raw string) (map[string]string, error) {

FILE: platform/config/env/env_test.go
  function TestGetWithFallback (line 12) | func TestGetWithFallback(t *testing.T) {
  function TestGetOneWithFallback (line 110) | func TestGetOneWithFallback(t *testing.T) {
  function TestGetOrDefaultInt (line 177) | func TestGetOrDefaultInt(t *testing.T) {
  function TestGetOrDefaultSecond (line 222) | func TestGetOrDefaultSecond(t *testing.T) {
  function TestGetOrDefaultString (line 267) | func TestGetOrDefaultString(t *testing.T) {
  function TestGetOrDefaultBool (line 299) | func TestGetOrDefaultBool(t *testing.T) {
  function TestGetOrFile_ReadsEnvVars (line 337) | func TestGetOrFile_ReadsEnvVars(t *testing.T) {
  function TestGetOrFile_ReadsFiles (line 345) | func TestGetOrFile_ReadsFiles(t *testing.T) {
  function TestGetOrFile_PrefersEnvVars (line 387) | func TestGetOrFile_PrefersEnvVars(t *testing.T) {
  function TestParsePairs (line 412) | func TestParsePairs(t *testing.T) {
  function TestParsePairs_error (line 457) | func TestParsePairs_error(t *testing.T) {

FILE: platform/tester/api.go
  function MockACMEServer (line 14) | func MockACMEServer() *servermock.Builder[*httptest.Server] {
  function WriteJSONResponse (line 38) | func WriteJSONResponse(w http.ResponseWriter, body any) error {

FILE: platform/tester/dnsmock/dnsmock.go
  constant noType (line 16) | noType uint16 = math.MaxUint16
  type Option (line 18) | type Option
  type Builder (line 20) | type Builder struct
    method Query (line 39) | func (b *Builder) Query(pattern string, handler dns.HandlerFunc) *Buil...
    method Update (line 48) | func (b *Builder) Update(pattern string, handler dns.HandlerFunc) *Bui...
    method route (line 57) | func (b *Builder) route(pattern string, op int, handler dns.HandlerFun...
    method Build (line 110) | func (b *Builder) Build(t *testing.T, options ...Option) net.Addr {
  function NewServer (line 27) | func NewServer() *Builder {

FILE: platform/tester/dnsmock/dnsmock_test.go
  function TestServer_Query_matchType (line 12) | func TestServer_Query_matchType(t *testing.T) {
  function TestServer_Query_noType (line 29) | func TestServer_Query_noType(t *testing.T) {
  function TestServer_Query_noMatch_domain (line 46) | func TestServer_Query_noMatch_domain(t *testing.T) {
  function TestServer_Query_noMatch_type (line 63) | func TestServer_Query_noMatch_type(t *testing.T) {
  function TestServer_Query_noMatch_opType (line 80) | func TestServer_Query_noMatch_opType(t *testing.T) {
  function TestServer_Query_unknownType (line 103) | func TestServer_Query_unknownType(t *testing.T) {
  function TestServer_Query_duplicate (line 111) | func TestServer_Query_duplicate(t *testing.T) {
  function TestServer_Query_duplicateGlobal (line 120) | func TestServer_Query_duplicateGlobal(t *testing.T) {
  function TestServer_Query_mixed (line 129) | func TestServer_Query_mixed(t *testing.T) {
  function TestServer_Query_invalidDomain (line 138) | func TestServer_Query_invalidDomain(t *testing.T) {
  function TestServer_Query_invalidPattern (line 146) | func TestServer_Query_invalidPattern(t *testing.T) {
  function TestServer_Update (line 154) | func TestServer_Update(t *testing.T) {
  function TestServer_Update_noMatch_domain (line 177) | func TestServer_Update_noMatch_domain(t *testing.T) {
  function TestServer_Update_noMatch_opType (line 200) | func TestServer_Update_noMatch_opType(t *testing.T) {
  function TestServer_Update_duplicate (line 217) | func TestServer_Update_duplicate(t *testing.T) {
  function TestServer_Update_invalidDomain (line 226) | func TestServer_Update_invalidDomain(t *testing.T) {
  function TestServer_Update_invalidPattern (line 234) | func TestServer_Update_invalidPattern(t *testing.T) {

FILE: platform/tester/dnsmock/handlers.go
  function DumpRequest (line 9) | func DumpRequest() dns.HandlerFunc {
  function SOA (line 17) | func SOA(name string) dns.HandlerFunc {
  function CNAME (line 44) | func CNAME(target string) dns.HandlerFunc {
  function Noop (line 55) | func Noop(w dns.ResponseWriter, req *dns.Msg) {
  function Error (line 59) | func Error(rcode int) dns.HandlerFunc {
  function Answer (line 65) | func Answer(answer ...dns.RR) func(w dns.ResponseWriter, req *dns.Msg) {

FILE: platform/tester/dnsmock/handlers_test.go
  function TestSOA_self (line 12) | func TestSOA_self(t *testing.T) {
  function TestSOA_differentDomain (line 40) | func TestSOA_differentDomain(t *testing.T) {
  function TestSOA_tld (line 70) | func TestSOA_tld(t *testing.T) {
  function TestCNAME (line 100) | func TestCNAME(t *testing.T) {
  function TestNoop (line 124) | func TestNoop(t *testing.T) {
  function TestError (line 141) | func TestError(t *testing.T) {

FILE: platform/tester/env.go
  type EnvTest (line 10) | type EnvTest struct
    method WithDomain (line 40) | func (e *EnvTest) WithDomain(key string) *EnvTest {
    method WithLiveTestRequirements (line 49) | func (e *EnvTest) WithLiveTestRequirements(keys ...string) *EnvTest {
    method WithLiveTestExtra (line 78) | func (e *EnvTest) WithLiveTestExtra(extra func() bool) *EnvTest {
    method GetDomain (line 84) | func (e *EnvTest) GetDomain() string {
    method IsLiveTest (line 89) | func (e *EnvTest) IsLiveTest() bool {
    method RestoreEnv (line 106) | func (e *EnvTest) RestoreEnv() {
    method ClearEnv (line 113) | func (e *EnvTest) ClearEnv() {
    method GetValue (line 120) | func (e *EnvTest) GetValue(key string) string {
    method liveTestExtra (line 124) | func (e *EnvTest) liveTestExtra() bool {
    method Apply (line 134) | func (e *EnvTest) Apply(envVars map[string]string) {
    method isManagedKey (line 148) | func (e *EnvTest) isManagedKey(varName string) bool {
  function NewEnvTest (line 22) | func NewEnvTest(keys ...string) *EnvTest {

FILE: platform/tester/env_test.go
  constant envNamespace (line 13) | envNamespace = "LEGO_TEST_"
  constant envVar01 (line 14) | envVar01     = envNamespace + "01"
  constant envVar02 (line 15) | envVar02     = envNamespace + "02"
  constant envVarDomain (line 16) | envVarDomain = envNamespace + "DOMAIN"
  function TestMain (line 19) | func TestMain(m *testing.M) {
  function applyEnv (line 26) | func applyEnv(envVars map[string]string) {
  function clearEnv (line 36) | func clearEnv() {
  function TestEnvTest (line 47) | func TestEnvTest(t *testing.T) {
  function TestEnvTest_RestoreEnv (line 340) | func TestEnvTest_RestoreEnv(t *testing.T) {
  function TestEnvTest_ClearEnv (line 354) | func TestEnvTest_ClearEnv(t *testing.T) {

FILE: platform/tester/servermock/builder.go
  type Link (line 13) | type Link interface
  type LinkFunc (line 18) | type LinkFunc
    method Bind (line 20) | func (f LinkFunc) Bind(next http.Handler) http.Handler {
  type ClientBuilder (line 25) | type ClientBuilder
  type Builder (line 29) | type Builder struct
  function NewBuilder (line 36) | func NewBuilder[T any](clientBuilder ClientBuilder[T], chain ...Link) *B...
  method Route (line 44) | func (b *Builder[T]) Route(pattern string, handler http.Handler, chain ....
  method Build (line 62) | func (b *Builder[T]) Build(t *testing.T) T {
  method BuildHTTPS (line 74) | func (b *Builder[T]) BuildHTTPS(t *testing.T) T {

FILE: platform/tester/servermock/handler_dump.go
  function DumpRequest (line 10) | func DumpRequest() http.HandlerFunc {

FILE: platform/tester/servermock/handler_file.go
  type ResponseFromFileHandler (line 12) | type ResponseFromFileHandler struct
    method ServeHTTP (line 37) | func (h *ResponseFromFileHandler) ServeHTTP(rw http.ResponseWriter, _ ...
    method WithStatusCode (line 70) | func (h *ResponseFromFileHandler) WithStatusCode(status int) *Response...
    method WithHeader (line 78) | func (h *ResponseFromFileHandler) WithHeader(name, value string, value...
  function ResponseFromFile (line 19) | func ResponseFromFile(filename string) *ResponseFromFileHandler {
  function ResponseFromFixture (line 28) | func ResponseFromFixture(filename string) *ResponseFromFileHandler {
  function ResponseFromInternal (line 33) | func ResponseFromInternal(filename string) *ResponseFromFileHandler {

FILE: platform/tester/servermock/handler_json.go
  type JSONEncodeHandler (line 9) | type JSONEncodeHandler struct
    method ServeHTTP (line 21) | func (h *JSONEncodeHandler) ServeHTTP(rw http.ResponseWriter, _ *http....
    method WithStatusCode (line 33) | func (h *JSONEncodeHandler) WithStatusCode(status int) *JSONEncodeHand...
  function JSONEncode (line 14) | func JSONEncode(data any) *JSONEncodeHandler {

FILE: platform/tester/servermock/handler_noop.go
  type NoopHandler (line 9) | type NoopHandler struct
    method ServeHTTP (line 21) | func (h *NoopHandler) ServeHTTP(rw http.ResponseWriter, req *http.Requ...
    method WithStatusCode (line 31) | func (h *NoopHandler) WithStatusCode(status int) *NoopHandler {
    method WithHeader (line 39) | func (h *NoopHandler) WithHeader(name, value string, values ...string)...
  function Noop (line 14) | func Noop() *NoopHandler {

FILE: platform/tester/servermock/handler_raw.go
  type RawResponseHandler (line 9) | type RawResponseHandler struct
    method ServeHTTP (line 27) | func (h *RawResponseHandler) ServeHTTP(rw http.ResponseWriter, _ *http...
    method WithStatusCode (line 47) | func (h *RawResponseHandler) WithStatusCode(status int) *RawResponseHa...
    method WithHeader (line 55) | func (h *RawResponseHandler) WithHeader(name, value string, values ......
  function RawResponse (line 15) | func RawResponse(data []byte) *RawResponseHandler {
  function RawStringResponse (line 23) | func RawStringResponse(data string) *RawResponseHandler {

FILE: platform/tester/servermock/link_form.go
  type FormLink (line 13) | type FormLink struct
    method Bind (line 29) | func (l *FormLink) Bind(next http.Handler) http.Handler {
    method Strict (line 75) | func (l *FormLink) Strict() *FormLink {
    method UsePostForm (line 81) | func (l *FormLink) UsePostForm() *FormLink {
    method With (line 87) | func (l *FormLink) With(name, value string) *FormLink {
    method WithRegexp (line 93) | func (l *FormLink) WithRegexp(name, exp string) *FormLink {
  function CheckForm (line 21) | func CheckForm() *FormLink {

FILE: platform/tester/servermock/link_headers.go
  constant authorizationHeader (line 11) | authorizationHeader = "Authorization"
  constant contentTypeHeader (line 12) | contentTypeHeader   = "Content-Type"
  constant acceptHeader (line 13) | acceptHeader        = "Accept"
  constant applicationJSONMimeType (line 17) | applicationJSONMimeType = "application/json"
  constant applicationFormMimeType (line 18) | applicationFormMimeType = "application/x-www-form-urlencoded"
  type basicAuth (line 21) | type basicAuth struct
  type HeaderLink (line 26) | type HeaderLink struct
    method Bind (line 42) | func (l *HeaderLink) Bind(next http.Handler) http.Handler {
    method With (line 75) | func (l *HeaderLink) With(name, value string, values ...string) *Heade...
    method WithRegexp (line 83) | func (l *HeaderLink) WithRegexp(name, exp string) *HeaderLink {
    method WithJSONHeaders (line 89) | func (l *HeaderLink) WithJSONHeaders() *HeaderLink {
    method WithContentTypeFromURLEncoded (line 95) | func (l *HeaderLink) WithContentTypeFromURLEncoded() *HeaderLink {
    method WithContentType (line 101) | func (l *HeaderLink) WithContentType(value string) *HeaderLink {
    method WithAccept (line 107) | func (l *HeaderLink) WithAccept(value string) *HeaderLink {
    method WithAuthorization (line 113) | func (l *HeaderLink) WithAuthorization(value string) *HeaderLink {
    method WithStatusCode (line 119) | func (l *HeaderLink) WithStatusCode(status int) *HeaderLink {
    method WithBasicAuth (line 127) | func (l *HeaderLink) WithBasicAuth(username, password string) *HeaderL...
    method checkBasicAuth (line 133) | func (l *HeaderLink) checkBasicAuth(rw http.ResponseWriter, req *http....
    method checkJSONHeaders (line 152) | func (l *HeaderLink) checkJSONHeaders(rw http.ResponseWriter, req *htt...
  function CheckHeader (line 34) | func CheckHeader() *HeaderLink {
  function checkHeader (line 172) | func checkHeader(req *http.Request, k string, v []string) error {

FILE: platform/tester/servermock/link_query.go
  type QueryParameterLink (line 12) | type QueryParameterLink struct
    method Bind (line 27) | func (l *QueryParameterLink) Bind(next http.Handler) http.Handler {
    method Strict (line 64) | func (l *QueryParameterLink) Strict() *QueryParameterLink {
    method With (line 70) | func (l *QueryParameterLink) With(name, value string) *QueryParameterL...
    method WithRegexp (line 76) | func (l *QueryParameterLink) WithRegexp(name, exp string) *QueryParame...
    method WithValues (line 82) | func (l *QueryParameterLink) WithValues(values url.Values) *QueryParam...
    method WithStatusCode (line 94) | func (l *QueryParameterLink) WithStatusCode(status int) *QueryParamete...
  function CheckQueryParameter (line 19) | func CheckQueryParameter() *QueryParameterLink {

FILE: platform/tester/servermock/link_request_body.go
  type RequestBodyLink (line 14) | type RequestBodyLink struct
    method Bind (line 40) | func (l *RequestBodyLink) Bind(next http.Handler) http.Handler {
    method IgnoreWhitespace (line 87) | func (l *RequestBodyLink) IgnoreWhitespace() *RequestBodyLink {
  function CheckRequestBody (line 21) | func CheckRequestBody(body string) *RequestBodyLink {
  function CheckRequestBodyFromFile (line 26) | func CheckRequestBodyFromFile(filename string) *RequestBodyLink {
  function CheckRequestBodyFromFixture (line 31) | func CheckRequestBodyFromFixture(filename string) *RequestBodyLink {
  function CheckRequestBodyFromInternal (line 36) | func CheckRequestBodyFromInternal(filename string) *RequestBodyLink {
  function trimLineSpace (line 93) | func trimLineSpace(body []byte) []byte {

FILE: platform/tester/servermock/link_request_body_json.go
  type RequestBodyJSONLink (line 16) | type RequestBodyJSONLink struct
    method Bind (line 49) | func (l *RequestBodyJSONLink) Bind(next http.Handler) http.Handler {
  function CheckRequestJSONBody (line 23) | func CheckRequestJSONBody(body string) *RequestBodyJSONLink {
  function CheckRequestJSONBodyFromStruct (line 28) | func CheckRequestJSONBodyFromStruct(data any) *RequestBodyJSONLink {
  function CheckRequestJSONBodyFromFile (line 33) | func CheckRequestJSONBodyFromFile(filename string) *RequestBodyJSONLink {
  function CheckRequestJSONBodyFromFixture (line 40) | func CheckRequestJSONBodyFromFixture(filename string) *RequestBodyJSONLi...
  function CheckRequestJSONBodyFromInternal (line 45) | func CheckRequestJSONBodyFromInternal(filename string) *RequestBodyJSONL...

FILE: platform/wait/wait.go
  function For (line 13) | func For(msg string, timeout, interval time.Duration, f func() (bool, er...
  function Retry (line 46) | func Retry(ctx context.Context, operation func() error, opts ...backoff....

FILE: platform/wait/wait_test.go
  function TestFor_timeout (line 14) | func TestFor_timeout(t *testing.T) {
  function TestFor_timeout_with_error (line 43) | func TestFor_timeout_with_error(t *testing.T) {
  function TestFor_stop (line 73) | func TestFor_stop(t *testing.T) {
  function TestFor_stop_with_error (line 98) | func TestFor_stop_with_error(t *testing.T) {

FILE: providers/dns/acmedns/acmedns.go
  constant envNamespace (line 21) | envNamespace = "ACME_DNS_"
  constant EnvAPIBase (line 25) | EnvAPIBase = envNamespace + "API_BASE"
  constant EnvAllowList (line 29) | EnvAllowList = envNamespace + "ALLOWLIST"
  constant EnvStoragePath (line 33) | EnvStoragePath = envNamespace + "STORAGE_PATH"
  constant EnvStorageBaseURL (line 37) | EnvStorageBaseURL = envNamespace + "STORAGE_BASE_URL"
  type Config (line 43) | type Config struct
  function NewDefaultConfig (line 51) | func NewDefaultConfig() *Config {
  type acmeDNSClient (line 57) | type acmeDNSClient interface
  type DNSProvider (line 67) | type DNSProvider struct
    method Present (line 167) | func (d *DNSProvider) Present(domain, _, keyAuth string) error {
    method CleanUp (line 194) | func (d *DNSProvider) CleanUp(_, _, _ string) error {
    method register (line 204) | func (d *DNSProvider) register(ctx context.Context, domain, fqdn strin...
  function NewDNSProvider (line 74) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 94) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function NewDNSProviderClient (line 119) | func NewDNSProviderClient(client acmeDNSClient, store goacmedns.Storage)...
  type ErrCNAMERequired (line 139) | type ErrCNAMERequired struct
    method Error (line 152) | func (e ErrCNAMERequired) Error() string {
  function getStorage (line 240) | func getStorage(config *Config) (goacmedns.Storage, error) {

FILE: providers/dns/acmedns/acmedns_test.go
  constant egDomain (line 15) | egDomain  = "example.com"
  constant egFQDN (line 16) | egFQDN    = "_acme-challenge." + egDomain + "."
  constant egKeyAuth (line 17) | egKeyAuth = "⚷"
  function TestPresent (line 20) | func TestPresent(t *testing.T) {
  function TestRegister (line 89) | func TestRegister(t *testing.T) {
  function TestPresent_httpStorage (line 147) | func TestPresent_httpStorage(t *testing.T) {
  function TestRegister_httpStorage (line 199) | func TestRegister_httpStorage(t *testing.T) {

FILE: providers/dns/acmedns/internal/http_storage.go
  type HTTPStorage (line 24) | type HTTPStorage struct
    method Save (line 42) | func (s *HTTPStorage) Save(_ context.Context) error {
    method Put (line 46) | func (s *HTTPStorage) Put(ctx context.Context, domain string, account ...
    method Fetch (line 55) | func (s *HTTPStorage) Fetch(ctx context.Context, domain string) (goacm...
    method FetchAll (line 71) | func (s *HTTPStorage) FetchAll(ctx context.Context) (map[string]goacme...
    method do (line 87) | func (s *HTTPStorage) do(req *http.Request, result any) error {
  function NewHTTPStorage (line 30) | func NewHTTPStorage(baseURL string) (*HTTPStorage, error) {
  function newJSONRequest (line 125) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...

FILE: providers/dns/acmedns/internal/http_storage_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*HTTPStorage] {
  function TestHTTPStorage_Fetch (line 29) | func TestHTTPStorage_Fetch(t *testing.T) {
  function TestHTTPStorage_Fetch_error (line 48) | func TestHTTPStorage_Fetch_error(t *testing.T) {
  function TestHTTPStorage_FetchAll (line 59) | func TestHTTPStorage_FetchAll(t *testing.T) {
  function TestHTTPStorage_FetchAll_error (line 87) | func TestHTTPStorage_FetchAll_error(t *testing.T) {
  function TestHTTPStorage_Put (line 98) | func TestHTTPStorage_Put(t *testing.T) {
  function TestHTTPStorage_Put_error (line 116) | func TestHTTPStorage_Put_error(t *testing.T) {
  function TestHTTPStorage_Put_CNAME_created (line 135) | func TestHTTPStorage_Put_CNAME_created(t *testing.T) {

FILE: providers/dns/acmedns/mock_test.go
  type mockClient (line 25) | type mockClient struct
    method UpdateTXTRecord (line 47) | func (c *mockClient) UpdateTXTRecord(ctx context.Context, acct goacmed...
    method RegisterAccount (line 54) | func (c *mockClient) RegisterAccount(ctx context.Context, allowFrom []...
    method WithUpdateTXTRecordError (line 59) | func (c *mockClient) WithUpdateTXTRecordError(err error) *mockClient {
    method WithRegisterAccount (line 67) | func (c *mockClient) WithRegisterAccount(acct goacmedns.Account) *mock...
    method WithRegisterAccountError (line 75) | func (c *mockClient) WithRegisterAccountError(err error) *mockClient {
  function newMockClient (line 35) | func newMockClient() *mockClient {
  type mockStorage (line 83) | type mockStorage struct
    method FetchAll (line 117) | func (m *mockStorage) FetchAll(ctx context.Context) (map[string]goacme...
    method Fetch (line 121) | func (m *mockStorage) Fetch(ctx context.Context, domain string) (goacm...
    method Put (line 125) | func (m *mockStorage) Put(ctx context.Context, domain string, account ...
    method Save (line 129) | func (m *mockStorage) Save(ctx context.Context) error {
    method WithAccount (line 133) | func (m *mockStorage) WithAccount(domain string, acct goacmedns.Accoun...
    method WithFetchError (line 139) | func (m *mockStorage) WithFetchError(err error) *mockStorage {
    method WithPutError (line 147) | func (m *mockStorage) WithPutError(err error) *mockStorage {
    method WithSaveError (line 155) | func (m *mockStorage) WithSaveError(err error) *mockStorage {
  function newMockStorage (line 91) | func newMockStorage() *mockStorage {

FILE: providers/dns/active24/active24.go
  constant baseAPIDomain (line 16) | baseAPIDomain = "active24.cz"
  constant envNamespace (line 20) | envNamespace = "ACTIVE24_"
  constant EnvAPIKey (line 22) | EnvAPIKey = envNamespace + "API_KEY"
  constant EnvSecret (line 23) | EnvSecret = envNamespace + "SECRET"
  constant EnvTTL (line 25) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 27) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 28) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  function NewDefaultConfig (line 35) | func NewDefaultConfig() *Config {
  type DNSProvider (line 47) | type DNSProvider struct
    method Present (line 80) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 90) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 101) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 52) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 66) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/active24/active24_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 71) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 120) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 134) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/alidns/alidns.go
  constant envNamespace (line 23) | envNamespace = "ALICLOUD_"
  constant EnvRAMRole (line 25) | EnvRAMRole       = envNamespace + "RAM_ROLE"
  constant EnvAccessKey (line 26) | EnvAccessKey     = envNamespace + "ACCESS_KEY"
  constant EnvSecretKey (line 27) | EnvSecretKey     = envNamespace + "SECRET_KEY"
  constant EnvSecurityToken (line 28) | EnvSecurityToken = envNamespace + "SECURITY_TOKEN"
  constant EnvRegionID (line 29) | EnvRegionID      = envNamespace + "REGION_ID"
  constant EnvLine (line 30) | EnvLine          = envNamespace + "LINE"
  constant EnvTTL (line 32) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 33) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 34) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 35) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant defaultRegionID (line 38) | defaultRegionID = "cn-hangzhou"
  type Config (line 43) | type Config struct
  function NewDefaultConfig (line 57) | func NewDefaultConfig() *Config {
  type DNSProvider (line 67) | type DNSProvider struct
    method Timeout (line 152) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 157) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 181) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method getHostedZone (line 210) | func (d *DNSProvider) getHostedZone(ctx context.Context, domain string...
    method newTxtRecord (line 254) | func (d *DNSProvider) newTxtRecord(zone, fqdn, value string) (*alidns....
    method findTxtRecords (line 274) | func (d *DNSProvider) findTxtRecords(ctx context.Context, fqdn string)...
  function NewDNSProvider (line 76) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 100) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function extractRecordName (line 305) | func extractRecordName(fqdn, zone string) (string, error) {

FILE: providers/dns/alidns/alidns_test.go
  constant envDomain (line 11) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 19) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 86) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 140) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 154) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/aliesa/aliesa.go
  constant envNamespace (line 22) | envNamespace = "ALIESA_"
  constant EnvRAMRole (line 24) | EnvRAMRole       = envNamespace + "RAM_ROLE"
  constant EnvAccessKey (line 25) | EnvAccessKey     = envNamespace + "ACCESS_KEY"
  constant EnvSecretKey (line 26) | EnvSecretKey     = envNamespace + "SECRET_KEY"
  constant EnvSecurityToken (line 27) | EnvSecurityToken = envNamespace + "SECURITY_TOKEN"
  constant EnvRegionID (line 28) | EnvRegionID      = envNamespace + "REGION_ID"
  constant EnvTTL (line 30) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 31) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 32) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 33) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant defaultRegionID (line 36) | defaultRegionID = "cn-hangzhou"
  type Config (line 39) | type Config struct
  function NewDefaultConfig (line 53) | func NewDefaultConfig() *Config {
  type DNSProvider (line 63) | type DNSProvider struct
    method Present (line 161) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 192) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 224) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method getSiteID (line 228) | func (d *DNSProvider) getSiteID(ctx context.Context, fqdn string) (int...
  function NewDNSProvider (line 72) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 95) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/aliesa/aliesa_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 18) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 85) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 139) | func TestLivePresent(t *testing.T) {

FILE: providers/dns/allinkl/allinkl.go
  constant envNamespace (line 22) | envNamespace = "ALL_INKL_"
  constant EnvLogin (line 24) | EnvLogin    = envNamespace + "LOGIN"
  constant EnvPassword (line 25) | EnvPassword = envNamespace + "PASSWORD"
  constant EnvPropagationTimeout (line 27) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 28) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 29) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 35) | type Config struct
  function NewDefaultConfig (line 45) | func NewDefaultConfig() *Config {
  type DNSProvider (line 56) | type DNSProvider struct
    method Timeout (line 117) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 122) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 164) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method findZone (line 197) | func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (stri...
  function NewDNSProvider (line 68) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 82) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/allinkl/allinkl_test.go
  constant envDomain (line 19) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 23) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 84) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 128) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 142) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 156) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function extractKasRequest (line 181) | func extractKasRequest(reader io.Reader) (*internal.KasRequest, error) {
  function TestDNSProvider_Present (line 213) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 247) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/allinkl/internal/client.go
  constant defaultBaseURL (line 21) | defaultBaseURL = "https://kasapi.kasserver.com/soap/"
  constant apiPath (line 23) | apiPath = "KasApi.php"
  type Authentication (line 25) | type Authentication interface
  type Client (line 30) | type Client struct
    method GetDNSSettings (line 57) | func (c *Client) GetDNSSettings(ctx context.Context, zone, recordID st...
    method AddDNSSettings (line 77) | func (c *Client) AddDNSSettings(ctx context.Context, record DNSRequest...
    method DeleteDNSSettings (line 91) | func (c *Client) DeleteDNSSettings(ctx context.Context, recordID strin...
    method newRequest (line 106) | func (c *Client) newRequest(ctx context.Context, action string, reques...
    method doRequest (line 132) | func (c *Client) doRequest(ctx context.Context, action string, request...
    method do (line 147) | func (c *Client) do(req *http.Request, result any) error {
    method updateFloodTime (line 193) | func (c *Client) updateFloodTime(delay float64) {
  function NewClient (line 43) | func NewClient(login string) *Client {
  function getValue (line 199) | func getValue(item *Item) any {
  function getKey (line 243) | func getKey(item *Item) string {

FILE: providers/dns/allinkl/internal/client_test.go
  function setupClient (line 14) | func setupClient(server *httptest.Server) (*Client, error) {
  function TestClient_GetDNSSettings (line 24) | func TestClient_GetDNSSettings(t *testing.T) {
  function TestClient_GetDNSSettings_error_flood_protection (line 103) | func TestClient_GetDNSSettings_error_flood_protection(t *testing.T) {
  function TestClient_AddDNSSettings (line 118) | func TestClient_AddDNSSettings(t *testing.T) {
  function TestClient_DeleteDNSSettings (line 138) | func TestClient_DeleteDNSSettings(t *testing.T) {

FILE: providers/dns/allinkl/internal/identity.go
  constant authPath (line 16) | authPath = "KasAuth.php"
  type token (line 18) | type token
  constant tokenKey (line 20) | tokenKey token = "token"
  type Identifier (line 23) | type Identifier struct
    method Authentication (line 46) | func (c *Identifier) Authentication(ctx context.Context, sessionLifeti...
  function NewIdentifier (line 32) | func NewIdentifier(login, password string) *Identifier {
  function WithContext (line 97) | func WithContext(ctx context.Context, credential string) context.Context {
  function getToken (line 101) | func getToken(ctx context.Context) string {

FILE: providers/dns/allinkl/internal/identity_test.go
  function setupIdentifierClient (line 14) | func setupIdentifierClient(server *httptest.Server) (*Identifier, error) {
  function mockContext (line 22) | func mockContext(t *testing.T) context.Context {
  function TestIdentifier_Authentication (line 28) | func TestIdentifier_Authentication(t *testing.T) {
  function TestIdentifier_Authentication_error (line 42) | func TestIdentifier_Authentication_error(t *testing.T) {

FILE: providers/dns/allinkl/internal/types.go
  type Trimmer (line 11) | type Trimmer struct
    method Token (line 15) | func (tr Trimmer) Token() (xml.Token, error) {
  type Fault (line 25) | type Fault struct
    method Error (line 32) | func (f *Fault) Error() string {
  type KasResponse (line 37) | type KasResponse struct
  type Item (line 42) | type Item struct
  function decodeXML (line 51) | func decodeXML[T any](reader io.Reader) (*T, error) {

FILE: providers/dns/allinkl/internal/types_api.go
  constant kasAPIEnvelope (line 6) | kasAPIEnvelope = `
  type KasAPIResponseEnvelope (line 16) | type KasAPIResponseEnvelope struct
  type KasAPIBody (line 21) | type KasAPIBody struct
  type KasRequest (line 28) | type KasRequest struct
  type DNSRequest (line 41) | type DNSRequest struct
  type APIResponse (line 56) | type APIResponse struct
  type GetDNSSettingsResponse (line 60) | type GetDNSSettingsResponse struct
  type ReturnInfo (line 66) | type ReturnInfo struct
  type AddDNSSettingsResponse (line 76) | type AddDNSSettingsResponse struct
  type DeleteDNSSettingsResponse (line 82) | type DeleteDNSSettingsResponse struct

FILE: providers/dns/allinkl/internal/types_auth.go
  constant kasAuthEnvelope (line 6) | kasAuthEnvelope = `
  type KasAuthEnvelope (line 16) | type KasAuthEnvelope struct
  type KasAuthBody (line 21) | type KasAuthBody struct
  type AuthRequest (line 28) | type AuthRequest struct

FILE: providers/dns/alwaysdata/alwaysdata.go
  constant envNamespace (line 19) | envNamespace = "ALWAYSDATA_"
  constant EnvAPIKey (line 21) | EnvAPIKey  = envNamespace + "API_KEY"
  constant EnvAccount (line 22) | EnvAccount = envNamespace + "ACCOUNT"
  constant EnvTTL (line 24) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 25) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 26) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 27) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 42) | func NewDefaultConfig() *Config {
  type DNSProvider (line 54) | type DNSProvider struct
    method Present (line 97) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 130) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 166) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method findZone (line 170) | func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (*int...
  function NewDNSProvider (line 60) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 74) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/alwaysdata/alwaysdata_test.go
  constant envDomain (line 14) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 18) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 66) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 108) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 122) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 136) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 158) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 171) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/alwaysdata/internal/client.go
  constant defaultBaseURL (line 19) | defaultBaseURL = "https://api.alwaysdata.com/v1"
  type Client (line 22) | type Client struct
    method ListDomains (line 46) | func (c *Client) ListDomains(ctx context.Context) ([]Domain, error) {
    method AddRecord (line 64) | func (c *Client) AddRecord(ctx context.Context, record RecordRequest) ...
    method DeleteRecord (line 80) | func (c *Client) DeleteRecord(ctx context.Context, recordID int64) err...
    method ListRecords (line 91) | func (c *Client) ListRecords(ctx context.Context, domainID int64, name...
    method do (line 114) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 31) | func NewClient(apiKey, account string) (*Client, error) {
  function newJSONRequest (line 155) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...

FILE: providers/dns/alwaysdata/internal/client_test.go
  function mockBuilder (line 15) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_ListDomains (line 34) | func TestClient_ListDomains(t *testing.T) {
  function TestClient_AddRecord (line 52) | func TestClient_AddRecord(t *testing.T) {
  function TestClient_DeleteRecord (line 74) | func TestClient_DeleteRecord(t *testing.T) {
  function TestClient_ListRecords (line 84) | func TestClient_ListRecords(t *testing.T) {

FILE: providers/dns/alwaysdata/internal/types.go
  type RecordRequest (line 3) | type RecordRequest struct
  type Record (line 15) | type Record struct
  type Domain (line 27) | type Domain struct

FILE: providers/dns/anexia/anexia.go
  constant envNamespace (line 23) | envNamespace = "ANEXIA_"
  constant EnvToken (line 25) | EnvToken  = envNamespace + "TOKEN"
  constant EnvAPIURL (line 26) | EnvAPIURL = envNamespace + "API_URL"
  constant EnvTTL (line 28) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 29) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 30) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 31) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant defaultTTL (line 34) | defaultTTL = 300
  type Config (line 39) | type Config struct
  function NewDefaultConfig (line 50) | func NewDefaultConfig() *Config {
  type DNSProvider (line 62) | type DNSProvider struct
    method Timeout (line 120) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 125) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 160) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method findRecordID (line 190) | func (d *DNSProvider) findRecordID(ctx context.Context, zoneName, reco...
  function NewDNSProvider (line 69) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 83) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function findRecordIdentifier (line 210) | func findRecordIdentifier(zone *internal.Zone, recordName, rdata string)...
  function extractRecordName (line 230) | func extractRecordName(fqdn, authZone string) (string, error) {

FILE: providers/dns/anexia/anexia_test.go
  constant envDomain (line 14) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 21) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 64) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 100) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 114) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 130) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 145) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 158) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/anexia/internal/client.go
  constant defaultBaseURL (line 18) | defaultBaseURL = "https://engine.anexia-it.com"
  type Client (line 21) | type Client struct
    method CreateRecord (line 43) | func (c *Client) CreateRecord(ctx context.Context, zoneName string, re...
    method DeleteRecord (line 61) | func (c *Client) DeleteRecord(ctx context.Context, zoneName, recordID ...
    method GetZone (line 72) | func (c *Client) GetZone(ctx context.Context, zoneName string) (*Zone,...
    method do (line 90) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 29) | func NewClient(token string) (*Client, error) {
  function newJSONRequest (line 123) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 147) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/anexia/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_CreateRecord (line 32) | func TestClient_CreateRecord(t *testing.T) {
  function TestClient_DeleteRecord (line 71) | func TestClient_DeleteRecord(t *testing.T) {
  function TestClient_DeleteRecord_error (line 81) | func TestClient_DeleteRecord_error(t *testing.T) {
  function TestClient_GetZone (line 92) | func TestClient_GetZone(t *testing.T) {

FILE: providers/dns/anexia/internal/types.go
  type APIError (line 5) | type APIError struct
    method Error (line 12) | func (a *APIError) Error() string {
  type Zone (line 16) | type Zone struct
  type Revision (line 24) | type Revision struct
  type Record (line 30) | type Record struct

FILE: providers/dns/artfiles/artfiles.go
  constant envNamespace (line 21) | envNamespace = "ARTFILES_"
  constant EnvUsername (line 23) | EnvUsername = envNamespace + "USERNAME"
  constant EnvPassword (line 24) | EnvPassword = envNamespace + "PASSWORD"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 27) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 28) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 32) | type Config struct
  function NewDefaultConfig (line 42) | func NewDefaultConfig() *Config {
  type DNSProvider (line 53) | type DNSProvider struct
    method Present (line 96) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 140) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 181) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method findZone (line 185) | func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (stri...
  function NewDNSProvider (line 59) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 73) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/artfiles/artfiles_test.go
  constant envDomain (line 13) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 17) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 75) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 123) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 137) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 151) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 173) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 202) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/artfiles/internal/client.go
  constant defaultBaseURL (line 17) | defaultBaseURL = "https://dcp.c.artfiles.de/api/"
  type Client (line 20) | type Client struct
    method GetDomains (line 44) | func (c *Client) GetDomains(ctx context.Context) ([]string, error) {
    method GetRecords (line 60) | func (c *Client) GetRecords(ctx context.Context, domain string) (map[s...
    method SetRecords (line 88) | func (c *Client) SetRecords(ctx context.Context, domain, rType string,...
    method do (line 107) | func (c *Client) do(req *http.Request) ([]byte, error) {
  function NewClient (line 29) | func NewClient(username, password string) (*Client, error) {

FILE: providers/dns/artfiles/internal/client_test.go
  function mockBuilder (line 15) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_GetDomains (line 33) | func TestClient_GetDomains(t *testing.T) {
  function TestClient_GetRecords (line 48) | func TestClient_GetRecords(t *testing.T) {
  function TestClient_SetRecords (line 77) | func TestClient_SetRecords(t *testing.T) {

FILE: providers/dns/artfiles/internal/types.go
  type Records (line 15) | type Records struct
  type RecordValue (line 20) | type RecordValue
    method Set (line 22) | func (r RecordValue) Set(key, value string) {
    method Add (line 26) | func (r RecordValue) Add(key, value string) {
    method Delete (line 30) | func (r RecordValue) Delete(key string) {
    method RemoveValue (line 34) | func (r RecordValue) RemoveValue(key, value string) {
    method String (line 56) | func (r RecordValue) String() string {
  function ParseRecordValue (line 68) | func ParseRecordValue(lines string) RecordValue {
  function parseDomains (line 82) | func parseDomains(input string) ([]string, error) {

FILE: providers/dns/artfiles/internal/types_test.go
  function TestRecordValue_Set (line 12) | func TestRecordValue_Set(t *testing.T) {
  function TestRecordValue_Add (line 22) | func TestRecordValue_Add(t *testing.T) {
  function TestRecordValue_Delete (line 32) | func TestRecordValue_Delete(t *testing.T) {
  function TestRecordValue_RemoveValue (line 43) | func TestRecordValue_RemoveValue(t *testing.T) {
  function TestParseRecordValue (line 125) | func TestParseRecordValue(t *testing.T) {
  function Test_parseDomains (line 173) | func Test_parseDomains(t *testing.T) {

FILE: providers/dns/arvancloud/arvancloud.go
  constant envNamespace (line 21) | envNamespace = "ARVANCLOUD_"
  constant EnvAPIKey (line 23) | EnvAPIKey = envNamespace + "API_KEY"
  constant EnvTTL (line 25) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 27) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 28) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant minTTL (line 31) | minTTL = 600
  type Config (line 36) | type Config struct
  function NewDefaultConfig (line 45) | func NewDefaultConfig() *Config {
  type DNSProvider (line 57) | type DNSProvider struct
    method Timeout (line 110) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 115) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 156) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 67) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 80) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/arvancloud/arvancloud_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 16) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 58) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 102) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 116) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/arvancloud/internal/client.go
  constant defaultBaseURL (line 18) | defaultBaseURL = "https://napi.arvancloud.ir"
  constant authorizationHeader (line 20) | authorizationHeader = "Authorization"
  type Client (line 23) | type Client struct
    method GetTxtRecord (line 42) | func (c *Client) GetTxtRecord(ctx context.Context, domain, name, value...
    method getRecords (line 58) | func (c *Client) getRecords(ctx context.Context, domain, search string...
    method CreateRecord (line 84) | func (c *Client) CreateRecord(ctx context.Context, domain string, reco...
    method DeleteRecord (line 104) | func (c *Client) DeleteRecord(ctx context.Context, domain, id string) ...
    method do (line 120) | func (c *Client) do(req *http.Request, expectedStatus int, result any)...
  function NewClient (line 31) | func NewClient(apiKey string) *Client {
  function newJSONRequest (line 151) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function equalsTXTRecord (line 175) | func equalsTXTRecord(record DNSRecord, name, value string) bool {

FILE: providers/dns/arvancloud/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder(apiKey string) *servermock.Builder[*Client] {
  function TestClient_GetTxtRecord (line 27) | func TestClient_GetTxtRecord(t *testing.T) {
  function TestClient_CreateRecord (line 42) | func TestClient_CreateRecord(t *testing.T) {
  function TestClient_DeleteRecord (line 81) | func TestClient_DeleteRecord(t *testing.T) {

FILE: providers/dns/arvancloud/internal/types.go
  type apiResponse (line 3) | type apiResponse struct
  type DNSRecord (line 9) | type DNSRecord struct
  type TXTRecordValue (line 20) | type TXTRecordValue struct
  type IPFilterMode (line 25) | type IPFilterMode struct

FILE: providers/dns/auroradns/auroradns.go
  constant envNamespace (line 20) | envNamespace = "AURORA_"
  constant EnvAPIKey (line 22) | EnvAPIKey   = envNamespace + "API_KEY"
  constant EnvSecret (line 23) | EnvSecret   = envNamespace + "SECRET"
  constant EnvEndpoint (line 24) | EnvEndpoint = envNamespace + "ENDPOINT"
  constant EnvTTL (line 26) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 27) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 28) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant defaultBaseURL (line 31) | defaultBaseURL = "https://api.auroradns.eu"
  type Config (line 36) | type Config struct
  function NewDefaultConfig (line 46) | func NewDefaultConfig() *Config {
  type DNSProvider (line 55) | type DNSProvider struct
    method Present (line 112) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 156) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 193) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method getZoneInformationByName (line 197) | func (d *DNSProvider) getZoneInformationByName(name string) (auroradns...
  function NewDNSProvider (line 66) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 81) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/auroradns/auroradns_test.go
  function mockBuilder (line 16) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestNewDNSProvider (line 32) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 93) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestDNSProvider_Present (line 145) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 167) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/autodns/autodns.go
  constant envNamespace (line 21) | envNamespace = "AUTODNS_"
  constant EnvAPIUser (line 23) | EnvAPIUser            = envNamespace + "API_USER"
  constant EnvAPIPassword (line 24) | EnvAPIPassword        = envNamespace + "API_PASSWORD"
  constant EnvAPIEndpoint (line 25) | EnvAPIEndpoint        = envNamespace + "ENDPOINT"
  constant EnvAPIEndpointContext (line 26) | EnvAPIEndpointContext = envNamespace + "CONTEXT"
  constant EnvTTL (line 28) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 29) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 30) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 31) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 37) | type Config struct
  function NewDefaultConfig (line 49) | func NewDefaultConfig() *Config {
  type DNSProvider (line 65) | type DNSProvider struct
    method Timeout (line 116) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 121) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 140) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 72) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 86) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/autodns/autodns_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 18) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 78) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 129) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 143) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/autodns/internal/client.go
  constant DefaultEndpoint (line 18) | DefaultEndpoint = "https://api.autodns.com/v1/"
  constant DefaultEndpointContext (line 21) | DefaultEndpointContext int = 4
  type Client (line 24) | type Client struct
    method AddRecords (line 47) | func (c *Client) AddRecords(ctx context.Context, domain string, record...
    method RemoveRecords (line 54) | func (c *Client) RemoveRecords(ctx context.Context, domain string, rec...
    method updateZone (line 61) | func (c *Client) updateZone(ctx context.Context, domain string, zoneSt...
    method do (line 77) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 34) | func NewClient(username, password string, clientContext int) *Client {
  function newJSONRequest (line 109) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 133) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/autodns/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_AddRecords (line 28) | func TestClient_AddRecords(t *testing.T) {
  function TestClient_AddRecords_error (line 93) | func TestClient_AddRecords_error(t *testing.T) {
  function TestClient_RemoveRecords (line 111) | func TestClient_RemoveRecords(t *testing.T) {

FILE: providers/dns/autodns/internal/types.go
  type APIResponse (line 8) | type APIResponse struct
  type APIError (line 17) | type APIError
    method Error (line 19) | func (a *APIError) Error() string {
  type DataZoneResponse (line 45) | type DataZoneResponse
  type ResponseMessage (line 47) | type ResponseMessage struct
    method String (line 55) | func (r ResponseMessage) String() string {
  type GenericObject (line 81) | type GenericObject struct
    method String (line 86) | func (g GenericObject) String() string {
  type ResponseStatus (line 90) | type ResponseStatus struct
    method String (line 96) | func (r ResponseStatus) String() string {
  type ResponseObject (line 100) | type ResponseObject struct
    method String (line 107) | func (r ResponseObject) String() string {
  type ResponseObjectData (line 129) | type ResponseObjectData struct
  type ResourceRecord (line 135) | type ResourceRecord struct
  type Zone (line 145) | type Zone struct
  type ZoneStream (line 154) | type ZoneStream struct

FILE: providers/dns/axelname/axelname.go
  constant envNamespace (line 19) | envNamespace = "AXELNAME_"
  constant EnvNickname (line 21) | EnvNickname = envNamespace + "NICKNAME"
  constant EnvToken (line 22) | EnvToken    = envNamespace + "TOKEN"
  constant EnvTTL (line 24) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 25) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 26) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 27) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 42) | func NewDefaultConfig() *Config {
  type DNSProvider (line 54) | type DNSProvider struct
    method Present (line 97) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 125) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 158) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 60) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 74) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/axelname/axelname_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 72) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 118) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 132) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/axelname/internal/client.go
  constant statusSuccess (line 16) | statusSuccess = "success"
  constant defaultBaseURL (line 18) | defaultBaseURL = "https://my.axelname.ru/rest/"
  type Client (line 21) | type Client struct
    method ListRecords (line 45) | func (c *Client) ListRecords(ctx context.Context, domain string) ([]Re...
    method DeleteRecord (line 72) | func (c *Client) DeleteRecord(ctx context.Context, domain string, reco...
    method AddRecord (line 103) | func (c *Client) AddRecord(ctx context.Context, domain string, record ...
    method newRequest (line 134) | func (c *Client) newRequest(ctx context.Context, endpoint *url.URL) (*...
    method do (line 144) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 30) | func NewClient(nickname, token string) (*Client, error) {
  function parseError (line 173) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/axelname/internal/client_test.go
  function setupClient (line 14) | func setupClient(server *httptest.Server) (*Client, error) {
  function TestClient_ListRecords (line 26) | func TestClient_ListRecords(t *testing.T) {
  function TestClient_ListRecords_error (line 49) | func TestClient_ListRecords_error(t *testing.T) {
  function TestClient_DeleteRecord (line 60) | func TestClient_DeleteRecord(t *testing.T) {
  function TestClient_DeleteRecord_error (line 77) | func TestClient_DeleteRecord_error(t *testing.T) {
  function TestClient_AddRecord (line 90) | func TestClient_AddRecord(t *testing.T) {
  function TestClient_AddRecord_error (line 107) | func TestClient_AddRecord_error(t *testing.T) {

FILE: providers/dns/axelname/internal/types.go
  type APIError (line 5) | type APIError struct
    method Error (line 11) | func (a *APIError) Error() string {
  type APIResponse (line 15) | type APIResponse struct
  type ListResponse (line 22) | type ListResponse struct
  type Record (line 29) | type Record struct

FILE: providers/dns/azion/azion.go
  constant envNamespace (line 19) | envNamespace = "AZION_"
  constant EnvPersonalToken (line 21) | EnvPersonalToken = envNamespace + "PERSONAL_TOKEN"
  constant EnvPageSize (line 22) | EnvPageSize      = envNamespace + "PAGE_SIZE"
  constant EnvTTL (line 24) | EnvTTL                = envNamespace + "TTL"
  constant EnvPollingInterval (line 25) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvHTTPTimeout (line 27) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 42) | func NewDefaultConfig() *Config {
  type DNSProvider (line 55) | type DNSProvider struct
    method Timeout (line 103) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 108) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 163) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method findZone (line 227) | func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (*idn...
    method findExistingTXTRecord (line 250) | func (d *DNSProvider) findExistingTXTRecord(ctx context.Context, zoneI...
  function NewDNSProvider (line 62) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 75) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function authContext (line 287) | func authContext(ctx context.Context, key string) context.Context {
  function extractSubDomain (line 296) | func extractSubDomain(info dns01.ChallengeInfo, zone *idns.Zone) (string...

FILE: providers/dns/azion/azion_test.go
  constant envDomain (line 15) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 19) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 62) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 97) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 111) | func TestLiveCleanUp(t *testing.T) {
  function TestDNSProvider_findZone (line 125) | func TestDNSProvider_findZone(t *testing.T) {
  function TestDNSProvider_findZone_error (line 179) | func TestDNSProvider_findZone_error(t *testing.T) {
  function mockBuilder (line 214) | func mockBuilder() *servermock.Builder[*DNSProvider] {

FILE: providers/dns/azure/azure.go
  constant envNamespace (line 24) | envNamespace = "AZURE_"
  constant EnvEnvironment (line 26) | EnvEnvironment      = envNamespace + "ENVIRONMENT"
  constant EnvMetadataEndpoint (line 27) | EnvMetadataEndpoint = envNamespace + "METADATA_ENDPOINT"
  constant EnvSubscriptionID (line 28) | EnvSubscriptionID   = envNamespace + "SUBSCRIPTION_ID"
  constant EnvResourceGroup (line 29) | EnvResourceGroup    = envNamespace + "RESOURCE_GROUP"
  constant EnvTenantID (line 30) | EnvTenantID         = envNamespace + "TENANT_ID"
  constant EnvClientID (line 31) | EnvClientID         = envNamespace + "CLIENT_ID"
  constant EnvClientSecret (line 32) | EnvClientSecret     = envNamespace + "CLIENT_SECRET"
  constant EnvZoneName (line 33) | EnvZoneName         = envNamespace + "ZONE_NAME"
  constant EnvPrivateZone (line 34) | EnvPrivateZone      = envNamespace + "PRIVATE_ZONE"
  constant EnvTTL (line 36) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 37) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 38) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvLegoAzureBypassDeprecation (line 41) | EnvLegoAzureBypassDeprecation = "LEGO_AZURE_BYPASS_DEPRECATION"
  constant defaultMetadataEndpoint (line 43) | defaultMetadataEndpoint = "http://169.254.169.254"
  type Config (line 48) | type Config struct
  function NewDefaultConfig (line 71) | func NewDefaultConfig() *Config {
  type DNSProvider (line 84) | type DNSProvider struct
    method Timeout (line 195) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 200) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 205) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 97) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 134) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function getAuthorizer (line 209) | func getAuthorizer(config *Config) (autorest.Authorizer, error) {
  function getMetadata (line 234) | func getMetadata(config *Config, field string) (string, error) {

FILE: providers/dns/azure/azure_test.go
  constant envDomain (line 14) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 26) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 81) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 193) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 207) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/azure/private.go
  type dnsProviderPrivate (line 17) | type dnsProviderPrivate struct
    method Timeout (line 24) | func (d *dnsProviderPrivate) Timeout() (timeout, interval time.Duratio...
    method Present (line 29) | func (d *dnsProviderPrivate) Present(domain, token, keyAuth string) er...
    method CleanUp (line 90) | func (d *dnsProviderPrivate) CleanUp(domain, token, keyAuth string) er...
    method getHostedZoneID (line 116) | func (d *dnsProviderPrivate) getHostedZoneID(ctx context.Context, fqdn...

FILE: providers/dns/azure/public.go
  type dnsProviderPublic (line 17) | type dnsProviderPublic struct
    method Timeout (line 24) | func (d *dnsProviderPublic) Timeout() (timeout, interval time.Duration) {
    method Present (line 29) | func (d *dnsProviderPublic) Present(domain, token, keyAuth string) err...
    method CleanUp (line 90) | func (d *dnsProviderPublic) CleanUp(domain, token, keyAuth string) err...
    method getHostedZoneID (line 116) | func (d *dnsProviderPublic) getHostedZoneID(ctx context.Context, fqdn ...

FILE: providers/dns/azuredns/azuredns.go
  constant envNamespace (line 19) | envNamespace = "AZURE_"
  constant EnvEnvironment (line 21) | EnvEnvironment    = envNamespace + "ENVIRONMENT"
  constant EnvSubscriptionID (line 22) | EnvSubscriptionID = envNamespace + "SUBSCRIPTION_ID"
  constant EnvResourceGroup (line 23) | EnvResourceGroup  = envNamespace + "RESOURCE_GROUP"
  constant EnvZoneName (line 24) | EnvZoneName       = envNamespace + "ZONE_NAME"
  constant EnvPrivateZone (line 25) | EnvPrivateZone    = envNamespace + "PRIVATE_ZONE"
  constant EnvTenantID (line 27) | EnvTenantID     = envNamespace + "TENANT_ID"
  constant EnvClientID (line 28) | EnvClientID     = envNamespace + "CLIENT_ID"
  constant EnvClientSecret (line 29) | EnvClientSecret = envNamespace + "CLIENT_SECRET"
  constant EnvOIDCToken (line 31) | EnvOIDCToken              = envNamespace + "OIDC_TOKEN"
  constant EnvOIDCTokenFilePath (line 32) | EnvOIDCTokenFilePath      = envNamespace + "OIDC_TOKEN_FILE_PATH"
  constant EnvOIDCRequestURL (line 33) | EnvOIDCRequestURL         = envNamespace + "OIDC_REQUEST_URL"
  constant EnvGitHubOIDCRequestURL (line 34) | EnvGitHubOIDCRequestURL   = "ACTIONS_ID_TOKEN_REQUEST_URL"
  constant altEnvArmOIDCRequestURL (line 35) | altEnvArmOIDCRequestURL   = "ARM_OIDC_REQUEST_URL"
  constant EnvOIDCRequestToken (line 36) | EnvOIDCRequestToken       = envNamespace + "OIDC_REQUEST_TOKEN"
  constant EnvGitHubOIDCRequestToken (line 37) | EnvGitHubOIDCRequestToken = "ACTIONS_ID_TOKEN_REQUEST_TOKEN"
  constant altEnvArmOIDCRequestToken (line 38) | altEnvArmOIDCRequestToken = "ARM_OIDC_REQUEST_TOKEN"
  constant EnvServiceConnectionID (line 40) | EnvServiceConnectionID                  = envNamespace + "SERVICE_CONNEC...
  constant altEnvServiceConnectionID (line 41) | altEnvServiceConnectionID               = "SERVICE_CONNECTION_ID"
  constant altEnvArmAdoPipelineServiceConnectionID (line 42) | altEnvArmAdoPipelineServiceConnectionID = "ARM_ADO_PIPELINE_SERVICE_CONN...
  constant altEnvArmOIDCAzureServiceConnectionID (line 43) | altEnvArmOIDCAzureServiceConnectionID   = "ARM_OIDC_AZURE_SERVICE_CONNEC...
  constant EnvSystemAccessToken (line 44) | EnvSystemAccessToken                    = envNamespace + "SYSTEM_ACCESS_...
  constant altEnvSystemAccessToken (line 45) | altEnvSystemAccessToken                 = "SYSTEM_ACCESSTOKEN"
  constant EnvAuthMethod (line 47) | EnvAuthMethod     = envNamespace + "AUTH_METHOD"
  constant EnvAuthMSITimeout (line 48) | EnvAuthMSITimeout = envNamespace + "AUTH_MSI_TIMEOUT"
  constant EnvServiceDiscoveryFilter (line 50) | EnvServiceDiscoveryFilter = envNamespace + "SERVICEDISCOVERY_FILTER"
  constant EnvTTL (line 52) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 53) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 54) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  type Config (line 60) | type Config struct
  function NewDefaultConfig (line 94) | func NewDefaultConfig() *Config {
  type DNSProvider (line 105) | type DNSProvider struct
    method Timeout (line 200) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 205) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 210) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 110) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 166) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/azuredns/azuredns_test.go
  constant envDomain (line 12) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 20) | func TestNewDNSProvider(t *testing.T) {
  function TestLivePresent (line 59) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 73) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/azuredns/credentials.go
  constant authMethodEnv (line 17) | authMethodEnv      = "env"
  constant authMethodWLI (line 18) | authMethodWLI      = "wli"
  constant authMethodMSI (line 19) | authMethodMSI      = "msi"
  constant authMethodCLI (line 20) | authMethodCLI      = "cli"
  constant authMethodOIDC (line 21) | authMethodOIDC     = "oidc"
  constant authMethodPipeline (line 22) | authMethodPipeline = "pipeline"
  function getCredentials (line 26) | func getCredentials(config *Config) (azcore.TokenCredential, error) {
  type timeoutTokenCredential (line 85) | type timeoutTokenCredential struct
    method GetToken (line 91) | func (w *timeoutTokenCredential) GetToken(ctx context.Context, opts po...
  function getZoneName (line 109) | func getZoneName(config *Config, fqdn string) (string, error) {
  function checkPipelineConfig (line 126) | func checkPipelineConfig(config *Config) error {

FILE: providers/dns/azuredns/oidc.go
  function checkOIDCConfig (line 15) | func checkOIDCConfig(config *Config) error {
  function getOIDCAssertion (line 31) | func getOIDCAssertion(config *Config) func(ctx context.Context) (string,...
  function getOIDCToken (line 60) | func getOIDCToken(config *Config) (string, error) {

FILE: providers/dns/azuredns/private.go
  type DNSProviderPrivate (line 23) | type DNSProviderPrivate struct
    method Timeout (line 45) | func (d *DNSProviderPrivate) Timeout() (timeout, interval time.Duratio...
    method Present (line 50) | func (d *DNSProviderPrivate) Present(domain, _, keyAuth string) error {
    method CleanUp (line 103) | func (d *DNSProviderPrivate) CleanUp(domain, _, keyAuth string) error {
    method getHostedZone (line 131) | func (d *DNSProviderPrivate) getHostedZone(fqdn string) (ServiceDiscov...
  function NewDNSProviderPrivate (line 30) | func NewDNSProviderPrivate(config *Config, credentials azcore.TokenCrede...
  type privateZoneClient (line 146) | type privateZoneClient struct
    method Get (line 170) | func (c privateZoneClient) Get(ctx context.Context, subDomain string) ...
    method CreateOrUpdate (line 174) | func (c privateZoneClient) CreateOrUpdate(ctx context.Context, subDoma...
    method Delete (line 178) | func (c privateZoneClient) Delete(ctx context.Context, subDomain strin...
  function newPrivateZoneClient (line 152) | func newPrivateZoneClient(zone ServiceDiscoveryZone, credential azcore.T...
  function privateUniqueRecords (line 182) | func privateUniqueRecords(recordSet armprivatedns.RecordSet, value strin...

FILE: providers/dns/azuredns/public.go
  type DNSProviderPublic (line 23) | type DNSProviderPublic struct
    method Timeout (line 45) | func (d *DNSProviderPublic) Timeout() (timeout, interval time.Duration) {
    method Present (line 50) | func (d *DNSProviderPublic) Present(domain, _, keyAuth string) error {
    method CleanUp (line 102) | func (d *DNSProviderPublic) CleanUp(domain, _, keyAuth string) error {
    method getHostedZone (line 130) | func (d *DNSProviderPublic) getHostedZone(fqdn string) (ServiceDiscove...
  function NewDNSProviderPublic (line 30) | func NewDNSProviderPublic(config *Config, credentials azcore.TokenCreden...
  type publicZoneClient (line 144) | type publicZoneClient struct
    method Get (line 168) | func (c publicZoneClient) Get(ctx context.Context, subDomain string) (...
    method CreateOrUpdate (line 172) | func (c publicZoneClient) CreateOrUpdate(ctx context.Context, subDomai...
    method Delete (line 176) | func (c publicZoneClient) Delete(ctx context.Context, subDomain string...
  function newPublicZoneClient (line 150) | func newPublicZoneClient(zone ServiceDiscoveryZone, credential azcore.To...
  function publicUniqueRecords (line 180) | func publicUniqueRecords(recordSet armdns.RecordSet, value string) map[s...

FILE: providers/dns/azuredns/servicediscovery.go
  type ServiceDiscoveryZone (line 15) | type ServiceDiscoveryZone struct
  constant ResourceGraphTypePublicDNSZone (line 22) | ResourceGraphTypePublicDNSZone  = "microsoft.network/dnszones"
  constant ResourceGraphTypePrivateDNSZone (line 23) | ResourceGraphTypePrivateDNSZone = "microsoft.network/privatednszones"
  constant ResourceGraphQueryOptionsTop (line 26) | ResourceGraphQueryOptionsTop int32 = 1000
  function discoverDNSZones (line 29) | func discoverDNSZones(ctx context.Context, config *Config, credentials a...
  function createGraphQuery (line 102) | func createGraphQuery(config *Config) string {

FILE: providers/dns/azuredns/servicediscovery_test.go
  function Test_createGraphQuery (line 10) | func Test_createGraphQuery(t *testing.T) {

FILE: providers/dns/baiducloud/baiducloud.go
  constant envNamespace (line 17) | envNamespace = "BAIDUCLOUD_"
  constant EnvAccessKeyID (line 19) | EnvAccessKeyID     = envNamespace + "ACCESS_KEY_ID"
  constant EnvSecretAccessKey (line 20) | EnvSecretAccessKey = envNamespace + "SECRET_ACCESS_KEY"
  constant EnvTTL (line 22) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 23) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 24) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant defaultTTL (line 28) | defaultTTL = 300
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 41) | func NewDefaultConfig() *Config {
  type DNSProvider (line 50) | type DNSProvider struct
    method Present (line 91) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 121) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method findRecordID (line 142) | func (d *DNSProvider) findRecordID(zoneName, tokenValue string) (strin...
    method Timeout (line 169) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 56) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 70) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/baiducloud/baiducloud_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 70) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 120) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 134) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/beget/beget.go
  constant envNamespace (line 20) | envNamespace = "BEGET_"
  constant EnvUsername (line 22) | EnvUsername = envNamespace + "USERNAME"
  constant EnvPassword (line 23) | EnvPassword = envNamespace + "PASSWORD"
  constant EnvTTL (line 25) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 27) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 28) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 34) | type Config struct
  function NewDefaultConfig (line 45) | func NewDefaultConfig() *Config {
  type DNSProvider (line 57) | type DNSProvider struct
    method Timeout (line 101) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 106) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 133) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 65) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 79) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/beget/beget_test.go
  constant envDomain (line 15) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 19) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 79) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 130) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 144) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 158) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 183) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 201) | func TestDNSProvider_CleanUp(t *testing.T) {
  function TestDNSProvider_CleanUp_empty (line 219) | func TestDNSProvider_CleanUp_empty(t *testing.T) {

FILE: providers/dns/beget/internal/client.go
  constant defaultBaseURL (line 15) | defaultBaseURL = "https://api.beget.com/api/"
  type Client (line 18) | type Client struct
    method GetTXTRecords (line 40) | func (c *Client) GetTXTRecords(ctx context.Context, domain string) ([]...
    method ChangeTXTRecord (line 65) | func (c *Client) ChangeTXTRecord(ctx context.Context, domain string, r...
    method doRequest (line 79) | func (c *Client) doRequest(ctx context.Context, data any, fragments .....
  function NewClient (line 27) | func NewClient(login, password string) *Client {
  function parseError (line 126) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/beget/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_GetTXTRecords (line 32) | func TestClient_GetTXTRecords(t *testing.T) {
  function TestClient_ChangeTXTRecord (line 49) | func TestClient_ChangeTXTRecord(t *testing.T) {
  function TestClient_ChangeTXTRecord_error (line 64) | func TestClient_ChangeTXTRecord_error(t *testing.T) {
  function TestClient_ChangeTXTRecord_answer_error (line 78) | func TestClient_ChangeTXTRecord_answer_error(t *testing.T) {
  function TestClient_ChangeTXTRecord_remove (line 92) | func TestClient_ChangeTXTRecord_remove(t *testing.T) {

FILE: providers/dns/beget/internal/types.go
  constant successResult (line 9) | successResult = "success"
  type APIResponse (line 12) | type APIResponse struct
    method Error (line 21) | func (a APIResponse) Error() string {
    method HasError (line 26) | func (a APIResponse) HasError() error {
  type Answer (line 39) | type Answer struct
    method Error (line 53) | func (a Answer) Error() string {
  type AnswerError (line 48) | type AnswerError struct
  type GetRecordsRequest (line 74) | type GetRecordsRequest struct
  type ChangeRecordsRequest (line 79) | type ChangeRecordsRequest struct
  type RecordList (line 85) | type RecordList struct
  type Record (line 90) | type Record struct
  type GetRecordsResult (line 97) | type GetRecordsResult struct

FILE: providers/dns/binarylane/binarylane.go
  constant envNamespace (line 20) | envNamespace = "BINARYLANE_"
  constant EnvAPIToken (line 22) | EnvAPIToken = envNamespace + "API_TOKEN"
  constant EnvTTL (line 24) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 25) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 26) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 27) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 41) | func NewDefaultConfig() *Config {
  type DNSProvider (line 53) | type DNSProvider struct
    method Present (line 99) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 132) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 163) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 62) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 75) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/binarylane/binarylane_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 57) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 92) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 106) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/binarylane/internal/client.go
  constant defaultBaseURL (line 18) | defaultBaseURL = "https://api.binarylane.com.au/v2/"
  constant authorizationHeader (line 20) | authorizationHeader = "Authorization"
  type Client (line 23) | type Client struct
    method CreateRecord (line 47) | func (c *Client) CreateRecord(ctx context.Context, domain string, reco...
    method DeleteRecord (line 71) | func (c *Client) DeleteRecord(ctx context.Context, domainName string, ...
    method do (line 82) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 31) | func NewClient(apiToken string) (*Client, error) {
  function newJSONRequest (line 113) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 137) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/binarylane/internal/client_test.go
  function mockBuilder (line 13) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_CreateRecord (line 31) | func TestClient_CreateRecord(t *testing.T) {
  function TestClient_CreateRecord_error (line 59) | func TestClient_CreateRecord_error(t *testing.T) {
  function TestClient_DeleteRecord (line 77) | func TestClient_DeleteRecord(t *testing.T) {
  function TestClient_DeleteRecord_error (line 88) | func TestClient_DeleteRecord_error(t *testing.T) {

FILE: providers/dns/binarylane/internal/types.go
  type APIError (line 8) | type APIError struct
    method Error (line 17) | func (a *APIError) Error() string {
  type Record (line 29) | type Record struct
  type APIResponse (line 42) | type APIResponse struct

FILE: providers/dns/bindman/bindman.go
  constant envNamespace (line 19) | envNamespace = "BINDMAN_"
  constant EnvManagerAddress (line 21) | EnvManagerAddress = envNamespace + "MANAGER_ADDRESS"
  constant EnvPropagationTimeout (line 23) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 24) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 25) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 31) | type Config struct
  function NewDefaultConfig (line 39) | func NewDefaultConfig() *Config {
  type DNSProvider (line 50) | type DNSProvider struct
    method Present (line 95) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 106) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 118) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 57) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 70) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/bindman/bindman_test.go
  constant envDomain (line 14) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 18) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 68) | func TestNewDNSProviderConfig(t *testing.T) {
  function mockBuilder (line 109) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 123) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 168) | func TestDNSProvider_CleanUp(t *testing.T) {
  function TestLivePresent (line 213) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 227) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/bluecat/bluecat.go
  constant envNamespace (line 21) | envNamespace = "BLUECAT_"
  constant EnvServerURL (line 23) | EnvServerURL  = envNamespace + "SERVER_URL"
  constant EnvUserName (line 24) | EnvUserName   = envNamespace + "USER_NAME"
  constant EnvPassword (line 25) | EnvPassword   = envNamespace + "PASSWORD"
  constant EnvConfigName (line 26) | EnvConfigName = envNamespace + "CONFIG_NAME"
  constant EnvDNSView (line 27) | EnvDNSView    = envNamespace + "DNS_VIEW"
  constant EnvDebug (line 28) | EnvDebug      = envNamespace + "DEBUG"
  constant EnvSkipDeploy (line 29) | EnvSkipDeploy = envNamespace + "SKIP_DEPLOY"
  constant EnvTTL (line 31) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 32) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 33) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 34) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 40) | type Config struct
  function NewDefaultConfig (line 55) | func NewDefaultConfig() *Config {
  type DNSProvider (line 69) | type DNSProvider struct
    method Present (line 122) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 171) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 216) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 82) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 99) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/bluecat/bluecat_test.go
  constant envDomain (line 11) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 21) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 126) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 217) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 231) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/bluecat/internal/client.go
  constant ConfigType (line 21) | ConfigType = "Configuration"
  constant ViewType (line 22) | ViewType   = "View"
  constant ZoneType (line 23) | ZoneType   = "Zone"
  constant TXTType (line 24) | TXTType    = "TXTRecord"
  constant authorizationHeader (line 27) | authorizationHeader = "Authorization"
  type Client (line 29) | type Client struct
    method Deploy (line 53) | func (c *Client) Deploy(ctx context.Context, entityID uint) error {
    method AddEntity (line 82) | func (c *Client) AddEntity(ctx context.Context, parentID uint, entity ...
    method GetEntityByName (line 120) | func (c *Client) GetEntityByName(ctx context.Context, parentID uint, n...
    method Delete (line 162) | func (c *Client) Delete(ctx context.Context, objectID uint) error {
    method LookupViewID (line 190) | func (c *Client) LookupViewID(ctx context.Context, configName, viewNam...
    method LookupParentZoneID (line 207) | func (c *Client) LookupParentZoneID(ctx context.Context, viewID uint, ...
    method createEndpoint (line 237) | func (c *Client) createEndpoint(resource string) *url.URL {
    method doAuthenticated (line 241) | func (c *Client) doAuthenticated(ctx context.Context, req *http.Reques...
  function NewClient (line 39) | func NewClient(baseURL, username, password string) *Client {
  function newJSONRequest (line 250) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...

FILE: providers/dns/bluecat/internal/client_test.go
  function setupClient (line 14) | func setupClient(server *httptest.Server) (*Client, error) {
  function TestClient_LookupParentZoneID (line 21) | func TestClient_LookupParentZoneID(t *testing.T) {

FILE: providers/dns/bluecat/internal/identity.go
  type token (line 13) | type token
  constant tokenKey (line 15) | tokenKey token = "token"
  method login (line 20) | func (c *Client) login(ctx context.Context) (string, error) {
  method Logout (line 62) | func (c *Client) Logout(ctx context.Context) error {
  method CreateAuthenticatedContext (line 99) | func (c *Client) CreateAuthenticatedContext(ctx context.Context) (contex...
  function getToken (line 108) | func getToken(ctx context.Context) string {

FILE: providers/dns/bluecat/internal/identity_test.go
  constant fakeToken (line 11) | fakeToken = "BAMAuthToken: dQfuRMTUxNjc3MjcyNDg1ODppcGFybXM="
  function TestClient_CreateAuthenticatedContext (line 13) | func TestClient_CreateAuthenticatedContext(t *testing.T) {

FILE: providers/dns/bluecat/internal/types.go
  type Entity (line 4) | type Entity struct
  type EntityResponse (line 12) | type EntityResponse struct

FILE: providers/dns/bluecatv2/bluecatv2.go
  constant envNamespace (line 20) | envNamespace = "BLUECATV2_"
  constant EnvServerURL (line 22) | EnvServerURL  = envNamespace + "SERVER_URL"
  constant EnvUsername (line 23) | EnvUsername   = envNamespace + "USERNAME"
  constant EnvPassword (line 24) | EnvPassword   = envNamespace + "PASSWORD"
  constant EnvConfigName (line 25) | EnvConfigName = envNamespace + "CONFIG_NAME"
  constant EnvViewName (line 26) | EnvViewName   = envNamespace + "VIEW_NAME"
  constant EnvSkipDeploy (line 27) | EnvSkipDeploy = envNamespace + "SKIP_DEPLOY"
  constant EnvTTL (line 29) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 30) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 31) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 32) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 36) | type Config struct
  function NewDefaultConfig (line 51) | func NewDefaultConfig() *Config {
  type DNSProvider (line 65) | type DNSProvider struct
    method Present (line 129) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 180) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 220) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method findZone (line 224) | func (d *DNSProvider) findZone(ctx context.Context, fqdn string) (*int...
  function NewDNSProvider (line 75) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 92) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/bluecatv2/bluecatv2_test.go
  constant envDomain (line 15) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 26) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 126) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 213) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 227) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 241) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 266) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_Present_skipDeploy (line 311) | func TestDNSProvider_Present_skipDeploy(t *testing.T) {
  function TestDNSProvider_CleanUp (line 363) | func TestDNSProvider_CleanUp(t *testing.T) {
  function TestDNSProvider_CleanUp_skipDeploy (line 386) | func TestDNSProvider_CleanUp_skipDeploy(t *testing.T) {

FILE: providers/dns/bluecatv2/internal/client.go
  type Client (line 21) | type Client struct
    method RetrieveZones (line 53) | func (c *Client) RetrieveZones(ctx context.Context, opts *CollectionOp...
    method RetrieveZoneDeployments (line 65) | func (c *Client) RetrieveZoneDeployments(ctx context.Context, zoneID i...
    method CreateZoneDeployment (line 77) | func (c *Client) CreateZoneDeployment(ctx context.Context, zoneID int6...
    method CreateZoneResourceRecord (line 100) | func (c *Client) CreateZoneResourceRecord(ctx context.Context, zoneID ...
    method DeleteResourceRecord (line 119) | func (c *Client) DeleteResourceRecord(ctx context.Context, recordID in...
    method do (line 130) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 30) | func NewClient(serverURL, username, password string) (*Client, error) {
  function retrieveCollection (line 161) | func retrieveCollection[T any](ctx context.Context, client *Client, endp...
  function newJSONRequest (line 186) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 210) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/bluecatv2/internal/client_test.go
  function mockBuilderAuthenticated (line 15) | func mockBuilderAuthenticated() *servermock.Builder[*Client] {
  function TestClient_RetrieveZones (line 35) | func TestClient_RetrieveZones(t *testing.T) {
  function TestClient_RetrieveZones_error (line 81) | func TestClient_RetrieveZones_error(t *testing.T) {
  function TestClient_RetrieveZoneDeployments (line 101) | func TestClient_RetrieveZoneDeployments(t *testing.T) {
  function TestClient_CreateZoneDeployment (line 134) | func TestClient_CreateZoneDeployment(t *testing.T) {
  function TestClient_CreateZoneResourceRecord (line 161) | func TestClient_CreateZoneResourceRecord(t *testing.T) {
  function TestClient_DeleteResourceRecord (line 199) | func TestClient_DeleteResourceRecord(t *testing.T) {

FILE: providers/dns/bluecatv2/internal/identity.go
  type token (line 9) | type token
  constant tokenKey (line 11) | tokenKey token = "token"
  constant authorizationHeader (line 13) | authorizationHeader = "Authorization"
  method CreateSession (line 16) | func (c *Client) CreateSession(ctx context.Context, info LoginInfo) (*Se...
  method CreateAuthenticatedContext (line 35) | func (c *Client) CreateAuthenticatedContext(ctx context.Context) (contex...
  method doAuthenticated (line 44) | func (c *Client) doAuthenticated(ctx context.Context, req *http.Request,...
  function getToken (line 53) | func getToken(ctx context.Context) string {

FILE: providers/dns/bluecatv2/internal/identity_test.go
  function mockBuilder (line 15) | func mockBuilder() *servermock.Builder[*Client] {
  function mockToken (line 33) | func mockToken(ctx context.Context) context.Context {
  function TestClient_CreateSession (line 37) | func TestClient_CreateSession(t *testing.T) {
  function TestClient_CreateAuthenticatedContext (line 70) | func TestClient_CreateAuthenticatedContext(t *testing.T) {

FILE: providers/dns/bluecatv2/internal/predicates.go
  type Predicate (line 8) | type Predicate struct
    method String (line 14) | func (p *Predicate) String() string {
  function Eq (line 23) | func Eq(field, value string) *Predicate {
  function Contains (line 27) | func Contains(field, value string) *Predicate {
  function StartsWith (line 31) | func StartsWith(field, value string) *Predicate {
  function EndsWith (line 35) | func EndsWith(field, value string) *Predicate {
  function In (line 39) | func In(field string, values ...string) *Predicate {
  type Combined (line 43) | type Combined struct
    method String (line 48) | func (o *Combined) String() string {
  function And (line 58) | func And(predicates ...*Predicate) *Combined {
  function Or (line 62) | func Or(predicates ...*Predicate) *Combined {

FILE: providers/dns/bluecatv2/internal/predicates_test.go
  function TestPredicate (line 10) | func TestPredicate(t *testing.T) {

FILE: providers/dns/bluecatv2/internal/types.go
  constant QDStatePending (line 12) | QDStatePending               = "PENDING"
  constant QDStateQueued (line 13) | QDStateQueued                = "QUEUED"
  constant QDStateRunning (line 14) | QDStateRunning               = "RUNNING"
  constant QDStateCancelled (line 15) | QDStateCancelled             = "CANCELLED"
  constant QDStateCancelling (line 16) | QDStateCancelling            = "CANCELLING"
  constant QDStateCompleted (line 17) | QDStateCompleted             = "COMPLETED"
  constant QDStateCompletedWithErrors (line 18) | QDStateCompletedWithErrors   = "COMPLETED_WITH_ERRORS"
  constant QDStateCompletedWithWarnings (line 19) | QDStateCompletedWithWarnings = "COMPLETED_WITH_WARNINGS"
  constant QDStateFailed (line 20) | QDStateFailed                = "FAILED"
  constant QDStateUnknown (line 21) | QDStateUnknown               = "UNKNOWN"
  type APIError (line 26) | type APIError struct
    method Error (line 33) | func (a *APIError) Error() string {
  type CommonResource (line 39) | type CommonResource struct
  type Collection (line 47) | type Collection struct
  type CollectionOptions (line 53) | type CollectionOptions struct
  type RecordTXT (line 71) | type RecordTXT struct
  type ZoneResource (line 82) | type ZoneResource struct
  type QuickDeployment (line 88) | type QuickDeployment struct
  type LoginInfo (line 103) | type LoginInfo struct
  type Session (line 110) | type Session struct

FILE: providers/dns/bookmyname/bookmyname.go
  constant envNamespace (line 20) | envNamespace = "BOOKMYNAME_"
  constant EnvUsername (line 22) | EnvUsername = envNamespace + "USERNAME"
  constant EnvPassword (line 23) | EnvPassword = envNamespace + "PASSWORD"
  constant EnvTTL (line 25) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 26) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 27) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 28) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 34) | type Config struct
  function NewDefaultConfig (line 45) | func NewDefaultConfig() *Config {
  type DNSProvider (line 57) | type DNSProvider struct
    method Present (line 100) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 119) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 139) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 63) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 77) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/bookmyname/bookmyname_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 72) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 120) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 134) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/bookmyname/internal/client.go
  constant defaultBaseURL (line 18) | defaultBaseURL = "https://www.bookmyname.com/dyndns/"
  type Client (line 21) | type Client struct
    method AddRecord (line 43) | func (c *Client) AddRecord(ctx context.Context, record Record) error {
    method RemoveRecord (line 57) | func (c *Client) RemoveRecord(ctx context.Context, record Record) error {
    method createEndpoint (line 71) | func (c *Client) createEndpoint(record Record, action string) (*url.UR...
    method do (line 89) | func (c *Client) do(ctx context.Context, endpoint *url.URL) error {
  function NewClient (line 30) | func NewClient(username, password string) (*Client, error) {

FILE: providers/dns/bookmyname/internal/client_test.go
  function mockBuilder (line 11) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_AddRecord (line 28) | func TestClient_AddRecord(t *testing.T) {
  function TestClient_AddRecord_error (line 52) | func TestClient_AddRecord_error(t *testing.T) {
  function TestClient_RemoveRecord (line 73) | func TestClient_RemoveRecord(t *testing.T) {
  function TestClient_RemoveRecord_error (line 97) | func TestClient_RemoveRecord_error(t *testing.T) {

FILE: providers/dns/bookmyname/internal/types.go
  type Record (line 3) | type Record struct

FILE: providers/dns/brandit/brandit.go
  constant envNamespace (line 21) | envNamespace = "BRANDIT_"
  constant EnvAPIKey (line 23) | EnvAPIKey      = envNamespace + "API_KEY"
  constant EnvAPIUsername (line 24) | EnvAPIUsername = envNamespace + "API_USERNAME"
  constant EnvTTL (line 26) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 27) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 28) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 29) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 35) | type Config struct
  function NewDefaultConfig (line 46) | func NewDefaultConfig() *Config {
  type DNSProvider (line 58) | type DNSProvider struct
    method Timeout (line 107) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 112) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 159) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 68) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 82) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/brandit/brandit_test.go
  constant envDomain (line 10) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 14) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 70) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 118) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 132) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/brandit/internal/client.go
  constant defaultBaseURL (line 21) | defaultBaseURL = "https://portal.brandit.com/api/v3/"
  type Client (line 24) | type Client struct
    method ListRecords (line 48) | func (c *Client) ListRecords(ctx context.Context, account, dnsZone str...
    method AddRecord (line 80) | func (c *Client) AddRecord(ctx context.Context, domainName, account, n...
    method DeleteRecord (line 104) | func (c *Client) DeleteRecord(ctx context.Context, domainName, account...
    method StatusDomain (line 117) | func (c *Client) StatusDomain(ctx context.Context, domain string) (*St...
    method do (line 133) | func (c *Client) do(ctx context.Context, query url.Values, result any)...
  function NewClient (line 33) | func NewClient(apiUsername, apiKey string) (*Client, error) {
  function sign (line 182) | func sign(apiUsername, apiKey string, query url.Values) (url.Values, err...

FILE: providers/dns/brandit/internal/client_test.go
  function mockBuilder (line 12) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_StatusDomain (line 29) | func TestClient_StatusDomain(t *testing.T) {
  function TestClient_StatusDomain_error (line 74) | func TestClient_StatusDomain_error(t *testing.T) {
  function TestClient_ListRecords (line 83) | func TestClient_ListRecords(t *testing.T) {
  function TestClient_ListRecords_error (line 112) | func TestClient_ListRecords_error(t *testing.T) {
  function TestClient_AddRecord (line 121) | func TestClient_AddRecord(t *testing.T) {
  function TestClient_AddRecord_error (line 160) | func TestClient_AddRecord_error(t *testing.T) {
  function TestClient_DeleteRecord (line 177) | func TestClient_DeleteRecord(t *testing.T) {
  function TestClient_DeleteRecord_error (line 196) | func TestClient_DeleteRecord_error(t *testing.T) {

FILE: providers/dns/brandit/internal/types.go
  type Response (line 5) | type Response struct
  type StatusResponse (line 12) | type StatusResponse struct
  type ListRecordsResponse (line 39) | type ListRecordsResponse struct
  type APIError (line 49) | type APIError struct
    method Error (line 55) | func (a APIError) Error() string {
  type AddRecord (line 59) | type AddRecord struct
  type AddRecordResponse (line 67) | type AddRecordResponse struct
  type Record (line 72) | type Record struct

FILE: providers/dns/bunny/bunny.go
  constant envNamespace (line 24) | envNamespace = "BUNNY_"
  constant EnvAPIKey (line 26) | EnvAPIKey = envNamespace + "API_KEY"
  constant EnvTTL (line 28) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 29) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 30) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 31) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant minTTL (line 34) | minTTL = 60
  type Config (line 39) | type Config struct
  function NewDefaultConfig (line 49) | func NewDefaultConfig() *Config {
  type DNSProvider (line 61) | type DNSProvider struct
    method Timeout (line 111) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 116) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 146) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method findZone (line 183) | func (d *DNSProvider) findZone(ctx context.Context, authZone string) (...
  function NewDNSProvider (line 68) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 81) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function findZone (line 197) | func findZone(zones *bunny.DNSZones, domain string) *bunny.DNSZone {
  function possibleDomains (line 221) | func possibleDomains(domain string) []string {

FILE: providers/dns/bunny/bunny_test.go
  constant envDomain (line 13) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 19) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 61) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 105) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 119) | func TestLiveCleanUp(t *testing.T) {
  function Test_findZone (line 133) | func Test_findZone(t *testing.T) {
  function Test_possibleDomains (line 209) | func Test_possibleDomains(t *testing.T) {

FILE: providers/dns/checkdomain/checkdomain.go
  constant envNamespace (line 21) | envNamespace = "CHECKDOMAIN_"
  constant EnvEndpoint (line 23) | EnvEndpoint = envNamespace + "ENDPOINT"
  constant EnvToken (line 24) | EnvToken    = envNamespace + "TOKEN"
  constant EnvTTL (line 26) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 27) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 28) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 29) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 35) | type Config struct
  function NewDefaultConfig (line 45) | func NewDefaultConfig() *Config {
  type DNSProvider (line 57) | type DNSProvider struct
    method Present (line 105) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 135) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 163) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
  function NewDNSProvider (line 63) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 82) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/checkdomain/checkdomain_test.go
  constant envDomain (line 12) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 19) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 67) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 106) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 120) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/checkdomain/internal/client.go
  constant ns1 (line 22) | ns1 = "ns.checkdomain.de"
  constant ns2 (line 23) | ns2 = "ns2.checkdomain.de"
  constant DefaultEndpoint (line 27) | DefaultEndpoint = "https://api.checkdomain.de"
  constant domainNotFound (line 29) | domainNotFound = -1
  constant maxLimit (line 32) | maxLimit = 100
  constant maxInt (line 35) | maxInt = int((^uint(0)) >> 1)
  type Client (line 38) | type Client struct
    method GetDomainIDByName (line 61) | func (c *Client) GetDomainIDByName(ctx context.Context, name string) (...
    method listDomains (line 91) | func (c *Client) listDomains(ctx context.Context) ([]*Domain, error) {
    method getNameserverInfo (line 133) | func (c *Client) getNameserverInfo(ctx context.Context, domainID int) ...
    method CheckNameservers (line 149) | func (c *Client) CheckNameservers(ctx context.Context, domainID int) e...
    method CreateRecord (line 173) | func (c *Client) CreateRecord(ctx context.Context, domainID int, recor...
    method DeleteTXTRecord (line 187) | func (c *Client) DeleteTXTRecord(ctx context.Context, domainID int, re...
    method getDomainInfo (line 226) | func (c *Client) getDomainInfo(ctx context.Context, domainID int) (*Do...
    method listRecords (line 244) | func (c *Client) listRecords(ctx context.Context, domainID int, record...
    method replaceRecords (line 286) | func (c *Client) replaceRecords(ctx context.Context, domainID int, rec...
    method do (line 297) | func (c *Client) do(req *http.Request, result any) error {
    method CleanCache (line 326) | func (c *Client) CleanCache(fqdn string) {
  function NewClient (line 47) | func NewClient(hc *http.Client) *Client {
  function skipRecord (line 332) | func skipRecord(recordName, recordValue string, record *Record, nsInfo *...
  function newJSONRequest (line 354) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function OAuthStaticAccessToken (line 378) | func OAuthStaticAccessToken(client *http.Client, accessToken string) *ht...

FILE: providers/dns/checkdomain/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_GetDomainIDByName (line 26) | func TestClient_GetDomainIDByName(t *testing.T) {
  function TestClient_CheckNameservers (line 43) | func TestClient_CheckNameservers(t *testing.T) {
  function TestClient_CreateRecord (line 59) | func TestClient_CreateRecord(t *testing.T) {
  function TestClient_DeleteTXTRecord (line 76) | func TestClient_DeleteTXTRecord(t *testing.T) {

FILE: providers/dns/checkdomain/internal/types.go
  type DomainListingResponse (line 6) | type DomainListingResponse struct
  type EmbeddedDomainList (line 14) | type EmbeddedDomainList struct
  type Domain (line 18) | type Domain struct
  type DomainResponse (line 23) | type DomainResponse struct
  type NameserverResponse (line 31) | type NameserverResponse struct
  type NameserverGeneral (line 37) | type NameserverGeneral struct
  type NameserverSOA (line 43) | type NameserverSOA struct
  type Nameserver (line 51) | type Nameserver struct
  type RecordListingResponse (line 55) | type RecordListingResponse struct
  type EmbeddedRecordList (line 63) | type EmbeddedRecordList struct
  type Record (line 67) | type Record struct

FILE: providers/dns/civo/civo.go
  constant envNamespace (line 20) | envNamespace = "CIVO_"
  constant EnvAPIToken (line 22) | EnvAPIToken = envNamespace + "TOKEN"
  constant EnvTTL (line 24) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 25) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 26) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 27) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant minTTL (line 31) | minTTL                    = 600
  constant defaultPollingInterval (line 32) | defaultPollingInterval    = 30 * time.Second
  constant defaultPropagationTimeout (line 33) | defaultPropagationTimeout = 300 * time.Second
  type Config (line 39) | type Config struct
  function NewDefaultConfig (line 49) | func NewDefaultConfig() *Config {
  type DNSProvider (line 61) | type DNSProvider struct
    method Present (line 108) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 144) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
    method Timeout (line 190) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method getDomainIDByName (line 194) | func (d *DNSProvider) getDomainIDByName(ctx context.Context, domain st...
  function NewDNSProvider (line 68) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 81) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/civo/civo_test.go
  constant envDomain (line 16) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 21) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 64) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 104) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 118) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 134) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 157) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 174) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/civo/internal/client.go
  constant defaultBaseURL (line 27) | defaultBaseURL = "https://api.civo.com/v2"
  type Client (line 30) | type Client struct
    method ListDomains (line 54) | func (c *Client) ListDomains(ctx context.Context) ([]Domain, error) {
    method ListDNSRecords (line 74) | func (c *Client) ListDNSRecords(ctx context.Context, domainID string) ...
    method CreateDNSRecord (line 94) | func (c *Client) CreateDNSRecord(ctx context.Context, domainID string,...
    method DeleteDNSRecord (line 114) | func (c *Client) DeleteDNSRecord(ctx context.Context, record Record) e...
    method do (line 125) | func (c *Client) do(req *http.Request, result any) error {
    method newJSONRequest (line 154) | func (c *Client) newJSONRequest(ctx context.Context, method string, en...
  function NewClient (line 38) | func NewClient(hc *http.Client, region string) (*Client, error) {
  function parseError (line 187) | func parseError(req *http.Request, resp *http.Response) error {
  function OAuthStaticAccessToken (line 202) | func OAuthStaticAccessToken(client *http.Client, accessToken string) *ht...

FILE: providers/dns/civo/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_ListDomains (line 34) | func TestClient_ListDomains(t *testing.T) {
  function TestClient_ListDNSRecords (line 54) | func TestClient_ListDNSRecords(t *testing.T) {
  function TestClient_ListDNSRecords_error (line 79) | func TestClient_ListDNSRecords_error(t *testing.T) {
  function TestClient_ListDNSRecords_error_raw (line 90) | func TestClient_ListDNSRecords_error_raw(t *testing.T) {
  function TestClient_CreateDNSRecord (line 106) | func TestClient_CreateDNSRecord(t *testing.T) {
  function TestClient_DeleteDNSRecord (line 135) | func TestClient_DeleteDNSRecord(t *testing.T) {

FILE: providers/dns/civo/internal/types.go
  type APIError (line 5) | type APIError struct
    method Error (line 10) | func (a *APIError) Error() string {
  type Record (line 14) | type Record struct
  type Domain (line 24) | type Domain struct

FILE: providers/dns/clouddns/clouddns.go
  constant envNamespace (line 20) | envNamespace = "CLOUDDNS_"
  constant EnvClientID (line 22) | EnvClientID = envNamespace + "CLIENT_ID"
  constant EnvEmail (line 23) | EnvEmail    = envNamespace + "EMAIL"
  constant EnvPassword (line 24) | EnvPassword = envNamespace + "PASSWORD"
  constant EnvTTL (line 26) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 27) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 28) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 29) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  type Config (line 35) | type Config struct
  function NewDefaultConfig (line 47) | func NewDefaultConfig() *Config {
  type DNSProvider (line 59) | type DNSProvider struct
    method Timeout (line 104) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 109) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 131) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 67) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 82) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {

FILE: providers/dns/clouddns/clouddns_test.go
  constant envDomain (line 12) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 20) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderConfig (line 85) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 146) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 160) | func TestLiveCleanUp(t *testing.T) {

FILE: providers/dns/clouddns/internal/client.go
  constant apiBaseURL (line 16) | apiBaseURL = "https://admin.vshosting.cloud/clouddns"
  constant authorizationHeader (line 18) | authorizationHeader = "Authorization"
  type Client (line 21) | type Client struct
    method AddRecord (line 51) | func (c *Client) AddRecord(ctx context.Context, zone, recordName, reco...
    method DeleteRecord (line 68) | func (c *Client) DeleteRecord(ctx context.Context, zone, recordName st...
    method addTxtRecord (line 87) | func (c *Client) addTxtRecord(ctx context.Context, record Record) error {
    method deleteRecord (line 98) | func (c *Client) deleteRecord(ctx context.Context, record Record) error {
    method getDomain (line 109) | func (c *Client) getDomain(ctx context.Context, zone string) (Domain, ...
    method getRecord (line 138) | func (c *Client) getRecord(ctx context.Context, domainID, recordName s...
    method publishRecords (line 162) | func (c *Client) publishRecords(ctx context.Context, domainID string) ...
    method do (line 175) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 35) | func NewClient(clientID, email, password string, ttl int) *Client {
  function newJSONRequest (line 209) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 233) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/clouddns/internal/client_test.go
  function mockBuilder (line 12) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_AddRecord (line 26) | func TestClient_AddRecord(t *testing.T) {
  function TestClient_DeleteRecord (line 47) | func TestClient_DeleteRecord(t *testing.T) {

FILE: providers/dns/clouddns/internal/identity.go
  constant loginURL (line 8) | loginURL = "https://admin.vshosting.cloud/api/public/auth/login"
  type token (line 10) | type token
  constant accessTokenKey (line 12) | accessTokenKey token = "accessToken"
  method login (line 14) | func (c *Client) login(ctx context.Context) (*AuthResponse, error) {
  method CreateAuthenticatedContext (line 32) | func (c *Client) CreateAuthenticatedContext(ctx context.Context) (contex...
  function getAccessToken (line 41) | func getAccessToken(ctx context.Context) string {

FILE: providers/dns/clouddns/internal/identity_test.go
  function TestClient_CreateAuthenticatedContext (line 11) | func TestClient_CreateAuthenticatedContext(t *testing.T) {

FILE: providers/dns/clouddns/internal/types.go
  type APIError (line 5) | type APIError struct
  type ErrorContent (line 9) | type ErrorContent struct
    method Error (line 14) | func (e ErrorContent) Error() string {
  type Authorization (line 18) | type Authorization struct
  type AuthResponse (line 23) | type AuthResponse struct
  type Auth (line 27) | type Auth struct
  type SearchQuery (line 32) | type SearchQuery struct
  type Search (line 40) | type Search struct
  type Sort (line 47) | type Sort struct
  type SearchResponse (line 52) | type SearchResponse struct
  type Domain (line 59) | type Domain struct
  type Record (line 66) | type Record struct
  type DomainInfo (line 74) | type DomainInfo struct

FILE: providers/dns/cloudflare/cloudflare.go
  constant envNamespace (line 23) | envNamespace = "CLOUDFLARE_"
  constant EnvEmail (line 25) | EnvEmail  = envNamespace + "EMAIL"
  constant EnvAPIKey (line 26) | EnvAPIKey = envNamespace + "API_KEY"
  constant EnvDNSAPIToken (line 28) | EnvDNSAPIToken  = envNamespace + "DNS_API_TOKEN"
  constant EnvZoneAPIToken (line 29) | EnvZoneAPIToken = envNamespace + "ZONE_API_TOKEN"
  constant EnvBaseURL (line 31) | EnvBaseURL = envNamespace + "BASE_URL"
  constant EnvTTL (line 33) | EnvTTL                = envNamespace + "TTL"
  constant EnvPropagationTimeout (line 34) | EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
  constant EnvPollingInterval (line 35) | EnvPollingInterval    = envNamespace + "POLLING_INTERVAL"
  constant EnvHTTPTimeout (line 36) | EnvHTTPTimeout        = envNamespace + "HTTP_TIMEOUT"
  constant altEnvNamespace (line 40) | altEnvNamespace = "CF_"
  constant altEnvEmail (line 42) | altEnvEmail = altEnvNamespace + "API_EMAIL"
  constant minTTL (line 46) | minTTL = 120
  type Config (line 52) | type Config struct
  function NewDefaultConfig (line 68) | func NewDefaultConfig() *Config {
  type DNSProvider (line 80) | type DNSProvider struct
    method Timeout (line 152) | func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
    method Present (line 157) | func (d *DNSProvider) Present(domain, token, keyAuth string) error {
    method CleanUp (line 194) | func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
  function NewDNSProvider (line 100) | func NewDNSProvider() (*DNSProvider, error) {
  function NewDNSProviderConfig (line 129) | func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
  function altEnvName (line 231) | func altEnvName(v string) string {

FILE: providers/dns/cloudflare/cloudflare_test.go
  constant envDomain (line 14) | envDomain = envNamespace + "DOMAIN"
  function TestNewDNSProvider (line 28) | func TestNewDNSProvider(t *testing.T) {
  function TestNewDNSProviderWithToken (line 103) | func TestNewDNSProviderWithToken(t *testing.T) {
  function TestNewDNSProviderConfig (line 217) | func TestNewDNSProviderConfig(t *testing.T) {
  function TestLivePresent (line 277) | func TestLivePresent(t *testing.T) {
  function TestLiveCleanUp (line 291) | func TestLiveCleanUp(t *testing.T) {
  function mockBuilder (line 307) | func mockBuilder() *servermock.Builder[*DNSProvider] {
  function TestDNSProvider_Present (line 325) | func TestDNSProvider_Present(t *testing.T) {
  function TestDNSProvider_CleanUp (line 345) | func TestDNSProvider_CleanUp(t *testing.T) {

FILE: providers/dns/cloudflare/internal/client.go
  constant defaultBaseURL (line 25) | defaultBaseURL = "https://api.cloudflare.com/client/v4"
  type Client (line 28) | type Client struct
    method CreateDNSRecord (line 72) | func (c *Client) CreateDNSRecord(ctx context.Context, zoneID string, r...
    method DeleteDNSRecord (line 92) | func (c *Client) DeleteDNSRecord(ctx context.Context, zoneID, recordID...
    method ZonesByName (line 105) | func (c *Client) ZonesByName(ctx context.Context, name string) ([]Zone...
    method do (line 128) | func (c *Client) do(req *http.Request, result any) error {
  function NewClient (line 38) | func NewClient(opts ...Option) (*Client, error) {
  function newJSONRequest (line 167) | func newJSONRequest(ctx context.Context, method string, endpoint *url.UR...
  function parseError (line 191) | func parseError(req *http.Request, resp *http.Response) error {

FILE: providers/dns/cloudflare/internal/client_test.go
  function mockBuilder (line 14) | func mockBuilder() *servermock.Builder[*Client] {
  function TestClient_CreateDNSRecord (line 36) | func TestClient_CreateDNSRecord(t *testing.T) {
  function TestClient_CreateDNSRecord_error (line 67) | func TestClient_CreateDNSRecord_error(t *testing.T) {
  function TestClient_DeleteDNSRecord (line 85) | func TestClient_DeleteDNSRecord(t *testing.T) {
  function TestClient_DeleteDNSRecord_error (line 95) | func TestClient_DeleteDNSRecord_error(t *testing.T) {
  function TestClient_ZonesByName (line 106) | func TestClient_ZonesByName(t *testing.T) {
  function TestClient_ZonesByName_error (line 167) | func TestClient_ZonesByName_error(t *testing.T) {

FILE: providers/dns/cloudflare/internal/options.go
  type Option (line 8) | type Option
  function WithAuthKey (line 10) | func WithAuthKey(authEmail, authKey string) Option {
  function WithAuthToken (line 19) | func WithAuthToken(authToken string) Option {
  function WithBaseURL (line 27) | func WithBaseURL(baseURL string) Option {
  function WithHTTPClient (line 44) | func WithHTTPClient(client *http.Client) Option {

FILE: providers/dns/cloudflare/internal/types.go
  type Record (line 8) | type Record struct
  type APIResponse (line 17) | type APIResponse struct
  type Message (line 25) | type Message struct
  type Source (line 33) | type Source struct
  type ErrorChain (line 37) | type ErrorChain struct
  type Errors (line 42) | type Errors
    method Error (line 44) | func (e Errors) Error() string {
  type ResultInfo (line 58) | type ResultInfo struct
  type Zone (line 66) | type Zone struct
  type Account (line 82) | type Account struct
  type Meta (line 87) | type Meta struct
  type Owner (line 97) | type Owner struct
  type Plan (line 103) | type Plan struct
  type Tenant (line 116) | type Tenant struct
  type TenantUnit (line 121) | type TenantUnit struct

FILE: providers/dns/cloudflare/wrapper.go
  type metaClient (line 12) | type metaClient struct
    method CreateDNSRecord (line 72) | func (m *metaClient) CreateDNSRecord(ctx context.Context, zoneID strin...
    method DeleteDNSRecord (line 76) | func (m *metaClient) 
Condensed preview — 2074 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,925K chars).
[
  {
    "path": ".dockerignore",
    "chars": 62,
    "preview": "lego.exe\n.lego\n.gitcookies\n.idea\n.vscode/\ndist/\nbuilds/\ndocs/\n"
  },
  {
    "path": ".gitattributes",
    "chars": 81,
    "preview": "**/zz_gen_*.*   linguist-generated\ndocs/data/zz_cli_help.toml linguist-generated\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 2380,
    "preview": "name: 🐞 Bug Report\ndescription: Create a report to help us improve.\nlabels: [bug]\nbody:\n  - type: checkboxes\n    id: ter"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 339,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: ❓ Questions\n    url: https://github.com/go-acme/lego/discussions\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1078,
    "preview": "name: 💡 Feature request\ndescription: Suggest an idea for this project.\nbody:\n  - type: checkboxes\n    id: terms\n    attr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new_dns_provider.yml",
    "chars": 2175,
    "preview": "name: 🧩 New DNS provider support\ndescription: Request for the support of a new DNS provider.\ntitle: \"Support for provide"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/mnp.md",
    "chars": 1040,
    "preview": "PULL REQUEST TEMPLATE FOR MAINTAINERS ONLY.\n\nhttps://github.com/go-acme/lego/compare/master...ldez:branch?quick_pull=1&t"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 469,
    "preview": "<!--\n\nIMPORTANT:\n\n1. Create an issue and wait for a maintainer to approve it BEFORE opening a pull request.\n2. Don't ope"
  },
  {
    "path": ".github/workflows/documentation.yml",
    "chars": 1045,
    "preview": "name: Documentation\n\non:\n  push:\n    branches:\n      - master\n\njobs:\n\n  doc:\n    name: Build and deploy documentation\n  "
  },
  {
    "path": ".github/workflows/go-cross.yml",
    "chars": 591,
    "preview": "name: Go Matrix\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n\n  cross:\n    name: Go\n    runs-on: ${{"
  },
  {
    "path": ".github/workflows/pr.yml",
    "chars": 1542,
    "preview": "name: Main\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n\n  main:\n    name: Main Process\n    runs-on:"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2493,
    "preview": "name: Release\n\non:\n  push:\n    tags:\n      - v*\n\npermissions:\n  # Allow the workflow to write attestations.\n  id-token: "
  },
  {
    "path": ".gitignore",
    "chars": 47,
    "preview": ".lego\n.gitcookies\n.idea\n.vscode/\ndist/\nbuilds/\n"
  },
  {
    "path": ".golangci.yml",
    "chars": 8082,
    "preview": "version: \"2\"\n\nformatters:\n  enable:\n    - gci\n    - gofmt\n    - gofumpt\n    - goimports\n  settings:\n    gofumpt:\n      e"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 4108,
    "preview": "version: 2\n\nproject_name: lego\n\nbuilds:\n  - binary: lego\n\n    main: ./cmd/lego/\n    env:\n      - CGO_ENABLED=0\n    flags"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 62820,
    "preview": "# Changelog\n\nlego is an independent, free, open-source project, if you value it, consider [supporting it](https://donate"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2327,
    "preview": "# How to contribute to lego\n\nContributions in the form of patches and proposals are essential to keep lego great and to "
  },
  {
    "path": "Dockerfile",
    "chars": 412,
    "preview": "FROM golang:1-alpine as builder\n\nRUN apk --no-cache --no-progress add make git\n\nWORKDIR /go/lego\n\nENV GO111MODULE on\n\n# "
  },
  {
    "path": "LICENSE",
    "chars": 1130,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2017-2024 Ludovic Fernandez\nCopyright (c) 2015-2017 Sebastian Erhart\n\nPermission is"
  },
  {
    "path": "Makefile",
    "chars": 1752,
    "preview": ".PHONY: clean checks test build image e2e fmt\n\nexport GO111MODULE=on\nexport CGO_ENABLED=0\n\nLEGO_IMAGE := goacme/lego\nMAI"
  },
  {
    "path": "README.md",
    "chars": 18954,
    "preview": "<div align=\"center\">\n  <img alt=\"lego logo\" src=\"./docs/static/images/lego-logo.min.svg\">\n  <p>Automatic Certificates an"
  },
  {
    "path": "acme/api/account.go",
    "chars": 2474,
    "preview": "package api\n\nimport (\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\ntype AccountService ser"
  },
  {
    "path": "acme/api/account_test.go",
    "chars": 622,
    "preview": "package api\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc T"
  },
  {
    "path": "acme/api/api.go",
    "chars": 4570,
    "preview": "package api\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/"
  },
  {
    "path": "acme/api/authorization.go",
    "chars": 822,
    "preview": "package api\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\ntype AuthorizationService service\n\n// Get Gets an"
  },
  {
    "path": "acme/api/certificate.go",
    "chars": 2589,
    "preview": "package api\n\nimport (\n\t\"bytes\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\n// max"
  },
  {
    "path": "acme/api/certificate_test.go",
    "chars": 4927,
    "preview": "package api\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/platform/tester\"\n\t\"github.co"
  },
  {
    "path": "acme/api/challenge.go",
    "chars": 1227,
    "preview": "package api\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\ntype ChallengeService service\n\n// New Creates a c"
  },
  {
    "path": "acme/api/identifier.go",
    "chars": 1089,
    "preview": "package api\n\nimport (\n\t\"cmp\"\n\t\"net\"\n\t\"slices\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\nfunc createIdentifiers(domains []st"
  },
  {
    "path": "acme/api/identifier_test.go",
    "chars": 2586,
    "preview": "package api\n\nimport (\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_"
  },
  {
    "path": "acme/api/internal/nonces/nonce_manager.go",
    "chars": 1485,
    "preview": "package nonces\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\n\t\"github.com/go-acme/lego/v4/acme/api/internal/sender\"\n)\n"
  },
  {
    "path": "acme/api/internal/nonces/nonce_manager_test.go",
    "chars": 1308,
    "preview": "package nonces\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"githu"
  },
  {
    "path": "acme/api/internal/secure/jws.go",
    "chars": 3013,
    "preview": "package secure\n\nimport (\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rsa\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\n\t\"github."
  },
  {
    "path": "acme/api/internal/secure/jws_test.go",
    "chars": 1377,
    "preview": "package secure\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"githu"
  },
  {
    "path": "acme/api/internal/sender/sender.go",
    "chars": 4880,
    "preview": "package sender\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/go-acme/lego/v4/a"
  },
  {
    "path": "acme/api/internal/sender/sender_test.go",
    "chars": 3712,
    "preview": "package sender\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/go-acme/leg"
  },
  {
    "path": "acme/api/internal/sender/useragent.go",
    "chars": 413,
    "preview": "// Code generated by 'internal/releaser'; DO NOT EDIT.\n\npackage sender\n\nconst (\n\t// ourUserAgent is the User-Agent of th"
  },
  {
    "path": "acme/api/order.go",
    "chars": 4148,
    "preview": "package api\n\nimport (\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\n// Or"
  },
  {
    "path": "acme/api/order_test.go",
    "chars": 3065,
    "preview": "package api\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"encoding/json\"\n\t\"io\"\n\t\"net/http\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/g"
  },
  {
    "path": "acme/api/renewal.go",
    "chars": 975,
    "preview": "package api\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n)\n\n// ErrNoARI is returned when the server does not advertise a renewal info"
  },
  {
    "path": "acme/api/service.go",
    "chars": 1797,
    "preview": "package api\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"time\"\n)\n\ntype service struct {\n\tcore *Core\n}\n\n// getLink"
  },
  {
    "path": "acme/api/service_test.go",
    "chars": 1943,
    "preview": "package api\n\nimport (\n\t\"net/http\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testif"
  },
  {
    "path": "acme/commons.go",
    "chars": 16243,
    "preview": "// Package acme contains all objects related the ACME endpoints.\n// https://www.rfc-editor.org/rfc/rfc8555.html\npackage "
  },
  {
    "path": "acme/errors.go",
    "chars": 2578,
    "preview": "package acme\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// Errors types.\nconst (\n\terrNS              = \"urn:ietf:params:acme:error:\""
  },
  {
    "path": "buildx.Dockerfile",
    "chars": 224,
    "preview": "# syntax=docker/dockerfile:1.4\nFROM alpine:3\n\nARG TARGETPLATFORM\n\nRUN apk --no-cache --no-progress add git ca-certificat"
  },
  {
    "path": "certcrypto/crypto.go",
    "chars": 9626,
    "preview": "package certcrypto\n\nimport (\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/ed25519\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\""
  },
  {
    "path": "certcrypto/crypto_test.go",
    "chars": 5076,
    "preview": "package certcrypto\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"encoding/pem\"\n\t\"testing\"\n\t\"time\"\n\n\t\"githu"
  },
  {
    "path": "certificate/authorization.go",
    "chars": 1666,
    "preview": "package certificate\n\nimport (\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/log\"\n)\n\nfunc (c *"
  },
  {
    "path": "certificate/certificates.go",
    "chars": 22960,
    "preview": "package certificate\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/x509\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\""
  },
  {
    "path": "certificate/certificates_test.go",
    "chars": 16578,
    "preview": "package certificate\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/a"
  },
  {
    "path": "certificate/errors.go",
    "chars": 614,
    "preview": "package certificate\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\ntype obtainError struct {\n\tdata map[string]error\n}\n\nfunc newObtainErro"
  },
  {
    "path": "certificate/errors_test.go",
    "chars": 1279,
    "preview": "package certificate\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\ntype TomatoError struct{}\n"
  },
  {
    "path": "certificate/renewal.go",
    "chars": 4662,
    "preview": "package certificate\n\nimport (\n\t\"crypto/x509\"\n\t\"encoding/asn1\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"mat"
  },
  {
    "path": "certificate/renewal_test.go",
    "chars": 7174,
    "preview": "package certificate\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"net/http\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/"
  },
  {
    "path": "challenge/challenges.go",
    "chars": 1239,
    "preview": "package challenge\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n)\n\n// Type is a string that identifies a particul"
  },
  {
    "path": "challenge/dns01/cname.go",
    "chars": 320,
    "preview": "package dns01\n\nimport (\n\t\"strings\"\n\n\t\"github.com/miekg/dns\"\n)\n\n// Update FQDN with CNAME if any.\nfunc updateDomainWithCN"
  },
  {
    "path": "challenge/dns01/cname_test.go",
    "chars": 713,
    "preview": "package dns01\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/miekg/dns\"\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Tes"
  },
  {
    "path": "challenge/dns01/dns_challenge.go",
    "chars": 6124,
    "preview": "package dns01\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-"
  },
  {
    "path": "challenge/dns01/dns_challenge_manual.go",
    "chars": 1910,
    "preview": "package dns01\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n)\n\nconst (\n\tdnsTemplate = `%s %d IN TXT %q`\n)\n\n// DNSProviderManua"
  },
  {
    "path": "challenge/dns01/dns_challenge_test.go",
    "chars": 9798,
    "preview": "package dns01\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\""
  },
  {
    "path": "challenge/dns01/domain.go",
    "chars": 598,
    "preview": "package dns01\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/miekg/dns\"\n)\n\n// ExtractSubDomain extracts the subdomain part fr"
  },
  {
    "path": "challenge/dns01/domain_test.go",
    "chars": 2041,
    "preview": "package dns01\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc"
  },
  {
    "path": "challenge/dns01/fixtures/resolv.conf.1",
    "chars": 131,
    "preview": "domain example.com\nnameserver 10.200.3.249\nnameserver 10.200.3.250:5353\nnameserver 2001:4860:4860::8844\nnameserver [10.0"
  },
  {
    "path": "challenge/dns01/fqdn.go",
    "chars": 1118,
    "preview": "package dns01\n\nimport (\n\t\"iter\"\n\n\t\"github.com/miekg/dns\"\n)\n\n// ToFqdn converts the name into a fqdn appending a trailing"
  },
  {
    "path": "challenge/dns01/fqdn_test.go",
    "chars": 2507,
    "preview": "package dns01\n\nimport (\n\t\"slices\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestUnFqdn(t *testing.T) {\n\t"
  },
  {
    "path": "challenge/dns01/mock_test.go",
    "chars": 1778,
    "preview": "package dns01\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/miekg/dns\"\n\t\"github.com/stretchr/testify/requ"
  },
  {
    "path": "challenge/dns01/nameserver.go",
    "chars": 8870,
    "preview": "package dns01\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/miek"
  },
  {
    "path": "challenge/dns01/nameserver_test.go",
    "chars": 10294,
    "preview": "package dns01\n\nimport (\n\t\"errors\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/platform/tester/dnsmock\"\n\t\"github.com"
  },
  {
    "path": "challenge/dns01/nameserver_unix.go",
    "chars": 158,
    "preview": "//go:build !windows\n\npackage dns01\n\nimport \"time\"\n\n// dnsTimeout is used to override the default DNS timeout of 10 secon"
  },
  {
    "path": "challenge/dns01/nameserver_windows.go",
    "chars": 157,
    "preview": "//go:build windows\n\npackage dns01\n\nimport \"time\"\n\n// dnsTimeout is used to override the default DNS timeout of 20 second"
  },
  {
    "path": "challenge/dns01/precheck.go",
    "chars": 4401,
    "preview": "package dns01\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/miekg/dns\"\n)\n\n// defaultNameserverPort used by au"
  },
  {
    "path": "challenge/dns01/precheck_test.go",
    "chars": 4017,
    "preview": "package dns01\n\nimport (\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/platform/tester/dnsmock\"\n\t\"github.com/miekg/dns\"\n\t\"gith"
  },
  {
    "path": "challenge/http01/domain_matcher.go",
    "chars": 4961,
    "preview": "package http01\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/netip\"\n\t\"strings\"\n)\n\n// A domainMatcher tries to match a domain (the o"
  },
  {
    "path": "challenge/http01/domain_matcher_test.go",
    "chars": 2909,
    "preview": "package http01\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com"
  },
  {
    "path": "challenge/http01/http_challenge.go",
    "chars": 2139,
    "preview": "package http01\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/acme/api\"\n\t\"git"
  },
  {
    "path": "challenge/http01/http_challenge_server.go",
    "chars": 4563,
    "preview": "package http01\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/textproto\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/go-acme/lego"
  },
  {
    "path": "challenge/http01/http_challenge_test.go",
    "chars": 10352,
    "preview": "package http01\n\nimport (\n\t\"context\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/textprot"
  },
  {
    "path": "challenge/provider.go",
    "chars": 1054,
    "preview": "package challenge\n\nimport \"time\"\n\n// Provider enables implementing a custom challenge\n// provider. Present presents the "
  },
  {
    "path": "challenge/resolver/errors.go",
    "chars": 652,
    "preview": "package resolver\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"maps\"\n\t\"slices\"\n\t\"sort\"\n)\n\n// obtainError is returned when there are specif"
  },
  {
    "path": "challenge/resolver/errors_test.go",
    "chars": 1367,
    "preview": "package resolver\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/stretchr/testify/assert"
  },
  {
    "path": "challenge/resolver/prober.go",
    "chars": 6589,
    "preview": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/challenge\"\n\t\""
  },
  {
    "path": "challenge/resolver/prober_mock_test.go",
    "chars": 1861,
    "preview": "package resolver\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/challenge\"\n)\n"
  },
  {
    "path": "challenge/resolver/prober_test.go",
    "chars": 4767,
    "preview": "package resolver\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/"
  },
  {
    "path": "challenge/resolver/solver_manager.go",
    "chars": 5272,
    "preview": "package resolver\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/cenkalti/backoff/v5\"\n\t\"github.com/g"
  },
  {
    "path": "challenge/resolver/solver_manager_test.go",
    "chars": 7317,
    "preview": "package resolver\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/go-acm"
  },
  {
    "path": "challenge/tlsalpn01/tls_alpn_challenge.go",
    "chars": 4289,
    "preview": "package tlsalpn01\n\nimport (\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"crypto/tls\"\n\t\"crypto/x509/pkix\"\n\t\"encoding/asn1\"\n\t\"fmt\"\n\t\"t"
  },
  {
    "path": "challenge/tlsalpn01/tls_alpn_challenge_server.go",
    "chars": 2761,
    "preview": "package tlsalpn01\n\nimport (\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/go-acme/lego/v4/l"
  },
  {
    "path": "challenge/tlsalpn01/tls_alpn_challenge_test.go",
    "chars": 6226,
    "preview": "package tlsalpn01\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"crypto/subtle\"\n\t\"crypto/tls\"\n\t\"encoding/asn1"
  },
  {
    "path": "cmd/account.go",
    "chars": 736,
    "preview": "package cmd\n\nimport (\n\t\"crypto\"\n\n\t\"github.com/go-acme/lego/v4/registration\"\n)\n\n// Account represents a users local saved"
  },
  {
    "path": "cmd/accounts_storage.go",
    "chars": 6515,
    "preview": "package cmd\n\nimport (\n\t\"crypto\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github."
  },
  {
    "path": "cmd/certs_storage.go",
    "chars": 8670,
    "preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t"
  },
  {
    "path": "cmd/certs_storage_test.go",
    "chars": 2669,
    "preview": "package cmd\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/st"
  },
  {
    "path": "cmd/cmd.go",
    "chars": 245,
    "preview": "package cmd\n\nimport \"github.com/urfave/cli/v2\"\n\n// CreateCommands Creates all CLI commands.\nfunc CreateCommands() []*cli"
  },
  {
    "path": "cmd/cmd_before.go",
    "chars": 519,
    "preview": "package cmd\n\nimport (\n\t\"github.com/go-acme/lego/v4/log\"\n\t\"github.com/urfave/cli/v2\"\n)\n\nfunc Before(ctx *cli.Context) err"
  },
  {
    "path": "cmd/cmd_dnshelp.go",
    "chars": 1473,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\n\t\"github.com/urfave/cli/v2\"\n)\n\nconst flgCode = \"code\"\n\n"
  },
  {
    "path": "cmd/cmd_list.go",
    "chars": 3112,
    "preview": "package cmd\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-acme/"
  },
  {
    "path": "cmd/cmd_renew.go",
    "chars": 14111,
    "preview": "package cmd\n\nimport (\n\t\"crypto\"\n\t\"crypto/x509\"\n\t\"errors\"\n\t\"math/rand\"\n\t\"os\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego"
  },
  {
    "path": "cmd/cmd_renew_test.go",
    "chars": 4151,
    "preview": "package cmd\n\nimport (\n\t\"crypto/x509\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_merge(t *tes"
  },
  {
    "path": "cmd/cmd_revoke.go",
    "chars": 2147,
    "preview": "package cmd\n\nimport (\n\t\"github.com/go-acme/lego/v4/acme\"\n\t\"github.com/go-acme/lego/v4/log\"\n\t\"github.com/urfave/cli/v2\"\n)"
  },
  {
    "path": "cmd/cmd_run.go",
    "chars": 7892,
    "preview": "package cmd\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/certificate\"\n\t\"github.com/g"
  },
  {
    "path": "cmd/flags.go",
    "chars": 9352,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/certificate\"\n\t\"github.com/go-acme/lego/v4/lego\"\n\t\"git"
  },
  {
    "path": "cmd/hook.go",
    "chars": 2228,
    "preview": "package cmd\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-acme/leg"
  },
  {
    "path": "cmd/hook_test.go",
    "chars": 1247,
    "preview": "package cmd\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_launchHook(t *t"
  },
  {
    "path": "cmd/lego/main.go",
    "chars": 887,
    "preview": "// Let's Encrypt client to go!\n// CLI application for generating Let's Encrypt certificates using the ACME package.\npack"
  },
  {
    "path": "cmd/lego/zz_gen_version.go",
    "chars": 226,
    "preview": "// Code generated by 'internal/releaser'; DO NOT EDIT.\n\npackage main\n\nconst defaultVersion = \"v4.33.0+dev-detach\"\n\nvar v"
  },
  {
    "path": "cmd/setup.go",
    "chars": 5132,
    "preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"string"
  },
  {
    "path": "cmd/setup_challenges.go",
    "chars": 5139,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-acme/lego/v4/challenge\"\n\t\"github.com/go-acme/leg"
  },
  {
    "path": "cmd/testdata/sleeping_beauty.sh",
    "chars": 25,
    "preview": "#!/bin/bash -e\n\nsleep 50\n"
  },
  {
    "path": "cmd/testdata/sleepy.sh",
    "chars": 66,
    "preview": "#!/bin/bash -e\n\nfor i in `seq 1 10`\ndo\n  echo $i\n  sleep 0.2\ndone\n"
  },
  {
    "path": "cmd/zz_gen_cmd_dnshelp.go",
    "chars": 190551,
    "preview": "// Code generated by 'make generate-dns'; DO NOT EDIT.\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\t\"strings\"\n\t\"text/tab"
  },
  {
    "path": "docs/.gitignore",
    "chars": 33,
    "preview": "themes/\npublic/\n.hugo_build.lock\n"
  },
  {
    "path": "docs/Makefile",
    "chars": 222,
    "preview": ".PHONY: default clean serve build\n\ndefault: clean serve\n\nclean:\n\trm -rf public/\n\n\nbuild: clean\n\thugo --enableGitInfo --s"
  },
  {
    "path": "docs/archetypes/default.md",
    "chars": 84,
    "preview": "---\ntitle: \"{{ replace .Name \"-\" \" \" | title }}\"\ndate: {{ .Date }}\ndraft: true\n---\n\n"
  },
  {
    "path": "docs/content/_index.md",
    "chars": 1602,
    "preview": "---\ntitle: \"Lego\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nchapter: false\n---\n\nLet's Encrypt client and ACME library"
  },
  {
    "path": "docs/content/dns/_index.md",
    "chars": 1576,
    "preview": "---\ntitle: \"DNS Providers\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nweight: 3\n---\n\n{{% notice important %}}\nlego is "
  },
  {
    "path": "docs/content/dns/zz_gen_acme-dns.md",
    "chars": 2195,
    "preview": "---\ntitle: \"Joohoi's ACME-DNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: acme-dns\ndnsprovider:\n  since:    \"v1."
  },
  {
    "path": "docs/content/dns/zz_gen_active24.md",
    "chars": 1925,
    "preview": "---\ntitle: \"Active24\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: active24\ndnsprovider:\n  since:    \"v4.23.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_alidns.md",
    "chars": 2664,
    "preview": "---\ntitle: \"Alibaba Cloud DNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: alidns\ndnsprovider:\n  since:    \"v1.1."
  },
  {
    "path": "docs/content/dns/zz_gen_aliesa.md",
    "chars": 2628,
    "preview": "---\ntitle: \"AlibabaCloud ESA\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: aliesa\ndnsprovider:\n  since:    \"v4.29."
  },
  {
    "path": "docs/content/dns/zz_gen_allinkl.md",
    "chars": 1887,
    "preview": "---\ntitle: \"all-inkl\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: allinkl\ndnsprovider:\n  since:    \"v4.5.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_alwaysdata.md",
    "chars": 1975,
    "preview": "---\ntitle: \"Alwaysdata\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: alwaysdata\ndnsprovider:\n  since:    \"v4.31.0\""
  },
  {
    "path": "docs/content/dns/zz_gen_anexia.md",
    "chars": 2157,
    "preview": "---\ntitle: \"Anexia CloudDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: anexia\ndnsprovider:\n  since:    \"v4.28.0"
  },
  {
    "path": "docs/content/dns/zz_gen_artfiles.md",
    "chars": 1982,
    "preview": "---\ntitle: \"ArtFiles\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: artfiles\ndnsprovider:\n  since:    \"v4.32.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_arvancloud.md",
    "chars": 1949,
    "preview": "---\ntitle: \"ArvanCloud\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: arvancloud\ndnsprovider:\n  since:    \"v3.8.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_auroradns.md",
    "chars": 2065,
    "preview": "---\ntitle: \"Aurora DNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: auroradns\ndnsprovider:\n  since:    \"v0.4.0\"\n "
  },
  {
    "path": "docs/content/dns/zz_gen_autodns.md",
    "chars": 2162,
    "preview": "---\ntitle: \"Autodns\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: autodns\ndnsprovider:\n  since:    \"v3.2.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_axelname.md",
    "chars": 1964,
    "preview": "---\ntitle: \"Axelname\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: axelname\ndnsprovider:\n  since:    \"v4.23.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_azion.md",
    "chars": 2035,
    "preview": "---\ntitle: \"Azion\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: azion\ndnsprovider:\n  since:    \"v4.24.0\"\n  code:  "
  },
  {
    "path": "docs/content/dns/zz_gen_azure.md",
    "chars": 2569,
    "preview": "---\ntitle: \"Azure (deprecated)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: azure\ndnsprovider:\n  since:    \"v0.4."
  },
  {
    "path": "docs/content/dns/zz_gen_azuredns.md",
    "chars": 10264,
    "preview": "---\ntitle: \"Azure DNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: azuredns\ndnsprovider:\n  since:    \"v4.13.0\"\n  "
  },
  {
    "path": "docs/content/dns/zz_gen_baiducloud.md",
    "chars": 2002,
    "preview": "---\ntitle: \"Baidu Cloud\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: baiducloud\ndnsprovider:\n  since:    \"v4.23.0"
  },
  {
    "path": "docs/content/dns/zz_gen_beget.md",
    "chars": 1911,
    "preview": "---\ntitle: \"Beget.com\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: beget\ndnsprovider:\n  since:    \"v4.27.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_binarylane.md",
    "chars": 1965,
    "preview": "---\ntitle: \"Binary Lane\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: binarylane\ndnsprovider:\n  since:    \"v4.26.0"
  },
  {
    "path": "docs/content/dns/zz_gen_bindman.md",
    "chars": 2008,
    "preview": "---\ntitle: \"Bindman\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: bindman\ndnsprovider:\n  since:    \"v2.6.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_bluecat.md",
    "chars": 2387,
    "preview": "---\ntitle: \"Bluecat\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: bluecat\ndnsprovider:\n  since:    \"v0.5.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_bluecatv2.md",
    "chars": 2441,
    "preview": "---\ntitle: \"Bluecat v2\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: bluecatv2\ndnsprovider:\n  since:    \"v4.32.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_bookmyname.md",
    "chars": 1992,
    "preview": "---\ntitle: \"BookMyName\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: bookmyname\ndnsprovider:\n  since:    \"v4.23.0\""
  },
  {
    "path": "docs/content/dns/zz_gen_brandit.md",
    "chars": 2100,
    "preview": "---\ntitle: \"Brandit (deprecated)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: brandit\ndnsprovider:\n  since:    \"v"
  },
  {
    "path": "docs/content/dns/zz_gen_bunny.md",
    "chars": 1894,
    "preview": "---\ntitle: \"Bunny\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: bunny\ndnsprovider:\n  since:    \"v4.11.0\"\n  code:  "
  },
  {
    "path": "docs/content/dns/zz_gen_checkdomain.md",
    "chars": 2025,
    "preview": "---\ntitle: \"Checkdomain\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: checkdomain\ndnsprovider:\n  since:    \"v3.3.0"
  },
  {
    "path": "docs/content/dns/zz_gen_civo.md",
    "chars": 1723,
    "preview": "---\ntitle: \"Civo\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: civo\ndnsprovider:\n  since:    \"v4.9.0\"\n  code:     "
  },
  {
    "path": "docs/content/dns/zz_gen_clouddns.md",
    "chars": 2067,
    "preview": "---\ntitle: \"CloudDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: clouddns\ndnsprovider:\n  since:    \"v3.6.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_cloudflare.md",
    "chars": 4745,
    "preview": "---\ntitle: \"Cloudflare\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: cloudflare\ndnsprovider:\n  since:    \"v0.3.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_cloudns.md",
    "chars": 2003,
    "preview": "---\ntitle: \"ClouDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: cloudns\ndnsprovider:\n  since:    \"v2.3.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_cloudru.md",
    "chars": 2119,
    "preview": "---\ntitle: \"Cloud.ru\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: cloudru\ndnsprovider:\n  since:    \"v4.14.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_cloudxns.md",
    "chars": 1892,
    "preview": "---\ntitle: \"CloudXNS (Deprecated)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: cloudxns\ndnsprovider:\n  since:    "
  },
  {
    "path": "docs/content/dns/zz_gen_com35.md",
    "chars": 1909,
    "preview": "---\ntitle: \"35.com/三五互联\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: com35\ndnsprovider:\n  since:    \"v4.31.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_conoha.md",
    "chars": 2087,
    "preview": "---\ntitle: \"ConoHa v2\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: conoha\ndnsprovider:\n  since:    \"v1.2.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_conohav3.md",
    "chars": 2125,
    "preview": "---\ntitle: \"ConoHa v3\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: conohav3\ndnsprovider:\n  since:    \"v4.24.0\"\n  "
  },
  {
    "path": "docs/content/dns/zz_gen_constellix.md",
    "chars": 2042,
    "preview": "---\ntitle: \"Constellix\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: constellix\ndnsprovider:\n  since:    \"v3.4.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_corenetworks.md",
    "chars": 2152,
    "preview": "---\ntitle: \"Core-Networks\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: corenetworks\ndnsprovider:\n  since:    \"v4."
  },
  {
    "path": "docs/content/dns/zz_gen_cpanel.md",
    "chars": 2188,
    "preview": "---\ntitle: \"CPanel/WHM\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: cpanel\ndnsprovider:\n  since:    \"v4.16.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_czechia.md",
    "chars": 1891,
    "preview": "---\ntitle: \"Czechia\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: czechia\ndnsprovider:\n  since:    \"v4.33.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_ddnss.md",
    "chars": 1954,
    "preview": "---\ntitle: \"DDnss (DynDNS Service)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: ddnss\ndnsprovider:\n  since:    \"v"
  },
  {
    "path": "docs/content/dns/zz_gen_derak.md",
    "chars": 1828,
    "preview": "---\ntitle: \"Derak Cloud\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: derak\ndnsprovider:\n  since:    \"v4.12.0\"\n  c"
  },
  {
    "path": "docs/content/dns/zz_gen_desec.md",
    "chars": 1845,
    "preview": "---\ntitle: \"deSEC.io\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: desec\ndnsprovider:\n  since:    \"v3.7.0\"\n  code:"
  },
  {
    "path": "docs/content/dns/zz_gen_designate.md",
    "chars": 4222,
    "preview": "---\ntitle: \"Designate DNSaaS for Openstack\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: designate\ndnsprovider:\n  "
  },
  {
    "path": "docs/content/dns/zz_gen_digitalocean.md",
    "chars": 2024,
    "preview": "---\ntitle: \"Digital Ocean\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: digitalocean\ndnsprovider:\n  since:    \"v0."
  },
  {
    "path": "docs/content/dns/zz_gen_directadmin.md",
    "chars": 2164,
    "preview": "---\ntitle: \"DirectAdmin\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: directadmin\ndnsprovider:\n  since:    \"v4.18."
  },
  {
    "path": "docs/content/dns/zz_gen_dnsexit.md",
    "chars": 1865,
    "preview": "---\ntitle: \"DNSExit\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dnsexit\ndnsprovider:\n  since:    \"v4.32.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_dnshomede.md",
    "chars": 2015,
    "preview": "---\ntitle: \"dnsHome.de\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dnshomede\ndnsprovider:\n  since:    \"v4.10.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_dnsimple.md",
    "chars": 2685,
    "preview": "---\ntitle: \"DNSimple\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dnsimple\ndnsprovider:\n  since:    \"v0.3.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_dnsmadeeasy.md",
    "chars": 2073,
    "preview": "---\ntitle: \"DNS Made Easy\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dnsmadeeasy\ndnsprovider:\n  since:    \"v0.4"
  },
  {
    "path": "docs/content/dns/zz_gen_dnspod.md",
    "chars": 1901,
    "preview": "---\ntitle: \"DNSPod (deprecated)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dnspod\ndnsprovider:\n  since:    \"v0."
  },
  {
    "path": "docs/content/dns/zz_gen_dode.md",
    "chars": 1870,
    "preview": "---\ntitle: \"Domain Offensive (do.de)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dode\ndnsprovider:\n  since:    \""
  },
  {
    "path": "docs/content/dns/zz_gen_domeneshop.md",
    "chars": 2044,
    "preview": "---\ntitle: \"Domeneshop\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: domeneshop\ndnsprovider:\n  since:    \"v4.3.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_dreamhost.md",
    "chars": 1837,
    "preview": "---\ntitle: \"DreamHost\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dreamhost\ndnsprovider:\n  since:    \"v1.1.0\"\n  "
  },
  {
    "path": "docs/content/dns/zz_gen_duckdns.md",
    "chars": 1852,
    "preview": "---\ntitle: \"Duck DNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: duckdns\ndnsprovider:\n  since:    \"v0.5.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_dyn.md",
    "chars": 1886,
    "preview": "---\ntitle: \"Dyn\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dyn\ndnsprovider:\n  since:    \"v0.3.0\"\n  code:     \"d"
  },
  {
    "path": "docs/content/dns/zz_gen_dyndnsfree.md",
    "chars": 1893,
    "preview": "---\ntitle: \"DynDnsFree.de\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dyndnsfree\ndnsprovider:\n  since:    \"v4.23"
  },
  {
    "path": "docs/content/dns/zz_gen_dynu.md",
    "chars": 1835,
    "preview": "---\ntitle: \"Dynu\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: dynu\ndnsprovider:\n  since:    \"v3.5.0\"\n  code:     "
  },
  {
    "path": "docs/content/dns/zz_gen_easydns.md",
    "chars": 2141,
    "preview": "---\ntitle: \"EasyDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: easydns\ndnsprovider:\n  since:    \"v2.6.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_edgecenter.md",
    "chars": 2007,
    "preview": "---\ntitle: \"EdgeCenter\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: edgecenter\ndnsprovider:\n  since:    \"v4.29.0\""
  },
  {
    "path": "docs/content/dns/zz_gen_edgedns.md",
    "chars": 4139,
    "preview": "---\ntitle: \"Akamai EdgeDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: edgedns\ndnsprovider:\n  since:    \"v3.9.0\""
  },
  {
    "path": "docs/content/dns/zz_gen_edgeone.md",
    "chars": 2251,
    "preview": "---\ntitle: \"Tencent EdgeOne\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: edgeone\ndnsprovider:\n  since:    \"v4.26."
  },
  {
    "path": "docs/content/dns/zz_gen_efficientip.md",
    "chars": 2160,
    "preview": "---\ntitle: \"Efficient IP\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: efficientip\ndnsprovider:\n  since:    \"v4.13"
  },
  {
    "path": "docs/content/dns/zz_gen_epik.md",
    "chars": 1885,
    "preview": "---\ntitle: \"Epik\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: epik\ndnsprovider:\n  since:    \"v4.5.0\"\n  code:     "
  },
  {
    "path": "docs/content/dns/zz_gen_eurodns.md",
    "chars": 1911,
    "preview": "---\ntitle: \"EuroDNS\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: eurodns\ndnsprovider:\n  since:    \"v4.33.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_excedo.md",
    "chars": 1873,
    "preview": "---\ntitle: \"Excedo\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: excedo\ndnsprovider:\n  since:    \"v4.33.0\"\n  code:"
  },
  {
    "path": "docs/content/dns/zz_gen_exec.md",
    "chars": 3870,
    "preview": "---\ntitle: \"External program\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: exec\ndnsprovider:\n  since:    \"v0.5.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_exoscale.md",
    "chars": 2068,
    "preview": "---\ntitle: \"Exoscale\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: exoscale\ndnsprovider:\n  since:    \"v0.4.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_f5xc.md",
    "chars": 2091,
    "preview": "---\ntitle: \"F5 XC\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: f5xc\ndnsprovider:\n  since:    \"v4.23.0\"\n  code:   "
  },
  {
    "path": "docs/content/dns/zz_gen_freemyip.md",
    "chars": 1966,
    "preview": "---\ntitle: \"freemyip.com\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: freemyip\ndnsprovider:\n  since:    \"v4.5.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_gandi.md",
    "chars": 1839,
    "preview": "---\ntitle: \"Gandi\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gandi\ndnsprovider:\n  since:    \"v0.3.0\"\n  code:   "
  },
  {
    "path": "docs/content/dns/zz_gen_gandiv5.md",
    "chars": 1995,
    "preview": "---\ntitle: \"Gandi Live DNS (v5)\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gandiv5\ndnsprovider:\n  since:    \"v0"
  },
  {
    "path": "docs/content/dns/zz_gen_gcloud.md",
    "chars": 3382,
    "preview": "---\ntitle: \"Google Cloud\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gcloud\ndnsprovider:\n  since:    \"v0.3.0\"\n  "
  },
  {
    "path": "docs/content/dns/zz_gen_gcore.md",
    "chars": 1920,
    "preview": "---\ntitle: \"G-Core\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gcore\ndnsprovider:\n  since:    \"v4.5.0\"\n  code:  "
  },
  {
    "path": "docs/content/dns/zz_gen_gigahostno.md",
    "chars": 2048,
    "preview": "---\ntitle: \"Gigahost.no\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gigahostno\ndnsprovider:\n  since:    \"v4.29.0"
  },
  {
    "path": "docs/content/dns/zz_gen_glesys.md",
    "chars": 1905,
    "preview": "---\ntitle: \"Glesys\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: glesys\ndnsprovider:\n  since:    \"v0.5.0\"\n  code: "
  },
  {
    "path": "docs/content/dns/zz_gen_godaddy.md",
    "chars": 2348,
    "preview": "---\ntitle: \"Go Daddy\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: godaddy\ndnsprovider:\n  since:    \"v0.5.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_googledomains.md",
    "chars": 1918,
    "preview": "---\ntitle: \"Google Domains\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: googledomains\ndnsprovider:\n  since:    \"v"
  },
  {
    "path": "docs/content/dns/zz_gen_gravity.md",
    "chars": 2055,
    "preview": "---\ntitle: \"Gravity\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: gravity\ndnsprovider:\n  since:    \"v4.30.0\"\n  cod"
  },
  {
    "path": "docs/content/dns/zz_gen_hetzner.md",
    "chars": 1881,
    "preview": "---\ntitle: \"Hetzner\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: hetzner\ndnsprovider:\n  since:    \"v3.7.0\"\n  code"
  },
  {
    "path": "docs/content/dns/zz_gen_hostingde.md",
    "chars": 1943,
    "preview": "---\ntitle: \"Hosting.de\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: hostingde\ndnsprovider:\n  since:    \"v1.1.0\"\n "
  },
  {
    "path": "docs/content/dns/zz_gen_hostinger.md",
    "chars": 1931,
    "preview": "---\ntitle: \"Hostinger\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: hostinger\ndnsprovider:\n  since:    \"v4.27.0\"\n "
  },
  {
    "path": "docs/content/dns/zz_gen_hostingnl.md",
    "chars": 1911,
    "preview": "---\ntitle: \"Hosting.nl\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: hostingnl\ndnsprovider:\n  since:    \"v4.30.0\"\n"
  },
  {
    "path": "docs/content/dns/zz_gen_hosttech.md",
    "chars": 1946,
    "preview": "---\ntitle: \"Hosttech\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: hosttech\ndnsprovider:\n  since:    \"v4.5.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_httpnet.md",
    "chars": 1908,
    "preview": "---\ntitle: \"http.net\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: httpnet\ndnsprovider:\n  since:    \"v4.15.0\"\n  co"
  },
  {
    "path": "docs/content/dns/zz_gen_httpreq.md",
    "chars": 2480,
    "preview": "---\ntitle: \"HTTP request\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: httpreq\ndnsprovider:\n  since:    \"v2.0.0\"\n "
  },
  {
    "path": "docs/content/dns/zz_gen_huaweicloud.md",
    "chars": 2243,
    "preview": "---\ntitle: \"Huawei Cloud\"\ndate: 2019-03-03T16:39:46+01:00\ndraft: false\nslug: huaweicloud\ndnsprovider:\n  since:    \"v4.19"
  }
]

// ... and 1874 more files (download for full content)

About this extraction

This page contains the full source code of the go-acme/lego GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2074 files (5.0 MB), approximately 1.4M tokens, and a symbol index with 8972 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!