lego icon indicating copy to clipboard operation
lego copied to clipboard

Support for provider: mittwald

Open jotimann opened this issue 9 months ago • 7 comments

Welcome

  • [X] Yes, I've searched similar issues on GitHub and didn't find any.
  • [X] Yes, the DNS provider exposes a public API.
  • [X] Yes, I know that the lego maintainers don't have an account in all DNS providers in the world.
  • [ ] Yes, I'm able to create a pull request and be able to maintain the implementation.
  • [X] Yes, I'm able to test an implementation if someone creates a pull request to add the support of this DNS provider.

How do you use lego?

Library

Link to the DNS provider

https://www.mittwald.de/

Link to the API documentation

https://api.mittwald.de/v2/docs/

Additional Notes

No response

jotimann avatar May 06 '24 13:05 jotimann

Hello,

I checked quickly the API documentation, and I didn't find an endpoint to delete a record.

I also didn't find how to get a zone ID or project ID from a domain.

Could you give me more information about those elements?


Sponsoring is a good way to sustain open source maintainers: sponsor me

ldez avatar May 06 '24 13:05 ldez

Hello @ldez,

a DNS-Record is connected to a domain and the parent-Zone can not be deleted. It get's deleted when a domain get's deleted.

You only can create sub-zones like mail.DOMAIN.tld via https://api.mittwald.de/v2/docs/#/Domain/dns-create-dns-zone and delete them with https://api.mittwald.de/v2/docs/#/Domain/dns-delete-dns-zone

The projectid you can get when you lists your projects belonging to your user: https://api.mittwald.de/v2/docs/#/Project/project-list-projects and with that id you can list your zones connected to the project: https://api.mittwald.de/v2/docs/#/Domain/dns-list-dns-zones

If there is no way to delete or create parentZones like "mittwald.de", is it possible to get support for lego?

Greetings Jonas

jotimann avatar May 07 '24 08:05 jotimann

ACME DNS-01 challenge requires to create and delete a TXT record (ex: _acme-challenge.example.com or _acme-challenge.sub.example.com)

The projectid you can get when you lists your projects belonging to your user: https://api.mittwald.de/v2/docs/#/Project/project-list-projects and with that id you can list your zones connected to the project: https://api.mittwald.de/v2/docs/#/Domain/dns-list-dns-zones

The endpoint /v2/projects requires the customer ID and the server ID. How do I get this information based on the API token?

If I follow your explanation, to create a TXT record:

  • call /v2/projects to get the project ID (but need customer ID and the server ID)
  • call /v2/projects/{projectId}/dns-zones with the project ID to get all the zones (pagination?)
  • call /v2/dns-zones to create a zone (if needed) and get the zone ID. (ex: _acme-challenge.example.com or _acme-challenge.sub.example.com)

I didn't find the call to create a TXT record. /v2/dns-zones/{dnsZoneId}/record-sets/{recordSet}/actions/set-managed allows to create A or MX record only (and the request schema is missing from the doc). Maybe it's /v2/dns-zones/{dnsZoneId}/record-sets/{recordSet} but the doc is not clear about that (and the request schema is missing from the doc).

to delete a record:

ldez avatar May 07 '24 10:05 ldez

@jotimann any news?

ldez avatar May 27 '24 20:05 ldez

Hello @ldez,

sorry for the late answer.

The endpoint /v2/projects requires the customer ID and the server ID.

The customerID and serverID are not required. If you have your token the API will list your projects which belong to the user in the following schema:

[
  {
    "createdAt": "2023-08-16T07:57:42.000Z",
    "customerId": UUID,
    "customerMeta": {
      "id": UUID
    },
    "description": "My Project",
    "enabled": true,
    "id": UUID,
    "isReady": true,
    "projectHostingId": UUID,
    "readiness": "ready",
    "serverId": UUID,
    "serverShortId": "......",
    "shortId": ".....",
    "status": "ready",
    "statusSetAt": "2023-12-22T13:47:12.000Z"
  }, ...
  ]

there u will get the projectID, but the response can be multiple projects.

call /v2/projects/{projectId}/dns-zones with the project ID to get all the zones (pagination?)

No the dns-zones-route has no pagination and will get you:

{
    "id": UUID,
    "domain": "mittwald.de",
    "recordSet": {
      "mx": {
        "managed": true
      },
      "combinedARecords": {
        "managedBy": {
          "ingressId": UUID
        }
      },
      "cname": {},
      "txt": {
        "settings": {
          "ttl": {
            "auto": true
          }
        },
        "entries": [
          "v=spf1 include:agenturserver.de ~all"
        ]
      },
      "srv": {}
    }
  },

with that id you can call https://api.mittwald.de/v2/docs/#/Domain/dns-create-dns-zone name e.g. "_acme-challenge" and parentZoneId is always the id of the dns-zone in your case example.com

The response from your post on /v2/docs/#/Domain/dns-create-dns-zone is the id of the new dns-zone of "_acme-challenge.example.com".

Last step you can set the correct txt-record via https://api.mittwald.de/v2/docs/#/Domain/dns-update-record-set

{
  "settings": {
    "ttl": {
      "auto": true
    }
  },
  "entries": [
    "txt-value"
  ]
}

To delete the record you use https://api.mittwald.de/v2/docs/#/Domain/dns-delete-dns-zone with the zoneID

I hope I got everything and thanks for your work :) Greetings

jotimann avatar May 28 '24 14:05 jotimann

but the response can be multiple projects.

How do I get the project ID when I only have a domain and a token?

No the dns-zones-route has no pagination and will get you:

The documentation about /v2/projects/{projectId}/dns-zones says: "List DNSZones belonging to a Project." and "An array of DNSZone objects."


  1. Can you give me a list of the calls to create only one TXT record based only on a token and a domain name?
  2. Can you give me a list of the calls to remove only one TXT record based only on a token and a domain name?
  3. Is Mittwald support for multiple TXT entries for the same domain?

ldez avatar May 29 '24 15:05 ldez

Create a txt record only with domain and token:

{
  "name": "_acme-challenge",
  "parentZoneId": "zoneId"
}

The response is your new zoneId. - /v2/dns-zones/{dnsZoneId}/record-sets/{recordSet} -> use the response zoneId and recordSet = txt with the body:

{
  "settings": {
    "ttl": {
      "auto": true
    }
  },
  "entries": [
    "test"
  ]
}

Delete a txt-record:


Is Mittwald support for multiple TXT entries for the same domain?

Yes you can create multiple entries for _acme-challenge.example.com just fill them in the entries:

{
  "settings": {
    "ttl": {
      "auto": true
    }
  },
  "entries": [
    "test",
    "test2"
  ]
}

jotimann avatar Jun 04 '24 11:06 jotimann

ping @jotimann

feroxib avatar Aug 29 '24 23:08 feroxib