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