// Require config
require('plugins/wazuh/config/config.js');
// Require CSS
require('plugins/wazuh/less/main.less');
// Require routes
var routes = require('ui/routes');
// Set up tabs
require('ui/chrome').setNavBackground('#222222').setTabs([
{ id: 'manager', title: 'Manager' },
{ id: 'agents', title: 'Agents' },
{ id: 'ruleset', title: 'Ruleset' },
{ id: 'osseclog', title: 'Ossec.log' },
{ id: 'FIM', title: 'FIM' },
{ id: 'rootcheck', title: 'Rootcheck' },
{ id: 'settings', title: 'Settings' }
]);
// Set up logo
require('ui/chrome')
.setBrand({
logo: 'url(/plugins/wazuh/icon.png) center no-repeat'
})
// Set up Wazuh app
var app = require('ui/modules').get('app/wazuh', ['angularUtils.directives.dirPagination', 'angular.filter', 'AxelSoft', 'chart.js', 'ngAlertify', '720kb.tooltips'])
.service('sharedProperties', function () {
var _property = '';
return {
getProperty: function () {
return _property;
},
setProperty: function (value) {
_property = value;
}
};
})
.service('testConnection', function ($q, $http) {
return {
test: function () {
var defered = $q.defer();
var promise = defered.promise;
$http.get("/api/wazuh-api/test")
.success(function (data) {
if (data.error) {
defered.reject(data);
} else {
defered.resolve(data);
}
})
.error(function (data) {
defered.reject(data);
})
return promise;
}
};
})
.service('apiReq', function ($q, $http) {
return {
request: function (method, path, body) {
var defered = $q.defer();
var promise = defered.promise;
if (!method || !path || !body) {
defered.reject({'error': -1, 'message': 'Missing parameters'});
return promise;
}
var requestData = {
'method': method,
'path': path,
'body': body
}
var requestHeaders = {
headers: {
"Content-Type": 'application/json'
}
}
$http.post('/api/wazuh-api/request', requestData, requestHeaders)
.success(function (data) {
if (data.error) {
defered.reject(data);
} else {
defered.resolve(data);
}
})
.error(function (data) {
if (data.error) {
defered.reject(data);
} else {
defered.reject({'error': -2, 'message': 'Error doing a request to Kibana API.'});
}
});
return promise;
}
};
})
.factory('DataFactory', function (apiReq, $q) {
var dataObj = {};
var _instances = [];
dataObj.initialize = function (method, path, body, pageSize, offset) {
var defered = $q.defer();
var promise = defered.promise;
if(!method || !path || !body) {
defered.reject(prepError({'error': -1, 'message': 'Missing parameters'}));
return promise;
}
var instance = (Math.random().toString(36).substring(3));
while ((_instances[instance]) && (_instances[instance].length > 0)) {
instance = (Math.random().toString(36).substring(3));
}
var limit;
if ((method === 'get') && (pageSize)) {
apiReq.request('get', path+'?offset=0&limit=1', body)
.then(function (data) {
limit = data.data.totalItems;
_instances[instance] = {
'method': method, 'path': path, 'body': body, 'pageSize': pageSize,
'offset': offset, 'limit': limit, 'pagination': true
};
defered.resolve(instance);
}, function (data) {
defered.reject(prepError(data));
});
} else {
_instances[instance] = { 'method': method, 'path': path, 'body': body, 'pageSize': pageSize,
'offset': offset, 'pagination': false };
defered.resolve(instance);
}
return promise;
};
dataObj.hasNext = function (instanceId) {
return ((_instances[instanceId]['offset'] + _instances[instanceId]['pageSize']) < _instances[instanceId]['limit']);
}
dataObj.next = function (instanceId) {
var defered = $q.defer();
var promise = defered.promise;
if (!instanceId) {
defered.reject(prepError({ 'error': -1, 'message': 'Missing parameters' }));
return promise;
}
if (!_instances[instanceId]['pagination']) {
defered.reject(prepError({'error': -10, 'message': 'Pagination disabled for this object'}));
return promise;
}
_instances[instanceId]['offset'] += _instances[instanceId]['pageSize'];
if ((_instances[instanceId]['offset'] < 0) ||
(_instances[instanceId]['offset'] >= _instances[instanceId]['limit'])) {
_instances[instanceId]['offset'] -= _instances[instanceId]['pageSize']
defered.reject(prepError({ 'error': -11, 'message': 'Pagination out of bounds' }));
return promise;
}
dataObj.get(instanceId)
.then( function (data) {
defered.resolve(data);
}, function (data) {
defered.reject(data);
});
return promise;
};
dataObj.hasPrev = function (instanceId) {
return ((_instances[instanceId]['offset'] - _instances[instanceId]['pageSize']) >= 0);
}
dataObj.prev = function (instanceId) {
var defered = $q.defer();
var promise = defered.promise;
if (!instanceId) {
defered.reject(prepError({ 'error': -1, 'message': 'Missing parameters' }));
return promise;
}
if (!_instances[instanceId]['pagination']) {
defered.reject(prepError({'error': -10, 'message': 'Pagination disabled for this object'}));
return promise;
}
_instances[instanceId]['offset'] -= _instances[instanceId]['pageSize'];
if ((_instances[instanceId]['offset'] < 0) ||
(_instances[instanceId]['offset'] >= _instances[instanceId]['limit'])) {
_instances[instanceId]['offset'] += _instances[instanceId]['pageSize']
defered.reject(prepError({'error': -11, 'message': 'Pagination out of bounds'}));
return promise;
}
dataObj.get(instanceId)
.then( function (data) {
defered.resolve(data);
}, function (data) {
defered.reject(data);
});
return promise;
}
dataObj.get = function (instanceId, newBody) {
var defered = $q.defer();
var promise = defered.promise;
if (!instanceId) {
defered.reject(prepError({ 'error': -1, 'message': 'Missing parameters' }));
return promise;
}
if (newBody) {
_instances[instanceId]['body'] = newBody;
_instances[instanceId]['offset'] = 0;
}
var preparedBody = _instances[instanceId]['body'];
if (_instances[instanceId]['pagination']) {
preparedBody['offset'] = _instances[instanceId]['offset'];
preparedBody['limit'] = _instances[instanceId]['pageSize'];
}
apiReq.request(_instances[instanceId]['method'], _instances[instanceId]['path'], preparedBody)
.then(function (data) {
if ((_instances[instanceId]['pagination']) && (data.data.totalItems != _instances[instanceId]['limit'])) {
_instances[instanceId]['limit'] = data.data.totalItems;
}
defered.resolve(data);
}, function (data) {
defered.reject(prepError(data));
});
return promise;
};
dataObj.clean = function (instanceId) {
_instances[instanceId].length = 0;
};
dataObj.cleanAll = function () {
_instances = 0;
};
dataObj.getAndClean = function (method, path, body) {
var defered = $q.defer();
var promise = defered.promise;
dataObj.initialize(method, path, body)
.then(function (_instanceId) {
dataObj.get(_instanceId)
.then (function (data) {
defered.resolve(data);
dataObj.clean(_instanceId);
}, function (error) {
defered.reject(error);
dataObj.clean(_instanceId);
})
}, function (error) {
defered.reject(error);
})
return promise;
};
var prepError = function (err) {
if(err.error < 0) {
err['html'] = "Unexpected error located on AngularJS. Error: "+err.message+" (code "+ err.error +").";
err.message = "Unexpected error located on AngularJS. Error: "+err.message+" (code "+ err.error +").";
} else if (err.error === 1) {
err['html'] = "Error getting credentials for Wazuh API. Please, check credentials at settings tab.";
err.message = "Error getting credentials for Wazuh API. Please, check credentials at settings tab.";
} else if (err.error === 2) {
err['html'] = "Error getting credentials for Wazuh API. Could not connect with Elasticsearch.";
err.message = "Error getting credentials for Wazuh API. Could not connect with Elasticsearch.";
} else if (err.error < 5) {
err['html'] = "Unexpected error located on Kibana server. Error: "+err.message+" (code "+ err.error +").";
err.message = "Unexpected error located on Kibana server. Error: "+err.message+" (code "+ err.error +").";
} else if (err.error === 5) {
err['html'] = "Could not connect with Wazuh API. Error: "+err.errorMessage+". Please, check the URL at settings tab.";
err.message = "Could not connect with Wazuh API. Error: "+err.errorMessage+". Please, check the URL at settings tab.";
} else if (err.error === 6) {
err['html'] = "Wazuh API returned an error message. Error: "+err.errorData.message+"";
err.message = "Wazuh API returned an error message. Error: "+err.errorData.message;
} else {
err['html'] = "Unexpected error. Please, report this to Wazuh Team.";
err.message = "Unexpected error. Please, report this to Wazuh Team.";
}
return err;
};
return dataObj;
})
.service('tabProvider', function() {
var _tabs = [];
return {
register: function (pageId) {
if (!_tabs[pageId]) {
_tabs[pageId] = [];
}
},
setTab: function (pageId, tab, tabset) {
if (!tabset) {
tabset = 0;
}
if (!_tabs[pageId]) {
return false;
}
_tabs[pageId][tabset] = tab;
return true;
},
isSetTab: function (pageId, tab, tabset) {
if (!tabset) {
tabset = 0;
}
if (!_tabs[pageId]) {
return false;
}
if (!_tabs[pageId][tabset]) {
return (tab == 1);
}
return (_tabs[pageId][tabset] == tab);
},
clean: function (pageId) {
if(_tabs[pageId]) {
_tabs[pageId].length = 0;
}
}
};
})
.config(['$compileProvider', function ($compileProvider) {
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|data|blob):/);
}]);
//Installation wizard
var settingsWizard = function ($location, testConnection) {
testConnection.test()
.then(function () { }, function () {
$location.path('/settings');
});
}
routes.enable();
// Set up routes and views
routes
.when('/agents', {
template: require('plugins/wazuh/templates/agents.html'),
resolve: {
"check": settingsWizard
}
})
.when('/manager', {
template: require('plugins/wazuh/templates/manager.html'),
resolve: {
"check": settingsWizard
}
})
.when('/settings', {
template: require('plugins/wazuh/templates/settings.html')
})
.when('/FIM', {
template: require('plugins/wazuh/templates/FIM.html'),
resolve: {
"check": settingsWizard
}
})
.when('/rootcheck', {
template: require('plugins/wazuh/templates/rootcheck.html'),
resolve: {
"check": settingsWizard
}
})
.when('/ruleset', {
template: require('plugins/wazuh/templates/ruleset.html'),
resolve: {
"check": settingsWizard
}
})
.when('/osseclog', {
template: require('plugins/wazuh/templates/osseclog.html'),
resolve: {
"check": settingsWizard
}
})
.otherwise({
redirectTo: '/settings'
});
// Require controllers
require('plugins/wazuh/controllers/agents.js');
require('plugins/wazuh/controllers/settings.js');
require('plugins/wazuh/controllers/manager.js');
require('plugins/wazuh/controllers/FIM.js');
require('plugins/wazuh/controllers/rootcheck.js');
require('plugins/wazuh/controllers/ruleset.js');
require('plugins/wazuh/controllers/osseclog.js');
//External angularjs libs
require('plugins/wazuh/../node_modules/angular-utils-pagination/dirPagination.js');
require('plugins/wazuh/../node_modules/angular-filter/dist/angular-filter.min.js');
require('plugins/wazuh/utils/customSelect/bootstrap.min.js');
require('plugins/wazuh/utils/customSelect/customSelect.js');
require('plugins/wazuh/utils/customSelect/style.css');
require('plugins/wazuh/../node_modules/angular-chart.js/dist/angular-chart.js');
require('plugins/wazuh/../node_modules/angular-chart.js/dist/angular-chart.css');
require('plugins/wazuh/../node_modules/alertify.js/dist/css/alertify.css');
require('plugins/wazuh/../node_modules/alertify.js/dist/js/alertify.js');
require('plugins/wazuh/../node_modules/alertify.js/dist/js/ngAlertify.js');
require('plugins/wazuh/../node_modules/angular-tooltips/dist/angular-tooltips.min.css');
require('plugins/wazuh/../node_modules/angular-tooltips/dist/angular-tooltips.min.js');