///|
pub fn sensitive_path_patterns() -> Array[String] {
[
"/admin", "/login", "/logout", "/account", "/private", "/internal", "/debug",
"/.git", "/backup", "/config",
]
}
///|
pub fn sensitive_paths_allowed(text : String, agent : String) -> Array[String] {
let robots = parse(text)
let result : Array[String] = []
for path in sensitive_path_patterns() {
if decide(robots, agent, path).allowed {
result.push(path)
}
}
result
}
///|
pub fn sensitive_report(text : String, agent : String) -> String {
let paths = sensitive_paths_allowed(text, agent)
if paths.is_empty() {
"ok"
} else {
"sensitive paths allowed: " + join_with(paths, ",")
}
}
///|
pub fn protects_sensitive_defaults(text : String, agent : String) -> Bool {
sensitive_paths_allowed(text, agent).is_empty()
}
///|
pub fn missing_common_blocks(text : String, agent : String) -> Array[String] {
let robots = parse(text)
let missing : Array[String] = []
for path in sensitive_path_patterns() {
if decide(robots, agent, path).allowed {
missing.push("Disallow: " + path)
}
}
missing
}
///|
pub fn suggested_security_group(agent : String) -> Group {
let mut group = group_for_agents([agent])
for path in sensitive_path_patterns() {
group = group_add_disallow(group, path)
}
group
}
///|
pub fn security_patch(agent : String) -> String {
render_group(suggested_security_group(agent))
}
///|
pub fn security_score(text : String, agent : String) -> Int {
let total = sensitive_path_patterns().length()
let open = sensitive_paths_allowed(text, agent).length()
if total == 0 {
100
} else {
(total - open) * 100 / total
}
}