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,
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, 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    Plesk(PleskProvider),
249    Cpanel(CpanelProvider),
250    GoogleCloudDns(providers::google_cloud_dns::GoogleCloudDnsProvider),
251    Ionos(IonosProvider),
252    HostingDe(HostingDeProvider),
253    Infomaniak(InfomaniakProvider),
254    Netcup(NetcupProvider),
255    Netlify(NetlifyProvider),
256    HuaweiCloud(HuaweiCloudProvider),
257    BaiduCloud(BaiduCloudProvider),
258    AzureDns(AzureDnsProvider),
259    IbmCloud(IbmCloudProvider),
260    Hurricane(HurricaneProvider),
261    Hostinger(HostingerProvider),
262    Autodns(AutodnsProvider),
263    Lightsail(LightsailProvider),
264    EdgeDns(EdgeDnsProvider),
265    #[cfg(feature = "test_provider")]
266    Pebble(PebbleProvider),
267    #[cfg(feature = "test_provider")]
268    InMemory(InMemoryProvider),
269    Route53(Route53Provider),
270    Scaleway(ScalewayProvider),
271    Gcore(GcoreProvider),
272    Vercel(VercelProvider),
273    Vultr(VultrProvider),
274    BluecatV2(BluecatV2Provider),
275    EasyDns(EasyDnsProvider),
276    Joker(JokerProvider),
277    MythicBeasts(MythicBeastsProvider),
278    Namecheap(NamecheapProvider),
279    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
280    Transip(TransipProvider),
281    Ns1(Ns1Provider),
282    LuaDns(LuaDnsProvider),
283    ClouDns(ClouDnsProvider),
284    Glesys(GlesysProvider),
285    Dreamhost(DreamhostProvider),
286    Alidns(AlidnsProvider),
287    TencentCloud(TencentCloudProvider),
288    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
289    Volcengine(VolcengineProvider),
290    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
291    YandexCloud(YandexCloudProvider),
292    Domeneshop(DomeneshopProvider),
293    Safedns(SafeDnsProvider),
294    ArvanCloud(ArvanCloudProvider),
295    Inwx(InwxProvider),
296    UltraDns(UltraDnsProvider),
297    Infoblox(InfobloxProvider),
298}
299
300pub trait IntoFqdn<'x> {
301    fn into_fqdn(self) -> Cow<'x, str>;
302    fn into_name(self) -> Cow<'x, str>;
303}