blob: 6fa4b007ede1d8bbfb52b3603be5595840bf8de0 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import FauxtonAPI from "../../core/api";
import ActionTypes from "./actiontypes";
import * as CorsAPI from "./api";
const fetchAndLoadCORSOptions = (url, node) => (dispatch) => {
const fetchCors = CorsAPI.fetchCORSConfig(url);
const fetchHttp = CorsAPI.fetchHttpdConfig(url);
FauxtonAPI.Promise.join(fetchCors, fetchHttp, (corsConfig, httpdConfig) => {
const loadOptions = loadCORSOptions({
origins: corsConfig.origins,
corsEnabled: httpdConfig.enable_cors === 'true',
node: node
});
dispatch(loadOptions);
}).catch((error) => {
FauxtonAPI.addNotification({
msg: 'Could not load CORS settings. ' + errorReason(error),
type: 'error'
});
});
};
const showLoadingBars = () => {
return {
type: ActionTypes.CORS_SET_IS_LOADING,
isLoading: true
};
};
const hideLoadingBars = () => {
return {
type: ActionTypes.CORS_SET_IS_LOADING,
isLoading: false
};
};
const loadCORSOptions = (options) => {
return {
type: ActionTypes.EDIT_CORS,
options: options,
isLoading: false
};
};
const showDomainDeleteConfirmation = (domain) => {
return {
type: ActionTypes.CORS_SHOW_DELETE_DOMAIN_MODAL,
domainToDelete: domain
};
};
const hideDomainDeleteConfirmation = () => {
return {
type: ActionTypes.CORS_HIDE_DELETE_DOMAIN_MODAL
};
};
const saveCors = (url, options) => (dispatch) => {
const promises = [];
promises.push(CorsAPI.updateEnableCorsToHttpd(url, options.node, options.corsEnabled));
if (options.corsEnabled) {
promises.push(CorsAPI.updateCorsOrigins(url, options.node, sanitizeOrigins(options.origins)));
promises.push(CorsAPI.updateCorsCredentials(url, options.node));
promises.push(CorsAPI.updateCorsHeaders(url, options.node));
promises.push(CorsAPI.updateCorsMethods(url, options.node));
}
return FauxtonAPI.Promise.all(promises).then(() => {
FauxtonAPI.addNotification({
msg: 'CORS settings updated.',
type: 'success',
clear: true
});
dispatch(loadCORSOptions(options));
}).catch((error) => {
FauxtonAPI.addNotification({
msg: 'Error! Could not save your CORS settings. Please try again. ' + errorReason(error),
type: 'error',
clear: true
});
dispatch(hideDomainDeleteConfirmation());
dispatch(hideLoadingBars());
});
};
const errorReason = (error) => {
return 'Reason: ' + ((error && error.message) || 'n/a');
};
const sanitizeOrigins = (origins) => {
if (_.isEmpty(origins)) {
return '';
}
return origins.join(',');
};
const Actions = {
fetchAndLoadCORSOptions,
showLoadingBars,
hideLoadingBars,
showDomainDeleteConfirmation,
hideDomainDeleteConfirmation,
loadCORSOptions,
sanitizeOrigins,
saveCors,
overrideFetchAndLoadCORSOptions: (newFn) => {
Actions.fetchAndLoadCORSOptions = newFn;
},
overrideSaveCors: (newFn) => {
Actions.saveCors = newFn;
}
};
export default Actions;