diff --git a/AGHTechDoc.md b/AGHTechDoc.md
index 7ab530c6..b3d52e1e 100644
--- a/AGHTechDoc.md
+++ b/AGHTechDoc.md
@@ -1471,7 +1471,8 @@ Strict matching can be enabled by enclosing the value in double quotes: e.g. `"a
`response_status`:
* all
* filtered - all kinds of filtering
-* blocked - blocked or blocked service
+* blocked - blocked or blocked services
+* blocked_services - blocked services
* blocked_safebrowsing - blocked by safebrowsing
* blocked_parental - blocked by parental control
* whitelisted - whitelisted
diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json
index 340c5bcb..b6235a66 100644
--- a/client/src/__locales/en.json
+++ b/client/src/__locales/en.json
@@ -528,6 +528,7 @@
"check_reason": "Reason: {{reason}}",
"check_rule": "Rule: {{rule}}",
"check_service": "Service name: {{service}}",
+ "service_name": "Service name",
"check_not_found": "Not found in your filter lists",
"client_confirm_block": "Are you sure you want to block the client \"{{ip}}\"?",
"client_confirm_unblock": "Are you sure you want to unblock the client \"{{ip}}\"?",
diff --git a/client/src/components/Logs/Cells/DomainCell.js b/client/src/components/Logs/Cells/DomainCell.js
index 47d14846..4333089c 100644
--- a/client/src/components/Logs/Cells/DomainCell.js
+++ b/client/src/components/Logs/Cells/DomainCell.js
@@ -14,7 +14,6 @@ import IconTooltip from './IconTooltip';
const DomainCell = ({
answer_dnssec,
- service_name,
client_proto,
domain,
time,
@@ -50,10 +49,6 @@ const DomainCell = ({
protocol,
};
- if (service_name) {
- requestDetailsObj.check_service = service_name;
- }
-
const sourceData = getSourceData(tracker);
const knownTrackerDataObj = {
@@ -103,7 +98,7 @@ const DomainCell = ({
xlinkHref='privacy' contentItemClass='key-colon' renderContent={renderContent}
place='bottom' />
-
{service_name || domain}
+
{domain}
{details && isDetailed
&&
{details}
}
@@ -117,7 +112,6 @@ DomainCell.propTypes = {
domain: propTypes.string.isRequired,
time: propTypes.string.isRequired,
type: propTypes.string.isRequired,
- service_name: propTypes.string,
tracker: propTypes.object,
};
diff --git a/client/src/components/Logs/Cells/ResponseCell.js b/client/src/components/Logs/Cells/ResponseCell.js
index b152987f..816f35a3 100644
--- a/client/src/components/Logs/Cells/ResponseCell.js
+++ b/client/src/components/Logs/Cells/ResponseCell.js
@@ -3,7 +3,11 @@ import { shallowEqual, useSelector } from 'react-redux';
import classNames from 'classnames';
import React from 'react';
import propTypes from 'prop-types';
-import { formatElapsedMs, getFilterName } from '../../../helpers/helpers';
+import {
+ formatElapsedMs,
+ getFilterName,
+ getServiceName,
+} from '../../../helpers/helpers';
import { FILTERED_STATUS, FILTERED_STATUS_TO_META_MAP } from '../../../helpers/constants';
import IconTooltip from './IconTooltip';
@@ -16,6 +20,7 @@ const ResponseCell = ({
upstream,
rule,
filterId,
+ service_name,
}) => {
const { t } = useTranslation();
const filters = useSelector((state) => state.filtering.filters, shallowEqual);
@@ -52,7 +57,7 @@ const ResponseCell = ({
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_code: status,
- filter,
+ ...(service_name ? { service_name: getServiceName(service_name) } : { filter }),
rule_label: rule,
response_table_header: renderResponses(response),
original_response: renderResponses(originalResponse),
@@ -64,8 +69,22 @@ const ResponseCell = ({
...COMMON_CONTENT,
filter: '',
});
- const detailedInfo = isBlocked ? filter : formattedElapsedMs;
+ const getDetailedInfo = (reason) => {
+ switch (reason) {
+ case FILTERED_STATUS.FILTERED_BLOCKED_SERVICE:
+ if (!service_name) {
+ return formattedElapsedMs;
+ }
+ return getServiceName(service_name);
+ case FILTERED_STATUS.FILTERED_BLACK_LIST:
+ return filter;
+ default:
+ return formattedElapsedMs;
+ }
+ };
+
+ const detailedInfo = getDetailedInfo(reason);
return
{requestStatus}
: requestStatus,
+ ...(FILTERED_STATUS.FILTERED_BLOCKED_SERVICE && service_name
+ && { service_name: getServiceName(service_name) }),
domain,
type_table_header: type,
protocol,
@@ -219,6 +223,7 @@ Row.propTypes = {
rule: propTypes.string,
originalResponse: propTypes.array,
status: propTypes.string.isRequired,
+ service_name: propTypes.string,
}).isRequired,
isSmallScreen: propTypes.bool.isRequired,
setDetailedDataCurrent: propTypes.func.isRequired,
diff --git a/client/src/helpers/constants.js b/client/src/helpers/constants.js
index 91ec294e..08fd1529 100644
--- a/client/src/helpers/constants.js
+++ b/client/src/helpers/constants.js
@@ -280,6 +280,11 @@ export const SERVICES = [
},
];
+export const SERVICES_ID_NAME_MAP = SERVICES.reduce((acc, { id, name }) => {
+ acc[id] = name;
+ return acc;
+}, {});
+
export const ENCRYPTION_SOURCE = {
PATH: 'path',
CONTENT: 'content',
@@ -351,6 +356,10 @@ export const RESPONSE_FILTER = {
QUERY: 'blocked',
LABEL: 'show_blocked_responses',
},
+ BLOCKED_SERVICES: {
+ QUERY: 'blocked_services',
+ LABEL: 'blocked_services',
+ },
BLOCKED_THREATS: {
QUERY: 'blocked_safebrowsing',
LABEL: 'blocked_threats',
@@ -397,7 +406,7 @@ export const FILTERED_STATUS_TO_META_MAP = {
COLOR: QUERY_STATUS_COLORS.WHITE,
},
[FILTERED_STATUS.FILTERED_BLOCKED_SERVICE]: {
- LABEL: RESPONSE_FILTER.BLOCKED.LABEL,
+ LABEL: 'blocked_service',
COLOR: QUERY_STATUS_COLORS.RED,
},
[FILTERED_STATUS.FILTERED_SAFE_SEARCH]: {
diff --git a/client/src/helpers/helpers.js b/client/src/helpers/helpers.js
index 8cdb5384..b0bbea5a 100644
--- a/client/src/helpers/helpers.js
+++ b/client/src/helpers/helpers.js
@@ -26,6 +26,7 @@ import {
FILTERED,
FILTERED_STATUS,
IP_MATCH_LIST_STATUS,
+ SERVICES_ID_NAME_MAP,
STANDARD_DNS_PORT,
STANDARD_HTTPS_PORT,
STANDARD_WEB_PORT,
@@ -944,3 +945,9 @@ export const getBlockingClientName = (clients, ip) => {
*/
export const filterOutComments = (lines) => lines
.filter((line) => !line.startsWith(COMMENT_LINE_DEFAULT_TOKEN));
+
+/**
+ * @param {string} serviceId
+ * @returns {string}
+ */
+export const getServiceName = (serviceId) => SERVICES_ID_NAME_MAP[serviceId] || serviceId;
diff --git a/client/webpack.dev.js b/client/webpack.dev.js
index a4971e88..afcc3506 100644
--- a/client/webpack.dev.js
+++ b/client/webpack.dev.js
@@ -38,6 +38,7 @@ const getDevServerConfig = (proxyUrl = BASE_URL) => {
return {
hot: true,
+ open: true,
host: devServerHost,
port: devServerPort,
proxy: {
@@ -61,5 +62,5 @@ module.exports = merge(common, {
},
],
},
- devServer: process.env.WEBPACK_DEV_SERVER ? getDevServerConfig(BASE_URL) : undefined,
+ ...(process.env.WEBPACK_DEV_SERVER ? { devServer: getDevServerConfig(BASE_URL) } : undefined),
});
diff --git a/querylog/search_criteria.go b/querylog/search_criteria.go
index 382cd9bc..a9d38fb1 100644
--- a/querylog/search_criteria.go
+++ b/querylog/search_criteria.go
@@ -17,7 +17,8 @@ const (
filteringStatusAll = "all"
filteringStatusFiltered = "filtered" // all kinds of filtering
- filteringStatusBlocked = "blocked" // blocked or blocked service
+ filteringStatusBlocked = "blocked" // blocked or blocked services
+ filteringStatusBlockedService = "blocked_services" // blocked
filteringStatusBlockedSafebrowsing = "blocked_safebrowsing" // blocked by safebrowsing
filteringStatusBlockedParental = "blocked_parental" // blocked by parental control
filteringStatusWhitelisted = "whitelisted" // whitelisted
@@ -29,7 +30,7 @@ const (
// filteringStatusValues -- array with all possible filteringStatus values
var filteringStatusValues = []string{
filteringStatusAll, filteringStatusFiltered, filteringStatusBlocked,
- filteringStatusBlockedSafebrowsing, filteringStatusBlockedParental,
+ filteringStatusBlockedService, filteringStatusBlockedSafebrowsing, filteringStatusBlockedParental,
filteringStatusWhitelisted, filteringStatusRewritten, filteringStatusSafeSearch,
filteringStatusProcessed,
}
@@ -113,6 +114,8 @@ func (c *searchCriteria) match(entry *logEntry) bool {
return res.IsFiltered &&
(res.Reason == dnsfilter.FilteredBlackList ||
res.Reason == dnsfilter.FilteredBlockedService)
+ case filteringStatusBlockedService:
+ return res.IsFiltered && res.Reason == dnsfilter.FilteredBlockedService
case filteringStatusBlockedParental:
return res.IsFiltered && res.Reason == dnsfilter.FilteredParental
case filteringStatusBlockedSafebrowsing:
@@ -120,8 +123,8 @@ func (c *searchCriteria) match(entry *logEntry) bool {
case filteringStatusWhitelisted:
return res.Reason == dnsfilter.NotFilteredWhiteList
case filteringStatusRewritten:
- return (res.Reason == dnsfilter.ReasonRewrite ||
- res.Reason == dnsfilter.RewriteEtcHosts)
+ return res.Reason == dnsfilter.ReasonRewrite ||
+ res.Reason == dnsfilter.RewriteEtcHosts
case filteringStatusSafeSearch:
return res.IsFiltered && res.Reason == dnsfilter.FilteredSafeSearch