mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-01 14:35:29 +00:00
[1579] suggested changes: made FindDNSSECContext more focused.
removed origin_ or complete flags_ from the class members. non DNSSEC-specific processing was recovered from the original version. also made FindDNSSECContext private inside ZoneFinder; it doesn't have to be publicly usable. also made indentation policy more consistent for the class.
This commit is contained in:
@@ -601,11 +601,10 @@ DatabaseClient::Finder::findDelegationPoint(const isc::dns::Name& name,
|
|||||||
//
|
//
|
||||||
// If none of the above applies in any level, the search fails with NXDOMAIN.
|
// If none of the above applies in any level, the search fails with NXDOMAIN.
|
||||||
ZoneFinder::ResultContext
|
ZoneFinder::ResultContext
|
||||||
DatabaseClient::Finder::findWildcardMatch(const isc::dns::Name& name,
|
DatabaseClient::Finder::findWildcardMatch(
|
||||||
const isc::dns::RRType& type,
|
const Name& name, const RRType& type, const FindOptions options,
|
||||||
const DelegationSearchResult& dresult,
|
const DelegationSearchResult& dresult, vector<ConstRRsetPtr>* target,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
FindDNSSECContext& dnssec_ctx)
|
||||||
target, FindDNSSECContext& dnssec_ctx)
|
|
||||||
{
|
{
|
||||||
// Note that during the search we are going to search not only for the
|
// Note that during the search we are going to search not only for the
|
||||||
// requested type, but also for types that indicate a delegation -
|
// requested type, but also for types that indicate a delegation -
|
||||||
@@ -633,7 +632,7 @@ DatabaseClient::Finder::findWildcardMatch(const isc::dns::Name& name,
|
|||||||
if (dresult.first_ns) {
|
if (dresult.first_ns) {
|
||||||
// About to use first_ns. The only way this can be set is if
|
// About to use first_ns. The only way this can be set is if
|
||||||
// we are searching for glue, so do a sanity check.
|
// we are searching for glue, so do a sanity check.
|
||||||
if ((dnssec_ctx.getOptions() & FIND_GLUE_OK) == 0) {
|
if ((options & FIND_GLUE_OK) == 0) {
|
||||||
isc_throw(Unexpected, "Inconsistent conditions during "
|
isc_throw(Unexpected, "Inconsistent conditions during "
|
||||||
"cancel of wilcard search for " <<
|
"cancel of wilcard search for " <<
|
||||||
name.toText() << ": find_ns non-null when not "
|
name.toText() << ": find_ns non-null when not "
|
||||||
@@ -649,8 +648,8 @@ DatabaseClient::Finder::findWildcardMatch(const isc::dns::Name& name,
|
|||||||
} else if (!hasSubdomains(name.split(i - 1).toText())) {
|
} else if (!hasSubdomains(name.split(i - 1).toText())) {
|
||||||
// The wildcard match is the best one, find the final result
|
// The wildcard match is the best one, find the final result
|
||||||
// at it. Note that wildcard should never be the zone origin.
|
// at it. Note that wildcard should never be the zone origin.
|
||||||
return (findOnNameResult(name, type, found, &wildcard,
|
return (findOnNameResult(name, type, options, false, found,
|
||||||
target, dnssec_ctx));
|
&wildcard, target, dnssec_ctx));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// more specified match found, cancel wildcard match
|
// more specified match found, cancel wildcard match
|
||||||
@@ -714,19 +713,14 @@ DatabaseClient::Finder::logAndCreateResult(
|
|||||||
|
|
||||||
DatabaseClient::Finder::FindDNSSECContext::FindDNSSECContext(
|
DatabaseClient::Finder::FindDNSSECContext::FindDNSSECContext(
|
||||||
DatabaseClient::Finder* finderp,
|
DatabaseClient::Finder* finderp,
|
||||||
const isc::datasrc::ZoneFinder::FindOptions options,
|
const FindOptions options) :
|
||||||
const Name& origin) :
|
|
||||||
finderp_(finderp),
|
finderp_(finderp),
|
||||||
options_(options),
|
need_dnssec_((options & FIND_DNSSEC) != 0),
|
||||||
origin_(origin),
|
is_nsec3_(false),
|
||||||
|
is_nsec_(false),
|
||||||
initialized_(false)
|
initialized_(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ZoneFinder::FindOptions
|
|
||||||
DatabaseClient::Finder::FindDNSSECContext::getOptions() const {
|
|
||||||
return (options_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DatabaseClient::Finder::FindDNSSECContext::init() {
|
DatabaseClient::Finder::FindDNSSECContext::init() {
|
||||||
if (finderp_ == NULL) {
|
if (finderp_ == NULL) {
|
||||||
@@ -734,19 +728,13 @@ DatabaseClient::Finder::FindDNSSECContext::init() {
|
|||||||
}
|
}
|
||||||
if (!initialized_) {
|
if (!initialized_) {
|
||||||
initialized_ = true;
|
initialized_ = true;
|
||||||
// If NSEC3PARAM rrset exists, the zone looks like signed with NSEC3
|
if (need_dnssec_) {
|
||||||
is_nsec3_ = ((options_ & FIND_DNSSEC) == 0) ? false :
|
// If NSEC3PARAM rrset exists, the zone looks like signed with
|
||||||
finderp_->isNSEC3();
|
// NSEC3
|
||||||
if (is_nsec3_) {
|
is_nsec3_ = finderp_->isNSEC3();
|
||||||
// If the zone is signed with NSEC3, no need to check NSEC. If NSEC
|
|
||||||
// and NSEC3 coexist, according to RFC 5155 10-4, it should return
|
|
||||||
// result as NSEC3.
|
|
||||||
is_nsec_ = false;
|
|
||||||
} else {
|
|
||||||
// If no NSEC3PARAM and it is DNSSEC query, check whether NSEC
|
// If no NSEC3PARAM and it is DNSSEC query, check whether NSEC
|
||||||
// exist in apex of zone
|
// exist in apex of zone
|
||||||
is_nsec_ = ((options_ & FIND_DNSSEC) == 0) ? false :
|
is_nsec_ = is_nsec3_ ? false : finderp_->isNSEC();
|
||||||
finderp_->isNSEC();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -804,29 +792,10 @@ DatabaseClient::Finder::FindDNSSECContext::getNSECRRset(const Name &name) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseClient::Finder::FoundRRsets
|
|
||||||
DatabaseClient::Finder::FindDNSSECContext::getDNSSECRRset(const Name& name,
|
|
||||||
const RRType& type)
|
|
||||||
{
|
|
||||||
if (finderp_ == NULL) {
|
|
||||||
isc_throw(DataSourceError, "no Finder to query");
|
|
||||||
}
|
|
||||||
const bool is_origin = isOrigin(name);
|
|
||||||
WantedTypes final_types(isNSEC() ? FINAL_TYPES() : FINAL_TYPES_NO_NSEC());
|
|
||||||
final_types.insert(type);
|
|
||||||
return (finderp_->getRRsets(name.toText(), final_types, !is_origin, NULL,
|
|
||||||
type == RRType::ANY()));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
DatabaseClient::Finder::FindDNSSECContext::isOrigin(const Name &name) const {
|
|
||||||
return (name == origin_);
|
|
||||||
}
|
|
||||||
|
|
||||||
ZoneFinder::FindResultFlags
|
ZoneFinder::FindResultFlags
|
||||||
DatabaseClient::Finder::FindDNSSECContext::getResultFlags() {
|
DatabaseClient::Finder::FindDNSSECContext::getResultFlags() {
|
||||||
// If it is not DNSSEC query, it should return RESULT_DEFAULT
|
// If it is not DNSSEC query, it should return RESULT_DEFAULT
|
||||||
if ((options_ & FIND_DNSSEC) == 0) {
|
if (!need_dnssec_) {
|
||||||
return (RESULT_DEFAULT);
|
return (RESULT_DEFAULT);
|
||||||
}
|
}
|
||||||
// If it is a DNSSEC query and the zone is signed with NSEC3, it should
|
// If it is a DNSSEC query and the zone is signed with NSEC3, it should
|
||||||
@@ -843,6 +812,8 @@ DatabaseClient::Finder::FindDNSSECContext::getResultFlags() {
|
|||||||
ZoneFinder::ResultContext
|
ZoneFinder::ResultContext
|
||||||
DatabaseClient::Finder::findOnNameResult(const Name& name,
|
DatabaseClient::Finder::findOnNameResult(const Name& name,
|
||||||
const RRType& type,
|
const RRType& type,
|
||||||
|
const FindOptions options,
|
||||||
|
const bool is_origin,
|
||||||
const FoundRRsets& found,
|
const FoundRRsets& found,
|
||||||
const string* wildname,
|
const string* wildname,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
std::vector<isc::dns::ConstRRsetPtr>*
|
||||||
@@ -853,7 +824,7 @@ DatabaseClient::Finder::findOnNameResult(const Name& name,
|
|||||||
// If the zone file is signed with NSEC3, need to set RESULT_NSEC3_SIGNED
|
// If the zone file is signed with NSEC3, need to set RESULT_NSEC3_SIGNED
|
||||||
// flag in the flags. It is good for upper caller to deal with the query
|
// flag in the flags. It is good for upper caller to deal with the query
|
||||||
// response message.
|
// response message.
|
||||||
if (wild & dnssec_ctx.isNSEC3()) {
|
if (wild && dnssec_ctx.isNSEC3()) {
|
||||||
flags = (flags | RESULT_NSEC3_SIGNED);
|
flags = (flags | RESULT_NSEC3_SIGNED);
|
||||||
}
|
}
|
||||||
// Get iterators for the different types of records we are interested in -
|
// Get iterators for the different types of records we are interested in -
|
||||||
@@ -869,8 +840,7 @@ DatabaseClient::Finder::findOnNameResult(const Name& name,
|
|||||||
flags = (flags | RESULT_NSEC_SIGNED);
|
flags = (flags | RESULT_NSEC_SIGNED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dnssec_ctx.isOrigin(name) &&
|
if (!is_origin && (options & FIND_GLUE_OK) == 0 &&
|
||||||
((dnssec_ctx.getOptions() & FIND_GLUE_OK) == 0) &&
|
|
||||||
nsi != found.second.end()) {
|
nsi != found.second.end()) {
|
||||||
// A NS RRset was found at the domain we were searching for. As it is
|
// A NS RRset was found at the domain we were searching for. As it is
|
||||||
// not at the origin of the zone, it is a delegation and indicates that
|
// not at the origin of the zone, it is a delegation and indicates that
|
||||||
@@ -938,16 +908,17 @@ DatabaseClient::Finder::findOnNameResult(const Name& name,
|
|||||||
// NULL for 'wildname'.
|
// NULL for 'wildname'.
|
||||||
return (logAndCreateResult(name, NULL, type, NXRRSET, nsec_rrset,
|
return (logAndCreateResult(name, NULL, type, NXRRSET, nsec_rrset,
|
||||||
DATASRC_DATABASE_FOUND_NXRRSET_NSEC,
|
DATASRC_DATABASE_FOUND_NXRRSET_NSEC,
|
||||||
(flags | RESULT_NSEC_SIGNED)));
|
flags | RESULT_NSEC_SIGNED));
|
||||||
}
|
}
|
||||||
return (logAndCreateResult(name, wildname, type, NXRRSET, nsec_rrset,
|
return (logAndCreateResult(name, wildname, type, NXRRSET, nsec_rrset,
|
||||||
wild ? DATASRC_DATABASE_WILDCARD_NXRRSET :
|
wild ? DATASRC_DATABASE_WILDCARD_NXRRSET :
|
||||||
DATASRC_DATABASE_FOUND_NXRRSET,
|
DATASRC_DATABASE_FOUND_NXRRSET,
|
||||||
(flags | dnssec_ctx.getResultFlags())));
|
flags | dnssec_ctx.getResultFlags()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneFinder::ResultContext
|
ZoneFinder::ResultContext
|
||||||
DatabaseClient::Finder::findNoNameResult(const Name& name, const RRType& type,
|
DatabaseClient::Finder::findNoNameResult(const Name& name, const RRType& type,
|
||||||
|
FindOptions options,
|
||||||
const DelegationSearchResult& dresult,
|
const DelegationSearchResult& dresult,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
std::vector<isc::dns::ConstRRsetPtr>*
|
||||||
target, FindDNSSECContext& dnssec_ctx)
|
target, FindDNSSECContext& dnssec_ctx)
|
||||||
@@ -965,18 +936,19 @@ DatabaseClient::Finder::findNoNameResult(const Name& name, const RRType& type,
|
|||||||
arg(accessor_->getDBName()).arg(name);
|
arg(accessor_->getDBName()).arg(name);
|
||||||
const ConstRRsetPtr nsec = dnssec_ctx.isNSEC() ? findNSECCover(name) :
|
const ConstRRsetPtr nsec = dnssec_ctx.isNSEC() ? findNSECCover(name) :
|
||||||
ConstRRsetPtr();
|
ConstRRsetPtr();
|
||||||
if(dnssec_ctx.isNSEC() && !nsec){
|
if (dnssec_ctx.isNSEC() && !nsec) {
|
||||||
isc_throw(DataSourceError,
|
isc_throw(DataSourceError,
|
||||||
"no NSEC RR covers in the NSEC signed zone");
|
"no NSEC RR covers in the NSEC signed zone");
|
||||||
}
|
}
|
||||||
return (ResultContext(NXRRSET, nsec, dnssec_ctx.getResultFlags()));
|
return (ResultContext(NXRRSET, nsec, dnssec_ctx.getResultFlags()));
|
||||||
} else if ((dnssec_ctx.getOptions() & NO_WILDCARD) == 0) {
|
} else if ((options & NO_WILDCARD) == 0) {
|
||||||
// It's not an empty non-terminal and wildcard matching is not
|
// It's not an empty non-terminal and wildcard matching is not
|
||||||
// disabled, so check for wildcards. If there is a wildcard match
|
// disabled, so check for wildcards. If there is a wildcard match
|
||||||
// (i.e. all results except NXDOMAIN) return it; otherwise fall
|
// (i.e. all results except NXDOMAIN) return it; otherwise fall
|
||||||
// through to the NXDOMAIN case below.
|
// through to the NXDOMAIN case below.
|
||||||
const ResultContext wcontext =
|
const ResultContext wcontext =
|
||||||
findWildcardMatch(name, type, dresult, target, dnssec_ctx);
|
findWildcardMatch(name, type, options, dresult, target,
|
||||||
|
dnssec_ctx);
|
||||||
if (wcontext.code != NXDOMAIN) {
|
if (wcontext.code != NXDOMAIN) {
|
||||||
return (wcontext);
|
return (wcontext);
|
||||||
}
|
}
|
||||||
@@ -988,7 +960,7 @@ DatabaseClient::Finder::findNoNameResult(const Name& name, const RRType& type,
|
|||||||
arg(accessor_->getDBName()).arg(name).arg(type).arg(getClass());
|
arg(accessor_->getDBName()).arg(name).arg(type).arg(getClass());
|
||||||
const ConstRRsetPtr nsec = dnssec_ctx.isNSEC() ? findNSECCover(name) :
|
const ConstRRsetPtr nsec = dnssec_ctx.isNSEC() ? findNSECCover(name) :
|
||||||
ConstRRsetPtr();
|
ConstRRsetPtr();
|
||||||
if(dnssec_ctx.isNSEC() && !nsec){
|
if (dnssec_ctx.isNSEC() && !nsec) {
|
||||||
isc_throw(DataSourceError, "no NSEC RR covers in the NSEC signed zone");
|
isc_throw(DataSourceError, "no NSEC RR covers in the NSEC signed zone");
|
||||||
}
|
}
|
||||||
return (ResultContext(NXDOMAIN, nsec, dnssec_ctx.getResultFlags()));
|
return (ResultContext(NXDOMAIN, nsec, dnssec_ctx.getResultFlags()));
|
||||||
@@ -1057,16 +1029,23 @@ DatabaseClient::Finder::findInternal(const Name& name, const RRType& type,
|
|||||||
// - Requested name is a delegation point (NS only but not at the zone
|
// - Requested name is a delegation point (NS only but not at the zone
|
||||||
// apex - DNAME is ignored here as it redirects DNS names subordinate to
|
// apex - DNAME is ignored here as it redirects DNS names subordinate to
|
||||||
// the owner name - the owner name itself is not redirected.)
|
// the owner name - the owner name itself is not redirected.)
|
||||||
FindDNSSECContext dnssec_ctx(this, options, getOrigin());
|
const bool is_origin = (name == getOrigin());
|
||||||
const FoundRRsets found = dnssec_ctx.getDNSSECRRset(name, type);
|
WantedTypes final_types(FINAL_TYPES());
|
||||||
|
final_types.insert(type);
|
||||||
|
const FoundRRsets found = getRRsets(name.toText(), final_types,
|
||||||
|
!is_origin, NULL,
|
||||||
|
type == RRType::ANY());
|
||||||
|
FindDNSSECContext dnssec_ctx(this, options);
|
||||||
if (found.first) {
|
if (found.first) {
|
||||||
// Something found at the domain name. Look into it further to get
|
// Something found at the domain name. Look into it further to get
|
||||||
// the final result.
|
// the final result.
|
||||||
return (findOnNameResult(name, type, found, NULL, target, dnssec_ctx));
|
return (findOnNameResult(name, type, options, is_origin, found, NULL,
|
||||||
|
target, dnssec_ctx));
|
||||||
} else {
|
} else {
|
||||||
// Did not find anything at all at the domain name, so check for
|
// Did not find anything at all at the domain name, so check for
|
||||||
// subdomains or wildcards.
|
// subdomains or wildcards.
|
||||||
return (findNoNameResult(name, type, dresult, target, dnssec_ctx));
|
return (findNoNameResult(name, type, options, dresult, target,
|
||||||
|
dnssec_ctx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -688,127 +688,7 @@ public:
|
|||||||
///
|
///
|
||||||
/// Methods directly corresponds to the ones in ZoneFinder.
|
/// Methods directly corresponds to the ones in ZoneFinder.
|
||||||
class Finder : public ZoneFinder {
|
class Finder : public ZoneFinder {
|
||||||
|
public:
|
||||||
/// \brief Helper to the findInterval.
|
|
||||||
///
|
|
||||||
/// Get the ResultFlags for findInterval. If the zone is signed with
|
|
||||||
/// NSEC3, it will return RESULT_NSEC3_SIGNED. If it is signed with
|
|
||||||
/// NSEC, it wll return RESULT_NSEC_SIGNED. Otherwise it will return
|
|
||||||
/// RESULT_DEFAULT. It wraps getRRsets function to do some special
|
|
||||||
/// search, like searching NSEC RRset by getNSECRRset function,
|
|
||||||
/// searching DNSSEC related RRset and RRsig by getNSECRRset.
|
|
||||||
class FindDNSSECContext {
|
|
||||||
public:
|
|
||||||
|
|
||||||
/// \brief Constructor for FindDNSSECContext class.
|
|
||||||
///
|
|
||||||
/// It initalize a helper for findInterval function.
|
|
||||||
///
|
|
||||||
/// \param finderp The Finder piont for search.
|
|
||||||
/// \param options Search options.
|
|
||||||
/// \param origin The origin name for this finder.
|
|
||||||
FindDNSSECContext(Finder* finderp, const FindOptions options,
|
|
||||||
const isc::dns::Name& origin);
|
|
||||||
|
|
||||||
/// \brief Get result flags of this query.
|
|
||||||
/// \return ResultFlags for this query. If the zone file is
|
|
||||||
/// signed with NSEC, is will return RESULT_NSEC_SIGNED with
|
|
||||||
/// dnssec query. If the zone file is signed with NSEC3, it
|
|
||||||
/// will return RESULT_NSEC3_SIGNED with dnssec query, others
|
|
||||||
/// it should return RESULT_DEFAULT.
|
|
||||||
ZoneFinder::FindResultFlags getResultFlags();
|
|
||||||
|
|
||||||
typedef std::pair<bool, std::map<dns::RRType, dns::RRsetPtr> >
|
|
||||||
FoundRRsets;
|
|
||||||
/// \brief Get DNSSEC RRset for the queried name.
|
|
||||||
///
|
|
||||||
/// It should return the RRsets and RRsigs for the queried
|
|
||||||
/// name with designated type.
|
|
||||||
///
|
|
||||||
/// \param name The queried name.
|
|
||||||
/// \param type The queried type.
|
|
||||||
/// \return RRsets and RRsigs that are matched.
|
|
||||||
FoundRRsets getDNSSECRRset(const isc::dns::Name& name,
|
|
||||||
const isc::dns::RRType& type);
|
|
||||||
|
|
||||||
/// \brief Get the needed NSEC RRset.
|
|
||||||
///
|
|
||||||
/// It should return the needed NSEC RRset.
|
|
||||||
///
|
|
||||||
/// \param name The name which the NSEC RRset belong to.
|
|
||||||
/// \return the needed NSEC RRsets.
|
|
||||||
isc::dns::ConstRRsetPtr getNSECRRset(const isc::dns::Name&
|
|
||||||
name) const;
|
|
||||||
|
|
||||||
/// \brief Get the needed NSEC RRset.
|
|
||||||
///
|
|
||||||
/// It should return the needed NSEC RRset.
|
|
||||||
///
|
|
||||||
/// \param found_set The RRset which contain the NSEC an other
|
|
||||||
/// type RRs.
|
|
||||||
/// \return the needed NSEC RRsets.
|
|
||||||
isc::dns::ConstRRsetPtr getNSECRRset(const FoundRRsets&
|
|
||||||
found_set) const;
|
|
||||||
|
|
||||||
/// \brief Check whether the zone file is signed with NSECi3.
|
|
||||||
///
|
|
||||||
/// It checks whether the zone file is signed with NSEC3. If
|
|
||||||
/// yes, return true, otherwise return false.
|
|
||||||
///
|
|
||||||
/// \return True for NSEC3, false otherwise.
|
|
||||||
bool isNSEC3();
|
|
||||||
|
|
||||||
/// \brief Check whether the zone file is signed with NSEC.
|
|
||||||
///
|
|
||||||
/// It checks whether the zone file is signed with NSEC, If
|
|
||||||
/// yes, return true, otherwise return false.
|
|
||||||
///
|
|
||||||
/// \return True for NSEC, false otherwise.
|
|
||||||
bool isNSEC();
|
|
||||||
|
|
||||||
/// \brief Check whether the name is origin name of the zone.
|
|
||||||
///
|
|
||||||
/// It checks whether the name is origin name of the zone. Yes
|
|
||||||
/// for the origin name, false for not.
|
|
||||||
///
|
|
||||||
/// \param name The queried name.
|
|
||||||
/// \return True for origin name, false for not.
|
|
||||||
bool isOrigin(const isc::dns::Name& name) const;
|
|
||||||
|
|
||||||
/// \brief get the options of queried.
|
|
||||||
///
|
|
||||||
/// It return the queried options.
|
|
||||||
///
|
|
||||||
/// \return It return the queried options.
|
|
||||||
ZoneFinder::FindOptions getOptions() const;
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// \brief Init the attributes in this entity.
|
|
||||||
///
|
|
||||||
/// It should init the attributes of this entity. Check whether
|
|
||||||
/// it is the NSEC or NSEC3 zone file if it is a dnssec query.
|
|
||||||
///
|
|
||||||
/// \note If the entity is initialized, no need to init it
|
|
||||||
/// again.
|
|
||||||
void init();
|
|
||||||
|
|
||||||
/// \brief Check whether the entity is initalized.
|
|
||||||
///
|
|
||||||
/// It should return true if the entity is inited, else return
|
|
||||||
/// false.
|
|
||||||
///
|
|
||||||
/// \return True for inited, else return false.
|
|
||||||
bool isInited();
|
|
||||||
DatabaseClient::Finder* finderp_;
|
|
||||||
ZoneFinder::ZoneFinder::FindOptions options_;
|
|
||||||
FindResultFlags flags_;
|
|
||||||
isc::dns::Name origin_;
|
|
||||||
bool is_nsec3_;
|
|
||||||
bool is_nsec_;
|
|
||||||
bool initialized_;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
/// \brief Constructor
|
/// \brief Constructor
|
||||||
///
|
///
|
||||||
/// \param database The database (shared with DatabaseClient) to
|
/// \param database The database (shared with DatabaseClient) to
|
||||||
@@ -971,7 +851,94 @@ public:
|
|||||||
const std::string* construct_name = NULL,
|
const std::string* construct_name = NULL,
|
||||||
bool any = false);
|
bool any = false);
|
||||||
|
|
||||||
private:
|
/// \brief Helper to the findInterval.
|
||||||
|
///
|
||||||
|
/// Get the ResultFlags for findInterval. If the zone is signed with
|
||||||
|
/// NSEC3, it will return RESULT_NSEC3_SIGNED. If it is signed with
|
||||||
|
/// NSEC, it wll return RESULT_NSEC_SIGNED. Otherwise it will return
|
||||||
|
/// RESULT_DEFAULT. It wraps getRRsets function to do some special
|
||||||
|
/// search, like searching NSEC RRset by getNSECRRset function,
|
||||||
|
/// searching DNSSEC related RRset and RRsig by getNSECRRset.
|
||||||
|
class FindDNSSECContext {
|
||||||
|
public:
|
||||||
|
/// \brief Constructor for FindDNSSECContext class.
|
||||||
|
///
|
||||||
|
/// It initalize a helper for findInterval function.
|
||||||
|
///
|
||||||
|
/// \param finderp The Finder piont for search.
|
||||||
|
/// \param options Search options.
|
||||||
|
FindDNSSECContext(Finder* finderp, const FindOptions options);
|
||||||
|
|
||||||
|
/// \brief Get result flags of this query.
|
||||||
|
/// \return ResultFlags for this query. If the zone file is
|
||||||
|
/// signed with NSEC, is will return RESULT_NSEC_SIGNED with
|
||||||
|
/// dnssec query. If the zone file is signed with NSEC3, it
|
||||||
|
/// will return RESULT_NSEC3_SIGNED with dnssec query, others
|
||||||
|
/// it should return RESULT_DEFAULT.
|
||||||
|
ZoneFinder::FindResultFlags getResultFlags();
|
||||||
|
|
||||||
|
/// \brief Get the needed NSEC RRset.
|
||||||
|
///
|
||||||
|
/// It should return the needed NSEC RRset.
|
||||||
|
///
|
||||||
|
/// \param name The name which the NSEC RRset belong to.
|
||||||
|
/// \return the needed NSEC RRsets.
|
||||||
|
isc::dns::ConstRRsetPtr getNSECRRset(const isc::dns::Name&
|
||||||
|
name) const;
|
||||||
|
|
||||||
|
/// \brief Get the needed NSEC RRset.
|
||||||
|
///
|
||||||
|
/// It should return the needed NSEC RRset.
|
||||||
|
///
|
||||||
|
/// \param found_set The RRset which contain the NSEC an other
|
||||||
|
/// type RRs.
|
||||||
|
/// \return the needed NSEC RRsets.
|
||||||
|
isc::dns::ConstRRsetPtr getNSECRRset(const FoundRRsets&
|
||||||
|
found_set) const;
|
||||||
|
|
||||||
|
/// \brief Check whether the zone file is signed with NSECi3.
|
||||||
|
///
|
||||||
|
/// It checks whether the zone file is signed with NSEC3. If
|
||||||
|
/// yes, return true, otherwise return false.
|
||||||
|
///
|
||||||
|
/// \return True for NSEC3, false otherwise.
|
||||||
|
bool isNSEC3();
|
||||||
|
|
||||||
|
/// \brief Check whether the zone file is signed with NSEC.
|
||||||
|
///
|
||||||
|
/// It checks whether the zone file is signed with NSEC, If
|
||||||
|
/// yes, return true, otherwise return false.
|
||||||
|
///
|
||||||
|
/// \return True for NSEC, false otherwise.
|
||||||
|
bool isNSEC();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// \brief Init the attributes in this entity.
|
||||||
|
///
|
||||||
|
/// It should init the attributes of this entity. Check whether
|
||||||
|
/// it is the NSEC or NSEC3 zone file if it is a dnssec query.
|
||||||
|
///
|
||||||
|
/// \note If the entity is initialized, no need to init it
|
||||||
|
/// again.
|
||||||
|
void init();
|
||||||
|
|
||||||
|
/// \brief Check whether the entity is initialized.
|
||||||
|
///
|
||||||
|
/// It should return true if the entity is inited, else return
|
||||||
|
/// false.
|
||||||
|
///
|
||||||
|
/// \return True for inited, else return false.
|
||||||
|
bool isInited();
|
||||||
|
|
||||||
|
DatabaseClient::Finder* const finderp_;
|
||||||
|
const bool need_dnssec_;
|
||||||
|
|
||||||
|
FindResultFlags flags_;
|
||||||
|
bool is_nsec3_;
|
||||||
|
bool is_nsec_;
|
||||||
|
bool initialized_;
|
||||||
|
};
|
||||||
|
|
||||||
/// \brief Search result of \c findDelegationPoint().
|
/// \brief Search result of \c findDelegationPoint().
|
||||||
///
|
///
|
||||||
/// This is a tuple combining the result of the search - a status code
|
/// This is a tuple combining the result of the search - a status code
|
||||||
@@ -1067,6 +1034,8 @@ public:
|
|||||||
///
|
///
|
||||||
/// \param name The name to find
|
/// \param name The name to find
|
||||||
/// \param type The RRType to find
|
/// \param type The RRType to find
|
||||||
|
/// \param options Options about how to search. See the documentation
|
||||||
|
/// for ZoneFinder::FindOptions.
|
||||||
/// \param dresult Result of the search through the zone for a
|
/// \param dresult Result of the search through the zone for a
|
||||||
/// delegation.
|
/// delegation.
|
||||||
/// \param target If the type happens to be ANY, it will insert all
|
/// \param target If the type happens to be ANY, it will insert all
|
||||||
@@ -1083,6 +1052,7 @@ public:
|
|||||||
/// NXDOMAIN or an NXRRSET.
|
/// NXDOMAIN or an NXRRSET.
|
||||||
ResultContext findWildcardMatch(const isc::dns::Name& name,
|
ResultContext findWildcardMatch(const isc::dns::Name& name,
|
||||||
const isc::dns::RRType& type,
|
const isc::dns::RRType& type,
|
||||||
|
const FindOptions options,
|
||||||
const DelegationSearchResult& dresult,
|
const DelegationSearchResult& dresult,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
std::vector<isc::dns::ConstRRsetPtr>*
|
||||||
target, FindDNSSECContext& dnssec_ctx);
|
target, FindDNSSECContext& dnssec_ctx);
|
||||||
@@ -1106,6 +1076,9 @@ public:
|
|||||||
///
|
///
|
||||||
/// \param name The name to find
|
/// \param name The name to find
|
||||||
/// \param type The RRType to find
|
/// \param type The RRType to find
|
||||||
|
/// \param options Options about how to search. See the documentation
|
||||||
|
/// for ZoneFinder::FindOptions.
|
||||||
|
/// \param is_origin If name is the zone's origin name.
|
||||||
/// \param found A set of found RRsets in the search for the name
|
/// \param found A set of found RRsets in the search for the name
|
||||||
/// and type. It could contain one or more of the requested
|
/// and type. It could contain one or more of the requested
|
||||||
/// type, CNAME, NS, and NSEC RRsets of the name.
|
/// type, CNAME, NS, and NSEC RRsets of the name.
|
||||||
@@ -1126,6 +1099,8 @@ public:
|
|||||||
/// method.
|
/// method.
|
||||||
ResultContext findOnNameResult(const isc::dns::Name& name,
|
ResultContext findOnNameResult(const isc::dns::Name& name,
|
||||||
const isc::dns::RRType& type,
|
const isc::dns::RRType& type,
|
||||||
|
const FindOptions options,
|
||||||
|
const bool is_origin,
|
||||||
const FoundRRsets& found,
|
const FoundRRsets& found,
|
||||||
const std::string* wildname,
|
const std::string* wildname,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
std::vector<isc::dns::ConstRRsetPtr>*
|
||||||
@@ -1163,6 +1138,7 @@ public:
|
|||||||
/// success due to an exact match).
|
/// success due to an exact match).
|
||||||
ResultContext findNoNameResult(const isc::dns::Name& name,
|
ResultContext findNoNameResult(const isc::dns::Name& name,
|
||||||
const isc::dns::RRType& type,
|
const isc::dns::RRType& type,
|
||||||
|
FindOptions options,
|
||||||
const DelegationSearchResult& dresult,
|
const DelegationSearchResult& dresult,
|
||||||
std::vector<isc::dns::ConstRRsetPtr>*
|
std::vector<isc::dns::ConstRRsetPtr>*
|
||||||
target, FindDNSSECContext& dnssec_ctx);
|
target, FindDNSSECContext& dnssec_ctx);
|
||||||
@@ -1218,8 +1194,6 @@ public:
|
|||||||
/// To find stuff in the result of getRRsets.
|
/// To find stuff in the result of getRRsets.
|
||||||
typedef std::map<dns::RRType, dns::RRsetPtr>::const_iterator
|
typedef std::map<dns::RRType, dns::RRsetPtr>::const_iterator
|
||||||
FoundIterator;
|
FoundIterator;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Find a zone in the database
|
/// \brief Find a zone in the database
|
||||||
|
Reference in New Issue
Block a user