From 5f59125c927f77879ab85b5ba5cd0883e6729c1f Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 25 Dec 2023 06:10:01 +0100 Subject: [PATCH] Translate anti-/gravity list IDs to negative numbers so they can be distinguish from domains rather easily. Users are free to foil this method when they force negative IDs into the database but they will never be automatically created Signed-off-by: DL6ER --- src/database/gravity-db.c | 4 ++-- src/database/query-table.c | 4 ++-- src/dnsmasq_interface.c | 10 ++++++++-- test/gravity.db.sql | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/database/gravity-db.c b/src/database/gravity-db.c index 784bdea341..e09b3e0309 100644 --- a/src/database/gravity-db.c +++ b/src/database/gravity-db.c @@ -857,7 +857,7 @@ bool gravityDB_prepare_client_statements(clientsData *client) // Prepare gravity statement log_debug(DEBUG_DATABASE, "gravityDB_open(): Preparing vw_gravity statement for client %s", clientip); - querystr = get_client_querystr("vw_gravity", "domain", getstr(client->groupspos)); + querystr = get_client_querystr("vw_gravity", "adlist_id", getstr(client->groupspos)); rc = sqlite3_prepare_v3(gravity_db, querystr, -1, SQLITE_PREPARE_PERSISTENT, &stmt, NULL); if( rc != SQLITE_OK ) { @@ -870,7 +870,7 @@ bool gravityDB_prepare_client_statements(clientsData *client) // Prepare antigravity statement log_debug(DEBUG_DATABASE, "gravityDB_open(): Preparing vw_antigravity statement for client %s", clientip); - querystr = get_client_querystr("vw_antigravity", "domain", getstr(client->groupspos)); + querystr = get_client_querystr("vw_antigravity", "adlist_id", getstr(client->groupspos)); rc = sqlite3_prepare_v3(gravity_db, querystr, -1, SQLITE_PREPARE_PERSISTENT, &stmt, NULL); if( rc != SQLITE_OK ) { diff --git a/src/database/query-table.c b/src/database/query-table.c index ed33ca13e4..411cb0933a 100644 --- a/src/database/query-table.c +++ b/src/database/query-table.c @@ -1508,7 +1508,7 @@ bool queries_to_database(void) break; } } - else if(cache != NULL && cache->list_id > -1) + else if(cache != NULL && cache->list_id != -1) { // Restore regex ID if applicable sqlite3_bind_int(query_stmt, 9, ADDINFO_LIST_ID); @@ -1548,7 +1548,7 @@ bool queries_to_database(void) sqlite3_bind_int(query_stmt, 13, query->dnssec); // LIST_ID - if(cache != NULL && cache->list_id > -1) + if(cache != NULL && cache->list_id != -1) sqlite3_bind_int(query_stmt, 14, cache->list_id); else // Not applicable, setting NULL diff --git a/src/dnsmasq_interface.c b/src/dnsmasq_interface.c index 745972f731..106e56907f 100644 --- a/src/dnsmasq_interface.c +++ b/src/dnsmasq_interface.c @@ -1146,7 +1146,12 @@ static bool check_domain_blocked(const char *domain, const int clientID, log_debug(DEBUG_QUERIES, "Allowing query due to antigravity match (list ID %i)", list_id); // Store ID of the matching antigravity list - dns_cache->list_id = list_id; + // positive values (incl. 0) are used for domainlists + // -1 means "not set" + // -2 is gravity list 0 + // -3 is gravity list 1 + // ... + dns_cache->list_id = -1 * (list_id + 2); return false; } @@ -1165,7 +1170,8 @@ static bool check_domain_blocked(const char *domain, const int clientID, log_debug(DEBUG_QUERIES, "Blocking query due to gravity match (list ID %i)", list_id); // Store ID of the matching gravity list - dns_cache->list_id = list_id; + // see remarks above for the list_id values + dns_cache->list_id = -1 * (list_id + 2); // We block this domain return true; diff --git a/test/gravity.db.sql b/test/gravity.db.sql index 403b4497b4..7e7e372d53 100644 --- a/test/gravity.db.sql +++ b/test/gravity.db.sql @@ -136,14 +136,14 @@ CREATE VIEW vw_regex_blacklist AS SELECT domain, domainlist.id AS id, domainlist AND domainlist.type = 3 ORDER BY domainlist.id; -CREATE VIEW vw_gravity AS SELECT domain, adlist_by_group.group_id AS group_id +CREATE VIEW vw_gravity AS SELECT domain, adlist.id AS adlist_id, adlist_by_group.group_id AS group_id FROM gravity LEFT JOIN adlist_by_group ON adlist_by_group.adlist_id = gravity.adlist_id LEFT JOIN adlist ON adlist.id = gravity.adlist_id LEFT JOIN "group" ON "group".id = adlist_by_group.group_id WHERE adlist.enabled = 1 AND (adlist_by_group.group_id IS NULL OR "group".enabled = 1) AND adlist.type = 0; -CREATE VIEW vw_antigravity AS SELECT domain, adlist_by_group.group_id AS group_id +CREATE VIEW vw_antigravity AS SELECT domain, adlist.id AS adlist_id, adlist_by_group.group_id AS group_id FROM antigravity LEFT JOIN adlist_by_group ON adlist_by_group.adlist_id = antigravity.adlist_id LEFT JOIN adlist ON adlist.id = antigravity.adlist_id