Struct InMemoryAuthority

Source
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

Source

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 zone Name being created, this should match that of the RecordType::SOA record.
  • 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.

Source

pub fn empty( origin: Name, zone_type: ZoneType, allow_axfr: bool, nx_proof_kind: Option<NxProofKind>, ) -> Self

Creates an empty Authority

§Warning

This is an invalid zone, SOA must be added

Source

pub fn class(&self) -> DNSClass

The DNSClass of this zone

Source

pub fn set_allow_axfr(&mut self, allow_axfr: bool)

Available on crate feature testing only.

Allow AXFR’s (zone transfers)

Source

pub fn clear(&mut self)

Clears all records (including SOA, etc)

Source

pub async fn secure_keys(&self) -> impl Deref<Target = [SigSigner]> + '_

Available on crate features __dnssec and testing only.

Retrieve the Signer, which contains the private keys, for this zone

Source

pub async fn records(&self) -> BTreeMap<RrKey, Arc<RecordSet>>

Get all the records

Source

pub async fn records_mut( &self, ) -> impl DerefMut<Target = BTreeMap<RrKey, Arc<RecordSet>>> + '_

Get a mutable reference to the records

Source

pub fn records_get_mut(&mut self) -> &mut BTreeMap<RrKey, Arc<RecordSet>>

Get a mutable reference to the records

Source

pub async fn minimum_ttl(&self) -> u32

Returns the minimum ttl (as used in the SOA record)

Source

pub async fn serial(&self) -> u32

get the current serial number for the zone.

Source

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 - The Record to be inserted or updated.
  • serial - Current serial number to be recorded against updates.
§Return value

true if the value was inserted, false otherwise

Source

pub fn upsert_mut(&mut self, record: Record, serial: u32) -> bool

Non-async version of upsert when behind a mutable reference.

Source

pub fn add_update_auth_key_mut( &mut self, name: Name, key: KEY, ) -> DnsSecResult<()>

Available on crate feature __dnssec only.

Non-async method of add_update_auth_key when behind a mutable reference

Source

pub fn add_zone_signing_key_mut( &mut self, signer: SigSigner, ) -> DnsSecResult<()>

Available on crate feature __dnssec only.

Non-async method of add_zone_signing_key when behind a mutable reference

Source

pub fn secure_zone_mut(&mut self) -> DnsSecResult<()>

Available on crate feature __dnssec only.

(Re)generates the nsec records, increments the serial number and signs the zone

Trait Implementations§

Source§

impl Authority for InMemoryAuthority

Source§

fn zone_type(&self) -> ZoneType

What type is this zone

Source§

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,

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 - The UpdateMessage records 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

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,

Looks up all Resource Records matching the given Name and RecordType.

§Arguments
  • name - The name to look up.
  • query_type - The RecordType to look up. RecordType::ANY will return all records matching name. RecordType::AXFR will return all record types except RecordType::SOA due to the requirements that on zone transfers the RecordType::SOA must 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,

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 this
  • lookup_options - Query-related lookup options (e.g., DNSSEC DO bit, supported hash algorithms, etc.)
Source§

type Lookup = AuthLookup

Result of a lookup
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,

Using the specified query, perform a lookup against this zone. Read more
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,

Available on crate feature __dnssec only.
Return the NSEC3 records based on the information available for a query.
Source§

fn nx_proof_kind(&self) -> Option<&NxProofKind>

Available on crate feature __dnssec only.
Returns the kind of non-existence proof used for this zone.
Source§

fn can_validate_dnssec(&self) -> bool

Whether the authority can perform DNSSEC validation
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,

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. Read more
Source§

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,

Get the NS, NameServer, record for the zone
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,

Returns the SOA of the authority. Read more
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,

Returns the SOA record for the zone
Source§

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,

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,

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,

Sign the zone for DNSSEC

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<A, L> AuthorityObject for A
where A: Authority<Lookup = L> + Send + Sync + 'static, L: LookupObject + Send + Sync + 'static,

Source§

fn zone_type(&self) -> ZoneType

What type is this zone

Source§

fn is_axfr_allowed(&self) -> bool

Return true if AXFR is allowed

Source§

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,

Perform a dynamic update of a zone

Source§

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,

Looks up all Resource Records matching the given Name and RecordType.

§Arguments
  • name - The name to look up.
  • rtype - The RecordType to look up. RecordType::ANY will return all records matching name. RecordType::AXFR will return all record types except RecordType::SOA due to the requirements that on zone transfers the RecordType::SOA must 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,

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 - The RecordType to look up. RecordType::ANY will return all records matching name. RecordType::AXFR will return all record types except RecordType::SOA due to the requirements that on zone transfers the RecordType::SOA must 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,

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,

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 this
  • lookup_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.

Return the NSEC3 records based on the given query information.

Source§

fn nx_proof_kind(&self) -> Option<&NxProofKind>

Available on crate feature __dnssec only.

Returns the kind of non-existence proof used for this zone.

Source§

fn ns<'life0, 'async_trait>( &'life0 self, lookup_options: LookupOptions, ) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get the NS, NameServer, record for the zone
Source§

fn soa<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns the SOA of the authority. Read more
Source§

fn soa_secure<'life0, 'async_trait>( &'life0 self, lookup_options: LookupOptions, ) -> Pin<Box<dyn Future<Output = LookupControlFlow<Box<dyn LookupObject>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns the SOA record for the zone
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T