Skip to content

Commit

Permalink
Merge branch 'master' into install.sh
Browse files Browse the repository at this point in the history
  • Loading branch information
ameshkov committed Oct 7, 2020
2 parents 825062a + fb7ca94 commit 81a5b63
Show file tree
Hide file tree
Showing 20 changed files with 220 additions and 272 deletions.
2 changes: 1 addition & 1 deletion client/src/__locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@
"rate_limit_desc": "The number of requests per second that a single client is allowed to make (setting it to 0 means unlimited)",
"blocking_ipv4_desc": "IP address to be returned for a blocked A request",
"blocking_ipv6_desc": "IP address to be returned for a blocked AAAA request",
"blocking_mode_default": "Default: Respond with REFUSED when blocked by Adblock-style rule; respond with the IP address specified in the rule when blocked by /etc/hosts-style rule",
"blocking_mode_default": "Default: Respond with zero IP address (0.0.0.0 for A; :: for AAAA) when blocked by Adblock-style rule; respond with the IP address specified in the rule when blocked by /etc/hosts-style rule",
"blocking_mode_refused": "REFUSED: Respond with REFUSED code",
"blocking_mode_nxdomain": "NXDOMAIN: Respond with NXDOMAIN code",
"blocking_mode_null_ip": "Null IP: Respond with zero IP address (0.0.0.0 for A; :: for AAAA)",
Expand Down
229 changes: 99 additions & 130 deletions client/src/components/Filters/Check/Info.js
Original file line number Diff line number Diff line change
@@ -1,155 +1,124 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { withTranslation } from 'react-i18next';
import React from 'react';
import { useTranslation } from 'react-i18next';
import classNames from 'classnames';

import i18next from 'i18next';
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import {
checkFiltered,
checkRewrite,
checkRewriteHosts,
checkBlackList,
checkNotFilteredNotFound,
checkWhiteList,
checkSafeSearch,
checkSafeBrowsing,
checkParental, getFilterName,
checkParental,
getFilterName,
} from '../../../helpers/helpers';
import { FILTERED } from '../../../helpers/constants';

