pub struct InMemoryAuthority { /* private fields */ }Expand description
InMemoryAuthority is responsible for storing the resource records for a particular zone.
Authorities default to DNSClass IN. The ZoneType specifies if this should be treated as the start of authority for the zone, is a Secondary, or a cached zone.
Implementations§
Source§impl InMemoryAuthority
impl InMemoryAuthority
Sourcepub fn new(
origin: Name,
records: BTreeMap<RrKey, RecordSet>,
zone_type: ZoneType,
allow_axfr: bool,
nx_proof_kind: Option<NxProofKind>,
) -> Result<Self, String>
pub fn new( origin: Name, records: BTreeMap<RrKey, RecordSet>, zone_type: ZoneType, allow_axfr: bool, nx_proof_kind: Option<NxProofKind>, ) -> Result<Self, String>
Creates a new Authority.
§Arguments
origin- The zoneNamebeing created, this should match that of theRecordType::SOArecord.records- The map of the initial set of records in the zone.zone_type- The type of zone, i.e. is this authoritative?allow_axfr- Whether AXFR is allowed.nx_proof_kind- The kind of non-existence proof to be used by the server.
§Return value
The new Authority.
Sourcepub fn empty(
origin: Name,
zone_type: ZoneType,
allow_axfr: bool,
nx_proof_kind: Option<NxProofKind>,
) -> Self
pub fn empty( origin: Name, zone_type: ZoneType, allow_axfr: bool, nx_proof_kind: Option<NxProofKind>, ) -> Self
Sourcepub fn set_allow_axfr(&mut self, allow_axfr: bool)
Available on crate feature testing only.
pub fn set_allow_axfr(&mut self, allow_axfr: bool)
testing only.Allow AXFR’s (zone transfers)
Sourcepub async fn secure_keys(&self) -> impl Deref<Target = [SigSigner]> + '_
Available on crate features __dnssec and testing only.
pub async fn secure_keys(&self) -> impl Deref<Target = [SigSigner]> + '_
__dnssec and testing only.Retrieve the Signer, which contains the private keys, for this zone
Sourcepub async fn records_mut(
&self,
) -> impl DerefMut<Target = BTreeMap<RrKey, Arc<RecordSet>>> + '_
pub async fn records_mut( &self, ) -> impl DerefMut<Target = BTreeMap<RrKey, Arc<RecordSet>>> + '_
Get a mutable reference to the records
Sourcepub fn records_get_mut(&mut self) -> &mut BTreeMap<RrKey, Arc<RecordSet>>
pub fn records_get_mut(&mut self) -> &mut BTreeMap<RrKey, Arc<RecordSet>>
Get a mutable reference to the records
Sourcepub async fn minimum_ttl(&self) -> u32
pub async fn minimum_ttl(&self) -> u32
Returns the minimum ttl (as used in the SOA record)
Sourcepub async fn upsert(&self, record: Record, serial: u32) -> bool
pub async fn upsert(&self, record: Record, serial: u32) -> bool
Inserts or updates a Record depending on it’s existence in the authority.
Guarantees that SOA, CNAME only has one record, will implicitly update if they already exist.
§Arguments
record- TheRecordto be inserted or updated.serial- Current serial number to be recorded against updates.
§Return value
true if the value was inserted, false otherwise
Sourcepub fn upsert_mut(&mut self, record: Record, serial: u32) -> bool
pub fn upsert_mut(&mut self, record: Record, serial: u32) -> bool
Non-async version of upsert when behind a mutable reference.
Sourcepub fn add_update_auth_key_mut(
&mut self,
name: Name,
key: KEY,
) -> DnsSecResult<()>
Available on crate feature __dnssec only.
pub fn add_update_auth_key_mut( &mut self, name: Name, key: KEY, ) -> DnsSecResult<()>
__dnssec only.Non-async method of add_update_auth_key when behind a mutable reference
Sourcepub fn add_zone_signing_key_mut(
&mut self,
signer: SigSigner,
) -> DnsSecResult<()>
Available on crate feature __dnssec only.
pub fn add_zone_signing_key_mut( &mut self, signer: SigSigner, ) -> DnsSecResult<()>
__dnssec only.Non-async method of add_zone_signing_key when behind a mutable reference
Sourcepub fn secure_zone_mut(&mut self) -> DnsSecResult<()>
Available on crate feature __dnssec only.
pub fn secure_zone_mut(&mut self) -> DnsSecResult<()>
__dnssec only.(Re)generates the nsec records, increments the serial number and signs the zone
Trait Implementations§
Source§impl Authority for InMemoryAuthority
impl Authority for InMemoryAuthority
Source§fn is_axfr_allowed(&self) -> bool
fn is_axfr_allowed(&self) -> bool
Return true if AXFR is allowed
Source§fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
_update: &'life1 MessageRequest,
) -> Pin<Box<dyn Future<Output = UpdateResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
_update: &'life1 MessageRequest,
) -> Pin<Box<dyn Future<Output = UpdateResult<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Takes the UpdateMessage, extracts the Records, and applies the changes to the record set.
RFC 2136, DNS Update, April 1997
3.4 - Process Update Section
Next, the Update Section is processed as follows.
3.4.2 - Update
The Update Section is parsed into RRs and these RRs are processed in
order.
3.4.2.1. If any system failure (such as an out of memory condition,
or a hardware error in persistent storage) occurs during the
processing of this section, signal SERVFAIL to the requestor and undo
all updates applied to the zone during this transaction.
3.4.2.2. Any Update RR whose CLASS is the same as ZCLASS is added to
the zone. In case of duplicate RDATAs (which for SOA RRs is always
the case, and for WKS RRs is the case if the ADDRESS and PROTOCOL
fields both match), the Zone RR is replaced by Update RR. If the
TYPE is SOA and there is no Zone SOA RR, or the new SOA.SERIAL is
lower (according to [RFC1982]) than or equal to the current Zone SOA
RR's SOA.SERIAL, the Update RR is ignored. In the case of a CNAME
Update RR and a non-CNAME Zone RRset or vice versa, ignore the CNAME
Update RR, otherwise replace the CNAME Zone RR with the CNAME Update
RR.
3.4.2.3. For any Update RR whose CLASS is ANY and whose TYPE is ANY,
all Zone RRs with the same NAME are deleted, unless the NAME is the
same as ZNAME in which case only those RRs whose TYPE is other than
SOA or NS are deleted. For any Update RR whose CLASS is ANY and
whose TYPE is not ANY all Zone RRs with the same NAME and TYPE are
deleted, unless the NAME is the same as ZNAME in which case neither
SOA or NS RRs will be deleted.
3.4.2.4. For any Update RR whose class is NONE, any Zone RR whose
NAME, TYPE, RDATA and RDLENGTH are equal to the Update RR is deleted,
unless the NAME is the same as ZNAME and either the TYPE is SOA or
the TYPE is NS and the matching Zone RR is the only NS remaining in
the RRset, in which case this Update RR is ignored.
3.4.2.5. Signal NOERROR to the requestor.§Arguments
update- TheUpdateMessagerecords will be extracted and used to perform the update actions as specified in the above RFC.
§Return value
true if any of additions, updates or deletes were made to the zone, false otherwise. Err is returned in the case of bad data, etc.
Source§fn origin(&self) -> &LowerName
fn origin(&self) -> &LowerName
Get the origin of this zone, i.e. example.com is the origin for www.example.com
Source§fn lookup<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
query_type: RecordType,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn lookup<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
query_type: RecordType,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Looks up all Resource Records matching the given Name and RecordType.
§Arguments
name- The name to look up.query_type- TheRecordTypeto look up.RecordType::ANYwill return all records matchingname.RecordType::AXFRwill return all record types exceptRecordType::SOAdue to the requirements that on zone transfers theRecordType::SOAmust both precede and follow all other records.lookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
§Return value
A LookupControlFlow containing the lookup that should be returned to the client.
Source§fn get_nsec_records<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_nsec_records<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Return the NSEC records based on the given name
§Arguments
name- given this name (i.e. the lookup name), return the NSEC record that is less than thislookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
Source§type Lookup = AuthLookup
type Lookup = AuthLookup
Source§fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
request_info: RequestInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
request_info: RequestInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn get_nsec3_records<'life0, 'life1, 'async_trait>(
&'life0 self,
info: Nsec3QueryInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_nsec3_records<'life0, 'life1, 'async_trait>(
&'life0 self,
info: Nsec3QueryInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
__dnssec only.Source§fn nx_proof_kind(&self) -> Option<&NxProofKind>
fn nx_proof_kind(&self) -> Option<&NxProofKind>
__dnssec only.Source§fn can_validate_dnssec(&self) -> bool
fn can_validate_dnssec(&self) -> bool
Source§fn consult<'life0, 'life1, 'async_trait>(
&'life0 self,
_name: &'life1 LowerName,
_rtype: RecordType,
_lookup_options: LookupOptions,
last_result: LookupControlFlow<Box<dyn LookupObject>>,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn consult<'life0, 'life1, 'async_trait>(
&'life0 self,
_name: &'life1 LowerName,
_rtype: RecordType,
_lookup_options: LookupOptions,
last_result: LookupControlFlow<Box<dyn LookupObject>>,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Name and RecordType.
This will be called in a chained authority configuration after an authority in the chain
has returned a lookup with a LookupControlFlow::Continue action. Every other authority in
the chain will be called via this consult method, until one either returns a
LookupControlFlow::Break action, or all authorities have been consulted. The authority that
generated the primary lookup (the one returned via ‘lookup’) will not be consulted. Read moreSource§fn ns<'life0, 'async_trait>(
&'life0 self,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn ns<'life0, 'async_trait>(
&'life0 self,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn soa<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn soa<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn soa_secure<'life0, 'async_trait>(
&'life0 self,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn soa_secure<'life0, 'async_trait>(
&'life0 self,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Self::Lookup>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§impl DnssecAuthority for InMemoryAuthority
impl DnssecAuthority for InMemoryAuthority
Source§fn add_update_auth_key<'life0, 'async_trait>(
&'life0 self,
name: Name,
key: KEY,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add_update_auth_key<'life0, 'async_trait>(
&'life0 self,
name: Name,
key: KEY,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Add a (Sig0) key that is authorized to perform updates against this authority
Source§fn add_zone_signing_key<'life0, 'async_trait>(
&'life0 self,
signer: SigSigner,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn add_zone_signing_key<'life0, 'async_trait>(
&'life0 self,
signer: SigSigner,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
By adding a secure key, this will implicitly enable dnssec for the zone.
§Arguments
signer- Signer with associated private key
Source§fn secure_zone<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn secure_zone<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = DnsSecResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Sign the zone for DNSSEC
Auto Trait Implementations§
impl !Freeze for InMemoryAuthority
impl !RefUnwindSafe for InMemoryAuthority
impl Send for InMemoryAuthority
impl Sync for InMemoryAuthority
impl Unpin for InMemoryAuthority
impl !UnwindSafe for InMemoryAuthority
Blanket Implementations§
Source§impl<A, L> AuthorityObject for A
impl<A, L> AuthorityObject for A
Source§fn is_axfr_allowed(&self) -> bool
fn is_axfr_allowed(&self) -> bool
Return true if AXFR is allowed
Source§fn can_validate_dnssec(&self) -> bool
fn can_validate_dnssec(&self) -> bool
Whether the authority can perform DNSSEC validation
Source§fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 MessageRequest,
) -> Pin<Box<dyn Future<Output = Result<bool, ResponseCode>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
fn update<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 MessageRequest,
) -> Pin<Box<dyn Future<Output = Result<bool, ResponseCode>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Perform a dynamic update of a zone
Source§fn origin(&self) -> &LowerName
fn origin(&self) -> &LowerName
Get the origin of this zone, i.e. example.com is the origin for www.example.com
Source§fn lookup<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
rtype: RecordType,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
fn lookup<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
rtype: RecordType,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Looks up all Resource Records matching the given Name and RecordType.
§Arguments
name- The name to look up.rtype- TheRecordTypeto look up.RecordType::ANYwill return all records matchingname.RecordType::AXFRwill return all record types exceptRecordType::SOAdue to the requirements that on zone transfers theRecordType::SOAmust both precede and follow all other records.lookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
§Return value
A LookupControlFlow containing the lookup that should be returned to the client.
Source§fn consult<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
rtype: RecordType,
lookup_options: LookupOptions,
last_result: LookupControlFlow<Box<dyn LookupObject>>,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
fn consult<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
rtype: RecordType,
lookup_options: LookupOptions,
last_result: LookupControlFlow<Box<dyn LookupObject>>,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Consulting lookup for all Resource Records matching the given Name and RecordType.
This will be called in a chained authority configuration after an authority in the chain
has returned a lookup with a LookupControlFlow::Continue action. Every other authority in
the chain will be called via this consult method, until one either returns a
LookupControlFlow::Break action, or all authorities have been consulted. The authority that
generated the primary lookup (the one returned via ‘lookup’) will not be consulted.
§Arguments
name- The name to look up.rtype- TheRecordTypeto look up.RecordType::ANYwill return all records matchingname.RecordType::AXFRwill return all record types exceptRecordType::SOAdue to the requirements that on zone transfers theRecordType::SOAmust both precede and follow all other records.lookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)last_result- The lookup returned by a previous authority in a chained configuration. If a subsequent authority does not modify this lookup, it will be returned to the client after consulting all authorities in the chain.
§Return value
A LookupControlFlow containing the lookup that should be returned to the client. This can be the same last_result that was passed in, or a new lookup, depending on the logic of the authority in question.
Source§fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
request_info: RequestInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
fn search<'life0, 'life1, 'async_trait>(
&'life0 self,
request_info: RequestInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Using the specified query, perform a lookup against this zone.
§Arguments
request_info- the query to perform the lookup with.lookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
§Return value
A LookupControlFlow containing the lookup that should be returned to the client.
Source§fn get_nsec_records<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
fn get_nsec_records<'life0, 'life1, 'async_trait>(
&'life0 self,
name: &'life1 LowerName,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Return the NSEC records based on the given name
§Arguments
name- given this name (i.e. the lookup name), return the NSEC record that is less than thislookup_options- Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
Source§fn get_nsec3_records<'life0, 'life1, 'async_trait>(
&'life0 self,
info: Nsec3QueryInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
Available on crate feature __dnssec only.
fn get_nsec3_records<'life0, 'life1, 'async_trait>(
&'life0 self,
info: Nsec3QueryInfo<'life1>,
lookup_options: LookupOptions,
) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
A: 'async_trait,
__dnssec only.Return the NSEC3 records based on the given query information.
Source§fn nx_proof_kind(&self) -> Option<&NxProofKind>
Available on crate feature __dnssec only.
fn nx_proof_kind(&self) -> Option<&NxProofKind>
__dnssec only.Returns the kind of non-existence proof used for this zone.