badguardhome/client/src/actions/index.js

493 lines
18 KiB
JavaScript
Raw Normal View History

2018-08-30 14:25:33 +00:00
import { createAction } from 'redux-actions';
2018-11-06 02:51:00 +00:00
import { t } from 'i18next';
2019-05-17 13:57:38 +00:00
import axios from 'axios';
2018-08-30 14:25:33 +00:00
2019-09-17 14:37:26 +00:00
import { normalizeTextarea, sortClients, isVersionGreater } from '../helpers/helpers';
2019-05-16 14:24:30 +00:00
import { SETTINGS_NAMES, CHECK_TIMEOUT } from '../helpers/constants';
import { getTlsStatus } from './encryption';
2019-09-05 09:12:58 +00:00
import apiClient from '../api/Api';
2018-08-30 14:25:33 +00:00
2018-09-14 12:37:35 +00:00
export const addErrorToast = createAction('ADD_ERROR_TOAST');
export const addSuccessToast = createAction('ADD_SUCCESS_TOAST');
2019-05-17 15:17:17 +00:00
export const addNoticeToast = createAction('ADD_NOTICE_TOAST');
2018-09-14 12:37:35 +00:00
export const removeToast = createAction('REMOVE_TOAST');
2018-08-30 14:25:33 +00:00
export const toggleSettingStatus = createAction('SETTING_STATUS_TOGGLE');
export const showSettingsFailure = createAction('SETTINGS_FAILURE_SHOW');
export const toggleSetting = (settingKey, status) => async (dispatch) => {
2018-09-14 13:41:34 +00:00
let successMessage = '';
try {
switch (settingKey) {
2019-01-22 14:17:33 +00:00
case SETTINGS_NAMES.safebrowsing:
2018-09-14 13:41:34 +00:00
if (status) {
2018-11-09 06:51:28 +00:00
successMessage = 'disabled_safe_browsing_toast';
2018-09-14 13:41:34 +00:00
await apiClient.disableSafebrowsing();
} else {
2018-11-09 06:51:28 +00:00
successMessage = 'enabled_safe_browsing_toast';
2018-09-14 13:41:34 +00:00
await apiClient.enableSafebrowsing();
}
dispatch(toggleSettingStatus({ settingKey }));
break;
2019-01-22 14:17:33 +00:00
case SETTINGS_NAMES.parental:
2018-09-14 13:41:34 +00:00
if (status) {
2018-11-09 06:51:28 +00:00
successMessage = 'disabled_parental_toast';
2018-09-14 13:41:34 +00:00
await apiClient.disableParentalControl();
} else {
2018-11-09 06:51:28 +00:00
successMessage = 'enabled_parental_toast';
2018-09-14 13:41:34 +00:00
await apiClient.enableParentalControl();
}
dispatch(toggleSettingStatus({ settingKey }));
break;
2019-01-22 14:17:33 +00:00
case SETTINGS_NAMES.safesearch:
2018-09-14 13:41:34 +00:00
if (status) {
2018-11-09 06:51:28 +00:00
successMessage = 'disabled_safe_search_toast';
2018-09-14 13:41:34 +00:00
await apiClient.disableSafesearch();
} else {
2018-11-09 06:51:28 +00:00
successMessage = 'enabled_save_search_toast';
2018-09-14 13:41:34 +00:00
await apiClient.enableSafesearch();
}
dispatch(toggleSettingStatus({ settingKey }));
break;
default:
break;
}
dispatch(addSuccessToast(successMessage));
} catch (error) {
dispatch(addErrorToast({ error }));
2018-08-30 14:25:33 +00:00
}
};
export const initSettingsRequest = createAction('SETTINGS_INIT_REQUEST');
export const initSettingsFailure = createAction('SETTINGS_INIT_FAILURE');
export const initSettingsSuccess = createAction('SETTINGS_INIT_SUCCESS');
export const initSettings = settingsList => async (dispatch) => {
dispatch(initSettingsRequest());
try {
const safebrowsingStatus = await apiClient.getSafebrowsingStatus();
const parentalStatus = await apiClient.getParentalStatus();
const safesearchStatus = await apiClient.getSafesearchStatus();
const {
safebrowsing,
parental,
safesearch,
} = settingsList;
const newSettingsList = {
safebrowsing: { ...safebrowsing, enabled: safebrowsingStatus.enabled },
parental: { ...parental, enabled: parentalStatus.enabled },
safesearch: { ...safesearch, enabled: safesearchStatus.enabled },
};
dispatch(initSettingsSuccess({ settingsList: newSettingsList }));
} catch (error) {
2018-09-14 12:37:35 +00:00
dispatch(addErrorToast({ error }));
2018-08-30 14:25:33 +00:00
dispatch(initSettingsFailure());
}
};
export const toggleProtectionRequest = createAction('TOGGLE_PROTECTION_REQUEST');
export const toggleProtectionFailure = createAction('TOGGLE_PROTECTION_FAILURE');
export const toggleProtectionSuccess = createAction('TOGGLE_PROTECTION_SUCCESS');
export const toggleProtection = status => async (dispatch) => {
dispatch(toggleProtectionRequest());
let successMessage = '';
try {
if (status) {
2018-11-09 06:51:28 +00:00
successMessage = 'disabled_protection';
await apiClient.disableGlobalProtection();
} else {
2018-11-09 06:51:28 +00:00
successMessage = 'enabled_protection';
await apiClient.enableGlobalProtection();
}
dispatch(addSuccessToast(successMessage));
dispatch(toggleProtectionSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(toggleProtectionFailure());
}
};
export const getVersionRequest = createAction('GET_VERSION_REQUEST');
export const getVersionFailure = createAction('GET_VERSION_FAILURE');
export const getVersionSuccess = createAction('GET_VERSION_SUCCESS');
export const getVersion = (recheck = false) => async (dispatch, getState) => {
dispatch(getVersionRequest());
try {
const data = await apiClient.getGlobalVersion({ recheck_now: recheck });
dispatch(getVersionSuccess(data));
2019-06-25 14:56:50 +00:00
if (recheck) {
const { dnsVersion } = getState().dashboard;
const currentVersion = dnsVersion === 'undefined' ? 0 : dnsVersion;
2019-09-17 14:37:26 +00:00
if (data && isVersionGreater(currentVersion, data.new_version)) {
dispatch(addSuccessToast('updates_checked'));
} else {
dispatch(addSuccessToast('updates_version_equal'));
}
2019-06-25 14:56:50 +00:00
}
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getVersionFailure());
}
};
2019-05-16 14:24:30 +00:00
export const getUpdateRequest = createAction('GET_UPDATE_REQUEST');
export const getUpdateFailure = createAction('GET_UPDATE_FAILURE');
export const getUpdateSuccess = createAction('GET_UPDATE_SUCCESS');
export const getUpdate = () => async (dispatch, getState) => {
const { dnsVersion } = getState().dashboard;
2019-05-16 14:24:30 +00:00
dispatch(getUpdateRequest());
try {
await apiClient.getUpdate();
2019-05-17 13:57:38 +00:00
const checkUpdate = async (attempts) => {
let count = attempts || 1;
let timeout;
if (count > 60) {
2019-05-17 15:17:17 +00:00
dispatch(addNoticeToast({ error: 'update_failed' }));
2019-05-17 13:57:38 +00:00
dispatch(getUpdateFailure());
return false;
2019-05-16 14:24:30 +00:00
}
2019-05-17 13:57:38 +00:00
const rmTimeout = t => t && clearTimeout(t);
const setRecursiveTimeout = (time, ...args) => setTimeout(
checkUpdate,
time,
...args,
);
axios.get('control/status')
.then((response) => {
rmTimeout(timeout);
if (response && response.status === 200) {
const responseVersion = response.data && response.data.version;
if (dnsVersion !== responseVersion) {
dispatch(getUpdateSuccess());
window.location.reload(true);
}
2019-05-17 13:57:38 +00:00
}
timeout = setRecursiveTimeout(CHECK_TIMEOUT, count += 1);
})
.catch(() => {
rmTimeout(timeout);
timeout = setRecursiveTimeout(CHECK_TIMEOUT, count += 1);
});
return false;
};
checkUpdate();
2019-05-16 14:24:30 +00:00
} catch (error) {
2019-05-17 15:17:17 +00:00
dispatch(addNoticeToast({ error: 'update_failed' }));
2019-05-16 14:24:30 +00:00
dispatch(getUpdateFailure());
}
};
export const getClientsRequest = createAction('GET_CLIENTS_REQUEST');
export const getClientsFailure = createAction('GET_CLIENTS_FAILURE');
export const getClientsSuccess = createAction('GET_CLIENTS_SUCCESS');
export const getClients = () => async (dispatch) => {
dispatch(getClientsRequest());
try {
2019-05-23 11:14:22 +00:00
const data = await apiClient.getClients();
const sortedClients = data.clients && sortClients(data.clients);
const sortedAutoClients = data.auto_clients && sortClients(data.auto_clients);
dispatch(getClientsSuccess({
clients: sortedClients || [],
autoClients: sortedAutoClients || [],
}));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getClientsFailure());
}
};
2018-08-30 14:25:33 +00:00
export const dnsStatusRequest = createAction('DNS_STATUS_REQUEST');
export const dnsStatusFailure = createAction('DNS_STATUS_FAILURE');
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
export const getDnsStatus = () => async (dispatch) => {
dispatch(dnsStatusRequest());
try {
const dnsStatus = await apiClient.getGlobalStatus();
dispatch(dnsStatusSuccess(dnsStatus));
dispatch(getVersion());
dispatch(getTlsStatus());
2018-08-30 14:25:33 +00:00
} catch (error) {
2018-09-14 12:37:35 +00:00
dispatch(addErrorToast({ error }));
dispatch(dnsStatusFailure());
}
};
export const getDnsSettingsRequest = createAction('GET_DNS_SETTINGS_REQUEST');
export const getDnsSettingsFailure = createAction('GET_DNS_SETTINGS_FAILURE');
export const getDnsSettingsSuccess = createAction('GET_DNS_SETTINGS_SUCCESS');
export const getDnsSettings = () => async (dispatch) => {
dispatch(getDnsSettingsRequest());
try {
const dnsStatus = await apiClient.getGlobalStatus();
dispatch(getDnsSettingsSuccess(dnsStatus));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getDnsSettingsFailure());
2018-08-30 14:25:33 +00:00
}
};
export const enableDnsRequest = createAction('ENABLE_DNS_REQUEST');
export const enableDnsFailure = createAction('ENABLE_DNS_FAILURE');
export const enableDnsSuccess = createAction('ENABLE_DNS_SUCCESS');
export const enableDns = () => async (dispatch) => {
dispatch(enableDnsRequest());
try {
await apiClient.startGlobalFiltering();
dispatch(enableDnsSuccess());
} catch (error) {
2018-09-14 12:37:35 +00:00
dispatch(addErrorToast({ error }));
2018-08-30 14:25:33 +00:00
dispatch(enableDnsFailure());
}
};
export const disableDnsRequest = createAction('DISABLE_DNS_REQUEST');
export const disableDnsFailure = createAction('DISABLE_DNS_FAILURE');
export const disableDnsSuccess = createAction('DISABLE_DNS_SUCCESS');
export const disableDns = () => async (dispatch) => {
dispatch(disableDnsRequest());
try {
await apiClient.stopGlobalFiltering();
dispatch(disableDnsSuccess());
} catch (error) {
2018-09-14 12:37:35 +00:00
dispatch(disableDnsFailure(error));
dispatch(addErrorToast({ error }));
2018-08-30 14:25:33 +00:00
}
};
export const handleUpstreamChange = createAction('HANDLE_UPSTREAM_CHANGE');
export const setUpstreamRequest = createAction('SET_UPSTREAM_REQUEST');
export const setUpstreamFailure = createAction('SET_UPSTREAM_FAILURE');
export const setUpstreamSuccess = createAction('SET_UPSTREAM_SUCCESS');
2019-03-06 11:45:21 +00:00
export const setUpstream = config => async (dispatch) => {
2018-08-30 14:25:33 +00:00
dispatch(setUpstreamRequest());
try {
2019-03-06 11:45:21 +00:00
const values = { ...config };
values.bootstrap_dns = (
values.bootstrap_dns && normalizeTextarea(values.bootstrap_dns)
) || [];
values.upstream_dns = (
values.upstream_dns && normalizeTextarea(values.upstream_dns)
) || [];
2019-03-06 11:45:21 +00:00
await apiClient.setUpstream(values);
2018-11-09 06:51:28 +00:00
dispatch(addSuccessToast('updated_upstream_dns_toast'));
dispatch(setUpstreamSuccess(config));
2018-08-30 14:25:33 +00:00
} catch (error) {
2018-09-14 12:37:35 +00:00
dispatch(addErrorToast({ error }));
2018-08-30 14:25:33 +00:00
dispatch(setUpstreamFailure());
}
};
export const testUpstreamRequest = createAction('TEST_UPSTREAM_REQUEST');
export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE');
export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS');
export const testUpstream = config => async (dispatch) => {
dispatch(testUpstreamRequest());
try {
const values = { ...config };
values.bootstrap_dns = (
values.bootstrap_dns && normalizeTextarea(values.bootstrap_dns)
) || [];
values.upstream_dns = (
values.upstream_dns && normalizeTextarea(values.upstream_dns)
) || [];
const upstreamResponse = await apiClient.testUpstream(values);
2018-09-21 15:50:06 +00:00
const testMessages = Object.keys(upstreamResponse).map((key) => {
const message = upstreamResponse[key];
if (message !== 'OK') {
2018-11-09 06:51:28 +00:00
dispatch(addErrorToast({ error: t('dns_test_not_ok_toast', { key }) }));
}
2018-09-21 15:50:06 +00:00
return message;
});
2018-09-21 15:57:27 +00:00
if (testMessages.every(message => message === 'OK')) {
2018-11-09 06:51:28 +00:00
dispatch(addSuccessToast('dns_test_ok_toast'));
}
2018-09-21 15:50:06 +00:00
dispatch(testUpstreamSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(testUpstreamFailure());
}
};
2018-11-22 14:56:57 +00:00
export const changeLanguageRequest = createAction('CHANGE_LANGUAGE_REQUEST');
export const changeLanguageFailure = createAction('CHANGE_LANGUAGE_FAILURE');
export const changeLanguageSuccess = createAction('CHANGE_LANGUAGE_SUCCESS');
export const changeLanguage = lang => async (dispatch) => {
dispatch(changeLanguageRequest());
try {
await apiClient.changeLanguage(lang);
dispatch(changeLanguageSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(changeLanguageFailure());
}
};
export const getLanguageRequest = createAction('GET_LANGUAGE_REQUEST');
export const getLanguageFailure = createAction('GET_LANGUAGE_FAILURE');
export const getLanguageSuccess = createAction('GET_LANGUAGE_SUCCESS');
export const getLanguage = () => async (dispatch) => {
dispatch(getLanguageRequest());
try {
const language = await apiClient.getCurrentLanguage();
dispatch(getLanguageSuccess(language));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getLanguageFailure());
}
};
export const getDhcpStatusRequest = createAction('GET_DHCP_STATUS_REQUEST');
export const getDhcpStatusSuccess = createAction('GET_DHCP_STATUS_SUCCESS');
export const getDhcpStatusFailure = createAction('GET_DHCP_STATUS_FAILURE');
export const getDhcpStatus = () => async (dispatch) => {
dispatch(getDhcpStatusRequest());
try {
const status = await apiClient.getDhcpStatus();
dispatch(getDhcpStatusSuccess(status));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getDhcpStatusFailure());
}
};
2018-12-24 08:48:23 +00:00
export const getDhcpInterfacesRequest = createAction('GET_DHCP_INTERFACES_REQUEST');
export const getDhcpInterfacesSuccess = createAction('GET_DHCP_INTERFACES_SUCCESS');
export const getDhcpInterfacesFailure = createAction('GET_DHCP_INTERFACES_FAILURE');
export const getDhcpInterfaces = () => async (dispatch) => {
dispatch(getDhcpInterfacesRequest());
try {
const interfaces = await apiClient.getDhcpInterfaces();
dispatch(getDhcpInterfacesSuccess(interfaces));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getDhcpInterfacesFailure());
}
};
export const findActiveDhcpRequest = createAction('FIND_ACTIVE_DHCP_REQUEST');
export const findActiveDhcpSuccess = createAction('FIND_ACTIVE_DHCP_SUCCESS');
export const findActiveDhcpFailure = createAction('FIND_ACTIVE_DHCP_FAILURE');
export const findActiveDhcp = name => async (dispatch) => {
dispatch(findActiveDhcpRequest());
try {
const activeDhcp = await apiClient.findActiveDhcp(name);
dispatch(findActiveDhcpSuccess(activeDhcp));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(findActiveDhcpFailure());
}
};
export const setDhcpConfigRequest = createAction('SET_DHCP_CONFIG_REQUEST');
export const setDhcpConfigSuccess = createAction('SET_DHCP_CONFIG_SUCCESS');
export const setDhcpConfigFailure = createAction('SET_DHCP_CONFIG_FAILURE');
2019-01-23 14:22:04 +00:00
export const setDhcpConfig = values => async (dispatch, getState) => {
const { config } = getState().dhcp;
const updatedConfig = { ...config, ...values };
dispatch(setDhcpConfigRequest());
2019-05-28 12:07:46 +00:00
dispatch(findActiveDhcp(values.interface_name));
try {
await apiClient.setDhcpConfig(updatedConfig);
dispatch(setDhcpConfigSuccess(updatedConfig));
dispatch(addSuccessToast('dhcp_config_saved'));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setDhcpConfigFailure());
}
};
export const toggleDhcpRequest = createAction('TOGGLE_DHCP_REQUEST');
export const toggleDhcpFailure = createAction('TOGGLE_DHCP_FAILURE');
export const toggleDhcpSuccess = createAction('TOGGLE_DHCP_SUCCESS');
2019-05-28 12:07:46 +00:00
export const toggleDhcp = values => async (dispatch) => {
dispatch(toggleDhcpRequest());
2019-05-28 12:07:46 +00:00
let config = { ...values, enabled: false };
let successMessage = 'disabled_dhcp';
2019-05-28 12:07:46 +00:00
if (!values.enabled) {
config = { ...values, enabled: true };
successMessage = 'enabled_dhcp';
dispatch(findActiveDhcp(values.interface_name));
}
try {
await apiClient.setDhcpConfig(config);
dispatch(toggleDhcpSuccess());
dispatch(addSuccessToast(successMessage));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(toggleDhcpFailure());
}
};
export const toggleLeaseModal = createAction('TOGGLE_LEASE_MODAL');
export const addStaticLeaseRequest = createAction('ADD_STATIC_LEASE_REQUEST');
export const addStaticLeaseFailure = createAction('ADD_STATIC_LEASE_FAILURE');
export const addStaticLeaseSuccess = createAction('ADD_STATIC_LEASE_SUCCESS');
export const addStaticLease = config => async (dispatch) => {
dispatch(addStaticLeaseRequest());
try {
const name = config.hostname || config.ip;
2019-05-28 12:07:46 +00:00
await apiClient.addStaticLease(config);
dispatch(addStaticLeaseSuccess(config));
dispatch(addSuccessToast(t('dhcp_lease_added', { key: name })));
2019-05-28 12:07:46 +00:00
dispatch(toggleLeaseModal());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(addStaticLeaseFailure());
}
};
export const removeStaticLeaseRequest = createAction('REMOVE_STATIC_LEASE_REQUEST');
export const removeStaticLeaseFailure = createAction('REMOVE_STATIC_LEASE_FAILURE');
export const removeStaticLeaseSuccess = createAction('REMOVE_STATIC_LEASE_SUCCESS');
export const removeStaticLease = config => async (dispatch) => {
dispatch(removeStaticLeaseRequest());
try {
const name = config.hostname || config.ip;
2019-05-28 12:07:46 +00:00
await apiClient.removeStaticLease(config);
dispatch(removeStaticLeaseSuccess(config));
dispatch(addSuccessToast(t('dhcp_lease_deleted', { key: name })));
2019-05-28 12:07:46 +00:00
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(removeStaticLeaseFailure());
}
};