const getTitle = (reason, filterName, t, onlyFiltered) => {
if (checkNotFilteredNotFound(reason)) {
return t('check_not_found');
}

if (checkRewrite(reason)) {
return t('rewrite_applied');
}

if (checkRewriteHosts(reason)) {
return t('rewrite_hosts_applied');
}

if (checkBlackList(reason)) {
return filterName;
}
import { BLOCK_ACTIONS, FILTERED, FILTERED_STATUS } from '../../../helpers/constants';
import { toggleBlocking } from '../../../actions';

const renderBlockingButton = (isFiltered, domain) => {
const processingRules = useSelector((state) => state.filtering.processingRules);
const dispatch = useDispatch();
const { t } = useTranslation();

const buttonType = isFiltered ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;

const onClick = async () => {
await dispatch(toggleBlocking(buttonType, domain));
};

const buttonClass = classNames('mt-3 button-action button-action--main button-action--active button-action--small', {
'button-action--unblock': isFiltered,
});

return <button type="button"
className={buttonClass}
onClick={onClick}
disabled={processingRules}
>
{t(buttonType)}
</button>;
};

if (checkWhiteList(reason)) {
return (
<div>
{filterName}
</div>
);
}
const getTitle = (reason) => {
const { t } = useTranslation();

if (onlyFiltered) {
const filterKey = reason.replace(FILTERED, '');
const filters = useSelector((state) => state.filtering.filters, shallowEqual);
const whitelistFilters = useSelector((state) => state.filtering.whitelistFilters, shallowEqual);
const filter_id = useSelector((state) => state.filtering.check.filter_id);

return (
<div>
{t('query_log_filtered', { filter: filterKey })}
</div>
);
}

return (
<Fragment>
<div>
{t('check_reason', { reason })}
</div>
<div>
{filterName}
</div>
</Fragment>
const filterName = getFilterName(
filters,
whitelistFilters,
filter_id,
'filtered_custom_rules',
(filter) => (filter?.name ? t('query_log_filtered', { filter: filter.name }) : ''),
);
};

const getColor = (reason) => {
if (checkFiltered(reason)) {
return 'red';
} if (checkRewrite(reason) || checkRewriteHosts(reason)) {
return 'blue';
} if (checkWhiteList(reason)) {
return 'green';
const getReasonFiltered = (reason) => {
const filterKey = reason.replace(FILTERED, '');
return i18next.t('query_log_filtered', { filter: filterKey });
};

const REASON_TO_TITLE_MAP = {
[FILTERED_STATUS.NOT_FILTERED_NOT_FOUND]: t('check_not_found'),
[FILTERED_STATUS.REWRITE]: t('rewrite_applied'),
[FILTERED_STATUS.REWRITE_HOSTS]: t('rewrite_hosts_applied'),
[FILTERED_STATUS.FILTERED_BLACK_LIST]: filterName,
[FILTERED_STATUS.NOT_FILTERED_WHITE_LIST]: filterName,
[FILTERED_STATUS.FILTERED_SAFE_SEARCH]: getReasonFiltered(reason),
[FILTERED_STATUS.FILTERED_SAFE_BROWSING]: getReasonFiltered(reason),
[FILTERED_STATUS.FILTERED_PARENTAL]: getReasonFiltered(reason),
};

if (Object.prototype.hasOwnProperty.call(REASON_TO_TITLE_MAP, reason)) {
return REASON_TO_TITLE_MAP[reason];
}

return '';
return <>
<div>{t('check_reason', { reason })}</div>
<div>{filterName}</div>
</>;
};

const Info = ({
filters,
whitelistFilters,
hostname,
reason,
filter_id,
rule,
service_name,
cname,
ip_addrs,
t,
}) => {
const filterName = getFilterName(filters,
whitelistFilters,
filter_id,
'filtered_custom_rules',
(filter) => (filter?.name ? t('query_log_filtered', { filter: filter.name }) : ''));
const Info = () => {
const {
hostname,
reason,
rule,
service_name,
cname,
ip_addrs,
} = useSelector((state) => state.filtering.check, shallowEqual);
const { t } = useTranslation();

const title = getTitle(reason);

const className = classNames('card mb-0 p-3', {
'logs__row--red': checkFiltered(reason),
'logs__row--blue': checkRewrite(reason) || checkRewriteHosts(reason),
'logs__row--green': checkWhiteList(reason),
});

const onlyFiltered = checkSafeSearch(reason)
|| checkSafeBrowsing(reason)
|| checkParental(reason);
const title = getTitle(reason, filterName, t, onlyFiltered);
const color = getColor(reason);

if (onlyFiltered) {
return (
<div className={`card mb-0 p-3 ${color}`}>
<div>
<strong>{hostname}</strong>
</div>

<div>{title}</div>
</div>
);
}

return (
<div className={`card mb-0 p-3 ${color}`}>
<div>
<strong>{hostname}</strong>
</div>

<div>{title}</div>

{rule && (
<div>{t('check_rule', { rule })}</div>
)}

{service_name && (
<div>{t('check_service', { service: service_name })}</div>
)}

{cname && (
<div>{t('check_cname', { cname })}</div>
)}

{ip_addrs && (
<div>
{t('check_ip', { ip: ip_addrs.join(', ') })}
</div>
)}
</div>
);
};

Info.propTypes = {
filters: PropTypes.array.isRequired,
whitelistFilters: PropTypes.array.isRequired,
hostname: PropTypes.string.isRequired,
reason: PropTypes.string.isRequired,
filter_id: PropTypes.number,
rule: PropTypes.string,
service_name: PropTypes.string,
cname: PropTypes.string,
ip_addrs: PropTypes.array,
t: PropTypes.func.isRequired,
const isFiltered = checkFiltered(reason);

return <div className={className}>
<div><strong>{hostname}</strong></div>
<div>{title}</div>
{!onlyFiltered
&& <>
{rule && <div>{t('check_rule', { rule })}</div>}
{service_name && <div>{t('check_service', { service: service_name })}</div>}
{cname && <div>{t('check_cname', { cname })}</div>}
{ip_addrs && <div>{t('check_ip', { ip: ip_addrs.join(', ') })}</div>}
{renderBlockingButton(isFiltered, hostname)}
</>}
</div>;
};

export default withTranslation()(Info);
export default Info;
Loading

0 comments on commit 81a5b63

Please sign in to comment.