Tools to work with the Google DNS over HTTPS API in R
https://cinc.rud.is/web/packages/gdns/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
#' Split out all SPF records in a domain's TXT record
|
|
#'
|
|
#' Given a vector of TXT records, this function will return a list of vectors
|
|
#' of all the SPF records for each. If the given TXT record is not an SPF
|
|
#' record, \code{NULL} is returned (which makes it easy to skip with \code{purrr}
|
|
#' functions).
|
|
#'
|
|
#' @param spf_rec a character vector of DNS TXT records
|
|
#' @export
|
|
split_spf <- function(spf_rec) {
|
|
purrr::map(spf_rec, .split_spf)
|
|
}
|
|
|
|
.split_spf <- function(spf_rec) {
|
|
|
|
if (has_spf(spf_rec)) {
|
|
spf_rec <- stringi::stri_trim(stringi::stri_replace_all_regex(spf_rec, '"', ""))
|
|
recs <- stri_trim(unlist(stringi::stri_split_regex(spf_rec, "\ +")))
|
|
grep("v=spf1", recs, invert=TRUE, value=TRUE)
|
|
} else {
|
|
NA_character_
|
|
}
|
|
|
|
}
|
|
|
|
#' Test for whether a DNS TXT record is an SPF record
|
|
#'
|
|
#' @param spf_rec a character vector of DNS TXT records
|
|
#' @export
|
|
has_spf <- function(spf_rec) {
|
|
grepl("v=spf1", spf_rec)
|
|
}
|
|
|
|
#' SPF "all" type test
|
|
#'
|
|
#' @param spf_rec a character vector of DNS TXT records
|
|
#' @export
|
|
is_soft_fail <- function(spf_rec) {
|
|
ret <- vector("logical", length(spf_rec))
|
|
spf_rec <- stringi::stri_trim(stringi::stri_replace_all_regex(spf_rec, '"', ""))
|
|
SPF <- which(has_spf(spf_rec))
|
|
ret[SPF] <- grepl("~all$", stringi::stri_trim(spf_rec[SPF]))
|
|
ret[!SPF] <- NA
|
|
ret
|
|
}
|
|
|
|
#' @rdname is_soft_fail
|
|
#' @export
|
|
is_hard_fail <- function(spf_rec) {
|
|
ret <- vector("logical", length(spf_rec))
|
|
spf_rec <- stringi::stri_trim(stringi::stri_replace_all_regex(spf_rec, '"', ""))
|
|
SPF <- which(has_spf(spf_rec))
|
|
ret[SPF] <- grepl("\\-all$", stringi::stri_trim(spf_rec[SPF]))
|
|
ret[!SPF] <- NA
|
|
ret
|
|
}
|
|
|
|
#' @rdname is_soft_fail
|
|
#' @export
|
|
passes_all <- function(spf_rec) {
|
|
ret <- vector("logical", length(spf_rec))
|
|
spf_rec <- stringi::stri_trim(stringi::stri_replace_all_regex(spf_rec, '"', ""))
|
|
SPF <- which(has_spf(spf_rec))
|
|
ret[SPF] <- grepl("[\\+ ]all$", stringi::stri_trim(spf_rec[SPF]))
|
|
ret[!SPF] <- NA
|
|
ret
|
|
}
|
|
|
|
#' SPF field extraction functions
|
|
#'
|
|
#' Various helper functions to extract SPF record components.
|
|
#'
|
|
#' @param spf_rec a character vector of DNS TXT records
|
|
#' @export
|
|
spf_ipv4s <- function(spf_rec) {
|
|
purrr::map(split_spf(spf_rec), function(x) {
|
|
stringi::stri_replace_all_regex(grep("ip4", x, value=TRUE), "^ip4:", "")
|
|
})
|
|
}
|
|
|
|
#' @rdname spf_ipv4s
|
|
#' @export
|
|
spf_ipv6s <- function(spf_rec) {
|
|
purrr::map(split_spf(spf_rec), function(x) {
|
|
stringi::stri_replace_all_regex(grep("ip6", x, value=TRUE), "^ip6:", "")
|
|
})
|
|
}
|
|
|
|
#' @rdname spf_ipv4s
|
|
#' @export
|
|
spf_includes <- function(spf_rec) {
|
|
purrr::map(split_spf(spf_rec), function(x) {
|
|
stringi::stri_replace_all_regex(grep("include", x, value=TRUE), "^include:", "")
|
|
})
|
|
}
|
|
|
|
#' @rdname spf_ipv4s
|
|
#' @export
|
|
spf_ptrs <- function(spf_rec) {
|
|
purrr::map(split_spf(spf_rec), function(x) {
|
|
stringi::stri_replace_all_regex(grep("ptr", x, value=TRUE), "^ptr[:]", "")
|
|
})
|
|
}
|
|
|
|
#' @rdname spf_ipv4s
|
|
#' @export
|
|
spf_exists <- function(spf_rec) {
|
|
purrr::map(split_spf(spf_rec), function(x) {
|
|
stringi::stri_replace_all_regex(grep("exists", x, value=TRUE), "^exists:", "")
|
|
})
|
|
}
|
|
|