Skip to main content

dns_update/
lib.rs

1#![doc = include_str!("../README.md")]
2/*
3 * Copyright Stalwart Labs LLC See the COPYING
4 * file at the top-level directory of this distribution.
5 *
6 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
7 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
8 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
9 * option. This file may not be copied, modified, or distributed
10 * except according to those terms.
11 */
12
13#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
14use providers::oraclecloud::OracleCloudProvider;
15#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
16use providers::ovh::OvhProvider;
17#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
18use providers::volcengine::VolcengineProvider;
19#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
20use providers::yandexcloud::YandexCloudProvider;
21
22#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
23use providers::transip::TransipProvider;
24
25#[cfg(feature = "test_provider")]
26use providers::{in_memory::InMemoryProvider, pebble::PebbleProvider};
27
28pub use hickory_proto::dnssec;
29use providers::{
30    alidns::AlidnsProvider, bluecatv2::BluecatV2Provider,
31    bunny::BunnyProvider, cloudflare::CloudflareProvider, cloudns::ClouDnsProvider,
32    constellix::ConstellixProvider, ddnss::DdnssProvider, desec::DesecProvider,
33    digitalocean::DigitalOceanProvider, dnsimple::DNSimpleProvider,
34    dnsmadeeasy::DnsMadeEasyProvider, dreamhost::DreamhostProvider, duckdns::DuckDnsProvider,
35    dynu::DynuProvider, easydns::EasyDnsProvider, exoscale::ExoscaleProvider,
36    freemyip::FreeMyIpProvider, gandiv5::GandiV5Provider, gcore::GcoreProvider,
37    glesys::GlesysProvider, godaddy::GodaddyProvider, hetzner::HetznerProvider,
38    hostingde::HostingDeProvider, infomaniak::InfomaniakProvider, ionos::IonosProvider,
39    ipv64::Ipv64Provider, joker::JokerProvider, linode::LinodeProvider,
40    luadns::LuaDnsProvider, mythicbeasts::MythicBeastsProvider,
41    namecheap::NamecheapProvider, namedotcom::NameDotComProvider, namesilo::NameSiloProvider,
42    netcup::NetcupProvider, netlify::NetlifyProvider, nifcloud::NifcloudProvider,
43    ns1::Ns1Provider, porkbun::PorkBunProvider, rfc2136::Rfc2136Provider,
44    route53::Route53Provider, scaleway::ScalewayProvider, spaceship::SpaceshipProvider,
45    tencentcloud::TencentCloudProvider, vercel::VercelProvider, vultr::VultrProvider,
46    websupport::WebSupportProvider,
47};
48
49use providers::{
50    arvancloud::ArvanCloudProvider, autodns::AutodnsProvider, azuredns::AzureDnsProvider,
51    baiducloud::BaiduCloudProvider, cpanel::CpanelProvider, domeneshop::DomeneshopProvider,
52    edgedns::EdgeDnsProvider, hostinger::HostingerProvider, huaweicloud::HuaweiCloudProvider,
53    hurricane::HurricaneProvider, ibmcloud::IbmCloudProvider, infoblox::InfobloxProvider,
54    inwx::InwxProvider, lightsail::LightsailProvider, plesk::PleskProvider,
55    safedns::SafeDnsProvider, ultradns::UltraDnsProvider,
56};
57use std::{
58    borrow::Cow,
59    net::{Ipv4Addr, Ipv6Addr},
60};
61
62pub mod bind;
63pub mod crypto;
64pub mod http;
65pub mod jwt;
66pub mod providers;
67pub mod tests;
68pub mod update;
69pub mod utils;
70
71#[derive(Debug)]
72pub enum Error {
73    Protocol(String),
74    Parse(String),
75    Client(String),
76    Response(String),
77    Api(String),
78    Serialize(String),
79    Unauthorized,
80    NotFound,
81    BadRequest,
82}
83
84/// A DNS record type.
85#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
86pub enum DnsRecordType {
87    A,
88    AAAA,
89    CNAME,
90    NS,
91    MX,
92    TXT,
93    SRV,
94    TLSA,
95    CAA,
96}
97
98/// A named DNS record, which consists of a name and a DNS record.
99#[derive(Clone, Debug, PartialEq, Eq, Hash)]
100pub struct NamedDnsRecord {
101    pub name: String,
102    pub record: DnsRecord,
103}
104
105/// A DNS record type with a value.
106#[derive(Clone, Debug, PartialEq, Eq, Hash)]
107pub enum DnsRecord {
108    A(Ipv4Addr),
109    AAAA(Ipv6Addr),
110    CNAME(String),
111    NS(String),
112    MX(MXRecord),
113    TXT(String),
114    SRV(SRVRecord),
115    TLSA(TLSARecord),
116    CAA(CAARecord),
117}
118
119// An MX record, which consists of an exchange string and a priority.
120#[derive(Clone, Debug, PartialEq, Eq, Hash)]
121pub struct MXRecord {
122    pub exchange: String,
123    pub priority: u16,
124}
125
126// A SRV record, which consists of a target string, priority, weight, and port.
127#[derive(Clone, Debug, PartialEq, Eq, Hash)]
128pub struct SRVRecord {
129    pub target: String,
130    pub priority: u16,
131    pub weight: u16,
132    pub port: u16,
133}
134
135// A TLSA record, which consists of a certificate usage, selector, matching type, and certificate data.
136#[derive(Clone, Debug, PartialEq, Eq, Hash)]
137pub struct TLSARecord {
138    pub cert_usage: TlsaCertUsage,
139    pub selector: TlsaSelector,
140    pub matching: TlsaMatching,
141    pub cert_data: Vec<u8>,
142}
143
144#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
145pub enum TlsaCertUsage {
146    PkixTa,
147    PkixEe,
148    DaneTa,
149    DaneEe,
150    Private,
151}
152
153#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
154pub enum TlsaSelector {
155    Full,
156    Spki,
157    Private,
158}
159
160#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
161pub enum TlsaMatching {
162    Raw,
163    Sha256,
164    Sha512,
165    Private,
166}
167
168// A CAA record, which can be either an Issue, IssueWild, or Iodef record.
169#[derive(Clone, Debug, PartialEq, Eq, Hash)]
170pub enum CAARecord {
171    Issue {
172        issuer_critical: bool,
173        name: Option<String>,
174        options: Vec<KeyValue>,
175    },
176    IssueWild {
177        issuer_critical: bool,
178        name: Option<String>,
179        options: Vec<KeyValue>,
180    },
181    Iodef {
182        issuer_critical: bool,
183        url: String,
184    },
185}
186
187#[derive(Clone, Debug, PartialEq, Eq, Hash)]
188pub struct KeyValue {
189    pub key: String,
190    pub value: String,
191}
192
193/// A TSIG algorithm.
194pub enum TsigAlgorithm {
195    HmacMd5,
196    Gss,
197    HmacSha1,
198    HmacSha224,
199    HmacSha256,
200    HmacSha256_128,
201    HmacSha384,
202    HmacSha384_192,
203    HmacSha512,
204    HmacSha512_256,
205}
206
207/// A DNSSEC algorithm.
208pub enum Algorithm {
209    RSASHA256,
210    RSASHA512,
211    ECDSAP256SHA256,
212    ECDSAP384SHA384,
213    ED25519,
214}
215
216pub type Result<T> = std::result::Result<T, Error>;
217
218#[derive(Clone)]
219#[non_exhaustive]
220pub enum DnsUpdater {
221    Rfc2136(Rfc2136Provider),
222    Cloudflare(CloudflareProvider),
223    DigitalOcean(DigitalOceanProvider),
224    Desec(DesecProvider),
225    Constellix(ConstellixProvider),
226    DnsMadeEasy(DnsMadeEasyProvider),
227    Exoscale(ExoscaleProvider),
228    Nifcloud(NifcloudProvider),
229    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
230    Ovh(OvhProvider),
231    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
232    OracleCloud(OracleCloudProvider),
233    Bunny(BunnyProvider),
234    Linode(LinodeProvider),
235    Porkbun(PorkBunProvider),
236    Spaceship(SpaceshipProvider),
237    WebSupport(WebSupportProvider),
238    DNSimple(DNSimpleProvider),
239    GandiV5(GandiV5Provider),
240    Godaddy(GodaddyProvider),
241    Hetzner(HetznerProvider),
242    NameDotCom(NameDotComProvider),
243    NameSilo(NameSiloProvider),
244    DuckDns(DuckDnsProvider),
245    FreeMyIp(FreeMyIpProvider),
246    Ipv64(Ipv64Provider),
247    Ddnss(DdnssProvider),
248    Dynu(DynuProvider),
249    Plesk(PleskProvider),
250    Cpanel(CpanelProvider),
251    GoogleCloudDns(providers::google_cloud_dns::GoogleCloudDnsProvider),
252    Ionos(IonosProvider),
253    HostingDe(HostingDeProvider),
254    Infomaniak(InfomaniakProvider),
255    Netcup(NetcupProvider),
256    Netlify(NetlifyProvider),
257    HuaweiCloud(HuaweiCloudProvider),
258    BaiduCloud(BaiduCloudProvider),
259    AzureDns(AzureDnsProvider),
260    IbmCloud(IbmCloudProvider),
261    Hurricane(HurricaneProvider),
262    Hostinger(HostingerProvider),
263    Autodns(AutodnsProvider),
264    Lightsail(LightsailProvider),
265    EdgeDns(EdgeDnsProvider),
266    #[cfg(feature = "test_provider")]
267    Pebble(PebbleProvider),
268    #[cfg(feature = "test_provider")]
269    InMemory(InMemoryProvider),
270    Route53(Route53Provider),
271    Scaleway(ScalewayProvider),
272    Gcore(GcoreProvider),
273    Vercel(VercelProvider),
274    Vultr(VultrProvider),
275    BluecatV2(BluecatV2Provider),
276    EasyDns(EasyDnsProvider),
277    Joker(JokerProvider),
278    MythicBeasts(MythicBeastsProvider),
279    Namecheap(NamecheapProvider),
280    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
281    Transip(TransipProvider),
282    Ns1(Ns1Provider),
283    LuaDns(LuaDnsProvider),
284    ClouDns(ClouDnsProvider),
285    Glesys(GlesysProvider),
286    Dreamhost(DreamhostProvider),
287    Alidns(AlidnsProvider),
288    TencentCloud(TencentCloudProvider),
289    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
290    Volcengine(VolcengineProvider),
291    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
292    YandexCloud(YandexCloudProvider),
293    Domeneshop(DomeneshopProvider),
294    Safedns(SafeDnsProvider),
295    ArvanCloud(ArvanCloudProvider),
296    Inwx(InwxProvider),
297    UltraDns(UltraDnsProvider),
298    Infoblox(InfobloxProvider),
299}
300
301pub trait IntoFqdn<'x> {
302    fn into_fqdn(self) -> Cow<'x, str>;
303    fn into_name(self) -> Cow<'x, str>;
304}