Skip to content
This repository has been archived by the owner on Mar 2, 2020. It is now read-only.

Use the domain_audit table for top domain audit filter #215

Merged
merged 3 commits into from
Oct 15, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions src/env/config/file_locations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ pub struct Files {
local_versions: String,
#[serde(default = "default_local_branches")]
local_branches: String,
#[serde(default = "default_audit_log")]
audit_log: String,
#[serde(default = "default_gravity")]
gravity: String,
#[serde(default = "default_gravity_backup")]
Expand All @@ -54,7 +52,6 @@ impl Default for Files {
ftl_config: default_ftl_config(),
local_versions: default_local_versions(),
local_branches: default_local_branches(),
audit_log: default_audit_log(),
gravity: default_gravity(),
gravity_backup: default_gravity_backup(),
black_list: default_black_list(),
Expand All @@ -74,7 +71,6 @@ impl Files {
&self.ftl_config,
&self.local_versions,
&self.local_branches,
&self.audit_log,
&self.gravity,
&self.gravity_backup,
&self.black_list,
Expand All @@ -95,7 +91,6 @@ impl Files {
PiholeFile::FtlConfig => &self.ftl_config,
PiholeFile::LocalVersions => &self.local_versions,
PiholeFile::LocalBranches => &self.local_branches,
PiholeFile::AuditLog => &self.audit_log,
PiholeFile::Gravity => &self.gravity,
PiholeFile::GravityBackup => &self.gravity_backup,
PiholeFile::BlackList => &self.black_list,
Expand All @@ -121,7 +116,6 @@ default!(default_setup_vars, SetupVars);
default!(default_ftl_config, FtlConfig);
default!(default_local_versions, LocalVersions);
default!(default_local_branches, LocalBranches);
default!(default_audit_log, AuditLog);
default!(default_gravity, Gravity);
default!(default_gravity_backup, GravityBackup);
default!(default_black_list, BlackList);
Expand Down
2 changes: 0 additions & 2 deletions src/env/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ pub enum PiholeFile {
FtlConfig,
LocalVersions,
LocalBranches,
AuditLog,
Gravity,
GravityBackup,
BlackList,
Expand All @@ -38,7 +37,6 @@ impl PiholeFile {
PiholeFile::FtlConfig => "/etc/pihole/pihole-FTL.conf",
PiholeFile::LocalVersions => "/etc/pihole/localversions",
PiholeFile::LocalBranches => "/etc/pihole/localbranches",
PiholeFile::AuditLog => "/etc/pihole/auditlog.list",
PiholeFile::Gravity => "/etc/pihole/gravity.list",
PiholeFile::GravityBackup => "/etc/pihole/gravity.list.bck",
PiholeFile::BlackList => "/etc/pihole/black.list",
Expand Down
8 changes: 4 additions & 4 deletions src/ftl/memory_model/domain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ use crate::ftl::memory_model::MAGIC_BYTE;

/// The domain struct stored in shared memory
#[repr(C)]
#[cfg_attr(test, derive(PartialEq, Debug))]
#[derive(Copy, Clone)]
#[cfg_attr(test, derive(Debug))]
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
pub struct FtlDomain {
magic: libc::c_uchar,
pub regex_match: FtlRegexMatch,
Expand Down Expand Up @@ -67,8 +67,8 @@ impl Default for FtlDomain {
/// The regex state a domain can hold. Unknown is the default state, before it
/// is checked when a query of the domain comes in.
#[repr(u8)]
#[cfg_attr(test, derive(PartialEq, Debug))]
#[derive(Copy, Clone)]
#[cfg_attr(test, derive(Debug))]
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
#[allow(dead_code)]
pub enum FtlRegexMatch {
Unknown,
Expand Down
97 changes: 76 additions & 21 deletions src/routes/stats/database/top_domains_db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

use crate::{
databases::ftl::FtlDatabase,
env::{Env, PiholeFile},
env::Env,
ftl::BLOCKED_STATUSES,
routes::{
auth::User,
Expand All @@ -23,6 +23,7 @@ use crate::{
top_domains::{TopDomainItemReply, TopDomainParams, TopDomainsReply}
}
},
services::domain_audit::{DomainAuditRepository, DomainAuditRepositoryGuard},
util::{reply_result, Error, ErrorKind, Reply}
};
use diesel::{dsl::sql, prelude::*, sql_types::BigInt, sqlite::SqliteConnection};
Expand All @@ -37,14 +38,16 @@ pub fn top_domains_db(
db: FtlDatabase,
from: u64,
until: u64,
params: Form<TopDomainParams>
params: Form<TopDomainParams>,
domain_audit: DomainAuditRepositoryGuard
) -> Reply {
reply_result(top_domains_db_impl(
&env,
&db as &SqliteConnection,
from,
until,
params.into_inner()
params.into_inner(),
&*domain_audit
))
}

Expand All @@ -54,7 +57,8 @@ fn top_domains_db_impl(
db: &SqliteConnection,
from: u64,
until: u64,
params: TopDomainParams
params: TopDomainParams,
domain_audit: &dyn DomainAuditRepository
) -> Result<TopDomainsReply, Error> {
// Resolve the parameters
let limit = params.limit.unwrap_or(10);
Expand Down Expand Up @@ -84,7 +88,7 @@ fn top_domains_db_impl(
}

// Find domains which should not be considered
let ignored_domains = get_ignored_domains(env, audit)?;
let ignored_domains = get_ignored_domains(env, audit, domain_audit)?;

// Fetch the top domains and map into the reply structure
let top_domains: Vec<TopDomainItemReply> =
Expand Down Expand Up @@ -114,7 +118,11 @@ fn top_domains_db_impl(

/// Get the list of domains to ignore. If the audit flag is true, audited
/// domains are ignored (only show unaudited domains).
fn get_ignored_domains(env: &Env, audit: bool) -> Result<Vec<String>, Error> {
fn get_ignored_domains(
env: &Env,
audit: bool,
domain_audit: &dyn DomainAuditRepository
) -> Result<Vec<String>, Error> {
// Ignore domains excluded via SetupVars
let mut ignored_domains = get_excluded_domains(env)?;

Expand All @@ -123,7 +131,7 @@ fn get_ignored_domains(env: &Env, audit: bool) -> Result<Vec<String>, Error> {

// If audit flag is true, only include unaudited domains
if audit {
ignored_domains.extend(env.read_file_lines(PiholeFile::AuditLog)?);
ignored_domains.extend(domain_audit.get_all()?);
}

Ok(ignored_domains)
Expand Down Expand Up @@ -185,6 +193,7 @@ mod test {
databases::ftl::connect_to_ftl_test_db,
env::PiholeFile,
routes::stats::top_domains::{TopDomainItemReply, TopDomainParams, TopDomainsReply},
services::domain_audit::DomainAuditRepositoryMock,
testing::TestEnvBuilder
};

Expand Down Expand Up @@ -248,8 +257,15 @@ mod test {
.file(PiholeFile::FtlConfig, "")
.build();
let params = TopDomainParams::default();
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&DomainAuditRepositoryMock::default()
)
.unwrap();

assert_eq!(actual, expected);
}
Expand Down Expand Up @@ -281,8 +297,15 @@ mod test {
limit: Some(2),
..TopDomainParams::default()
};
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&DomainAuditRepositoryMock::default()
)
.unwrap();

assert_eq!(actual, expected);
}
Expand All @@ -307,8 +330,15 @@ mod test {
blocked: Some(true),
..TopDomainParams::default()
};
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&DomainAuditRepositoryMock::default()
)
.unwrap();

assert_eq!(actual, expected);
}
Expand Down Expand Up @@ -342,8 +372,15 @@ mod test {
limit: Some(2),
..TopDomainParams::default()
};
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&DomainAuditRepositoryMock::default()
)
.unwrap();

assert_eq!(actual, expected);
}
Expand Down Expand Up @@ -371,15 +408,27 @@ mod test {
let env = TestEnvBuilder::new()
.file(PiholeFile::SetupVars, "")
.file(PiholeFile::FtlConfig, "")
.file(PiholeFile::AuditLog, "1.ubuntu.pool.ntp.org")
.build();
let params = TopDomainParams {
audit: Some(true),
limit: Some(2),
..TopDomainParams::default()
};
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let domain_audit = DomainAuditRepositoryMock::default();
domain_audit
.get_all
.given(())
.will_return(Ok(vec!["1.ubuntu.pool.ntp.org".to_owned()]));

let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&domain_audit
)
.unwrap();

assert_eq!(actual, expected);
}
Expand Down Expand Up @@ -409,15 +458,21 @@ mod test {
"API_EXCLUDE_DOMAINS=1.ubuntu.pool.ntp.org"
)
.file(PiholeFile::FtlConfig, "")
.file(PiholeFile::AuditLog, "")
.build();
let params = TopDomainParams {
audit: Some(true),
limit: Some(2),
..TopDomainParams::default()
};
let actual =
top_domains_db_impl(&env, &db, FROM_TIMESTAMP, UNTIL_TIMESTAMP, params).unwrap();
let actual = top_domains_db_impl(
&env,
&*db,
FROM_TIMESTAMP,
UNTIL_TIMESTAMP,
params,
&DomainAuditRepositoryMock::default()
)
.unwrap();

assert_eq!(actual, expected);
}
Expand Down
Loading