@@ -249,7 +249,7 @@ func (p *parser) check() (Result, string, unused, error) {
249249 case tExists :
250250 matches , result , ttl , err = p .parseExists (token )
251251 case tPTR :
252- _ , _ , _ = p .parsePtr (token )
252+ matches , result , err = p .parsePtr (token )
253253 default :
254254 p .fireDirective (token , "" )
255255 }
@@ -600,9 +600,56 @@ func (p *parser) parseExists(t *token) (bool, Result, time.Duration, error) {
600600 }
601601}
602602
603+ // https://www.rfc-editor.org/rfc/rfc7208#section-5.5
603604func (p * parser ) parsePtr (t * token ) (bool , Result , error ) {
604- p .fireDirective (t , domainSpec (t .value , p .domain ))
605- return false , internalError , nil
605+ fqdn := domainSpec (t .value , p .domain )
606+ fqdn , err := parseMacro (p , fqdn , false )
607+ if err == nil {
608+ fqdn , err = truncateFQDN (fqdn )
609+ }
610+ if err == nil && ! isDomainName (fqdn ) {
611+ err = newInvalidDomainError (fqdn )
612+ }
613+ fqdn = NormalizeFQDN (fqdn )
614+ p .fireDirective (t , fqdn )
615+ if err != nil {
616+ return true , Permerror , SyntaxError {t , err }
617+ }
618+
619+ ptrs , _ , err := p .resolver .LookupPTR (p .ip .String ())
620+ switch err {
621+ case nil :
622+ // continue
623+ case ErrDNSLimitExceeded :
624+ return false , Permerror , err
625+ case ErrDNSPermerror :
626+ return false , None , err
627+ default :
628+ return false , Temperror , err
629+ }
630+
631+ result , _ := matchingResult (t .qualifier )
632+
633+ for _ , ptrDomain := range ptrs {
634+ found , _ , err := p .resolver .MatchIP (ptrDomain , func (ip net.IP , host string ) (bool , error ) {
635+ if ip .Equal (p .ip ) {
636+ // Check if the PTR domain matches the target name or is a subdomain of the target name
637+ if strings .HasSuffix (ptrDomain , fqdn ) || fqdn == ptrDomain {
638+ return true , nil // Match found
639+ }
640+ }
641+ return false , nil
642+ })
643+ if err != nil {
644+ continue
645+ }
646+
647+ if found {
648+ return true , result , nil
649+ }
650+ }
651+
652+ return false , Fail , nil
606653}
607654
608655func (p * parser ) handleRedirect (t * token ) (Result , error ) {
0 commit comments