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)]
70pub enum Error {
71    Protocol(String),
72    Parse(String),
73    Client(String),
74    Response(String),
75    Api(String),
76    Serialize(String),
77    Unauthorized,
78    NotFound,
79    BadRequest,
80    Unsupported(String),
81}
82
83/// A DNS record type.
84#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
85pub enum DnsRecordType {
86    A,
87    AAAA,
88    CNAME,
89    NS,
90    MX,
91    TXT,
92    SRV,
93    TLSA,
94    CAA,
95}
96
97/// A named DNS record, which consists of a name and a DNS record.
98#[derive(Clone, Debug, PartialEq, Eq, Hash)]
99pub struct NamedDnsRecord {
100    pub name: String,
101    pub record: DnsRecord,
102}
103
104/// A DNS record type with a value.
105#[derive(Clone, Debug, PartialEq, Eq, Hash)]
106pub enum DnsRecord {
107    A(Ipv4Addr),
108    AAAA(Ipv6Addr),
109    CNAME(String),
110    NS(String),
111    MX(MXRecord),
112    TXT(String),
113    SRV(SRVRecord),
114    TLSA(TLSARecord),
115    CAA(CAARecord),
116}
117
118// An MX record, which consists of an exchange string and a priority.
119#[derive(Clone, Debug, PartialEq, Eq, Hash)]
120pub struct MXRecord {
121    pub exchange: String,
122    pub priority: u16,
123}
124
125// A SRV record, which consists of a target string, priority, weight, and port.
126#[derive(Clone, Debug, PartialEq, Eq, Hash)]
127pub struct SRVRecord {
128    pub target: String,
129    pub priority: u16,
130    pub weight: u16,
131    pub port: u16,
132}
133
134// A TLSA record, which consists of a certificate usage, selector, matching type, and certificate data.
135#[derive(Clone, Debug, PartialEq, Eq, Hash)]
136pub struct TLSARecord {
137    pub cert_usage: TlsaCertUsage,
138    pub selector: TlsaSelector,
139    pub matching: TlsaMatching,
140    pub cert_data: Vec<u8>,
141}
142
143#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
144pub enum TlsaCertUsage {
145    PkixTa,
146    PkixEe,
147    DaneTa,
148    DaneEe,
149    Private,
150}
151
152#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
153pub enum TlsaSelector {
154    Full,
155    Spki,
156    Private,
157}
158
159#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
160pub enum TlsaMatching {
161    Raw,
162    Sha256,
163    Sha512,
164    Private,
165}
166
167// A CAA record, which can be either an Issue, IssueWild, or Iodef record.
168#[derive(Clone, Debug, PartialEq, Eq, Hash)]
169pub enum CAARecord {
170    Issue {
171        issuer_critical: bool,
172        name: Option<String>,
173        options: Vec<KeyValue>,
174    },
175    IssueWild {
176        issuer_critical: bool,
177        name: Option<String>,
178        options: Vec<KeyValue>,
179    },
180    Iodef {
181        issuer_critical: bool,
182        url: String,
183    },
184}
185
186#[derive(Clone, Debug, PartialEq, Eq, Hash)]
187pub struct KeyValue {
188    pub key: String,
189    pub value: String,
190}
191
192/// A TSIG algorithm.
193pub enum TsigAlgorithm {
194    HmacMd5,
195    Gss,
196    HmacSha1,
197    HmacSha224,
198    HmacSha256,
199    HmacSha256_128,
200    HmacSha384,
201    HmacSha384_192,
202    HmacSha512,
203    HmacSha512_256,
204}
205
206/// A DNSSEC algorithm.
207pub enum Algorithm {
208    RSASHA256,
209    RSASHA512,
210    ECDSAP256SHA256,
211    ECDSAP384SHA384,
212    ED25519,
213}
214
215pub type Result<T> = std::result::Result<T, Error>;
216
217#[derive(Clone)]
218#[non_exhaustive]
219pub enum DnsUpdater {
220    Rfc2136(Rfc2136Provider),
221    Cloudflare(CloudflareProvider),
222    DigitalOcean(DigitalOceanProvider),
223    Desec(DesecProvider),
224    Constellix(ConstellixProvider),
225    DnsMadeEasy(DnsMadeEasyProvider),
226    Exoscale(ExoscaleProvider),
227    Nifcloud(NifcloudProvider),
228    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
229    Ovh(OvhProvider),
230    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
231    OracleCloud(OracleCloudProvider),
232    Bunny(BunnyProvider),
233    Linode(LinodeProvider),
234    Porkbun(PorkBunProvider),
235    Spaceship(SpaceshipProvider),
236    WebSupport(WebSupportProvider),
237    DNSimple(DNSimpleProvider),
238    GandiV5(GandiV5Provider),
239    Godaddy(GodaddyProvider),
240    Hetzner(HetznerProvider),
241    NameDotCom(NameDotComProvider),
242    NameSilo(NameSiloProvider),
243    DuckDns(DuckDnsProvider),
244    FreeMyIp(FreeMyIpProvider),
245    Ipv64(Ipv64Provider),
246    Ddnss(DdnssProvider),
247    Dynu(DynuProvider),
248    Pdns(PdnsProvider),
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    SimplyCom(SimplyComProvider),
296    ArvanCloud(ArvanCloudProvider),
297    Inwx(InwxProvider),
298    UltraDns(UltraDnsProvider),
299    Infoblox(InfobloxProvider),
300}
301
302pub trait IntoFqdn<'x> {
303    fn into_fqdn(self) -> Cow<'x, str>;
304    fn into_name(self) -> Cow<'x, str>;
305}