Skip to content

Commit

Permalink
#53 Add a report template management section
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Dec 6, 2016
1 parent 7c1e8d2 commit 02b67d0
Show file tree
Hide file tree
Showing 14 changed files with 266 additions and 20 deletions.
4 changes: 2 additions & 2 deletions thehive-cortex/app/connectors/cortex/CortexConnector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ class CortexConnector(

def configure() {
try {

registerController[CortextCtrl]
}
catch {
case t: Throwable log.error("Corte connector is disabled because its configuration is invalid", t)
}
}
}
}
10 changes: 8 additions & 2 deletions ui/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<!-- endbower -->
<link rel="stylesheet" href="bower_components/smalot-bootstrap-datetimepicker/css/bootstrap-datetimepicker.css" />
<link rel="stylesheet" href="bower_components/ng-tags-input/ng-tags-input.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="bower_components/codemirror/lib/codemirror.css">
<link rel="stylesheet" type="text/css" href="bower_components/codemirror/lib/codemirror.css">
<!-- endbuild -->

<!-- build:css(.tmp) styles/app.css -->
Expand Down Expand Up @@ -85,8 +85,12 @@
<script src="bower_components/bootstrap-markdown/js/bootstrap-markdown.js"></script>
<script src="bower_components/angular-markdown-editor-ghiscoding/src/angular-markdown-editor.js"></script>
<!-- endbower -->

<script type="text/javascript" src="bower_components/ace-builds/src-min-noconflict/ace.js"></script>
<script type="text/javascript" src="bower_components/angular-ui-ace/ui-ace.js"></script>

<script src="bower_components/codemirror/lib/codemirror.js"></script>
<script src="bower_components/codemirror/mode/htmlmixed/htmlmixed.js"></script>
<script src="bower_components/angular-ui-codemirror/ui-codemirror.js"></script>
<script src="bower_components/smalot-bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
<script src="bower_components/cryptojslib/components/core-min.js"></script>
Expand All @@ -105,9 +109,10 @@
<script src="scripts/controllers/SearchCtrl.js"></script>
<script src="scripts/controllers/SettingsCtrl.js"></script>
<script src="scripts/controllers/StatisticsCtrl.js"></script>
<script src="scripts/controllers/admin/AdminCaseTemplatesCtrl.js"></script>
<script src="scripts/controllers/admin/AdminMetricsCtrl.js"></script>
<script src="scripts/controllers/admin/AdminObservablesCtrl.js"></script>
<script src="scripts/controllers/admin/AdminTemplatesCtrl.js"></script>
<script src="scripts/controllers/admin/AdminReportTemplatesCtrl.js"></script>
<script src="scripts/controllers/admin/AdminUsersCtrl.js"></script>
<script src="scripts/controllers/case/CaseCloseModalCtrl.js"></script>
<script src="scripts/controllers/case/CaseCreationCtrl.js"></script>
Expand Down Expand Up @@ -185,6 +190,7 @@
<script src="scripts/services/MispSrv.js"></script>
<script src="scripts/services/ObservablesUISrv.js"></script>
<script src="scripts/services/PSearchSrv.js"></script>
<script src="scripts/services/ReportTemplateSrv.js"></script>
<script src="scripts/services/SearchSrv.js"></script>
<script src="scripts/services/StatSrv.js"></script>
<script src="scripts/services/StatisticSrv.js"></script>
Expand Down
18 changes: 13 additions & 5 deletions ui/app/scripts/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ angular.module('thehive', ['ngAnimate', 'ngMessages', 'ui.bootstrap', 'ui.router
'theHiveControllers', 'theHiveServices', 'theHiveFilters',
'theHiveDirectives', 'yaru22.jsonHuman', 'timer', 'angularMoment', 'ngCsv', 'ngTagsInput', 'btford.markdown',
'ngResource', 'ui.codemirror', 'ui-notification', 'angularjs-dropdown-multiselect', 'base64', 'angular-clipboard',
'LocalStorageModule', 'angular-markdown-editor', 'hc.marked', 'hljs'
'LocalStorageModule', 'angular-markdown-editor', 'hc.marked', 'hljs', 'ui.ace'
])
.config(function($resourceProvider) {
'use strict';
Expand Down Expand Up @@ -100,12 +100,19 @@ angular.module('thehive', ['ngAnimate', 'ngMessages', 'ui.bootstrap', 'ui.router
}
}
})
.state('app.administration.templates', {
url: '/templates',
templateUrl: 'views/partials/admin/templates.html',
controller: 'AdminTemplatesCtrl',
.state('app.administration.case-templates', {
url: '/case-templates',
templateUrl: 'views/partials/admin/case-templates.html',
controller: 'AdminCaseTemplatesCtrl',
title: 'Templates administration'
})
.state('app.administration.report-templates', {
url: '/report-templates',
templateUrl: 'views/partials/admin/report-templates.html',
controller: 'AdminReportTemplatesCtrl',
controllerAs: 'vm',
title: 'Report templates administration'
})
.state('app.administration.metrics', {
url: '/metrics',
templateUrl: 'views/partials/admin/metrics.html',
Expand All @@ -118,6 +125,7 @@ angular.module('thehive', ['ngAnimate', 'ngMessages', 'ui.bootstrap', 'ui.router
controller: 'AdminObservablesCtrl',
title: 'Observable administration'
})


.state('app.case', {
abstract: true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(function() {
'use strict';

angular.module('theHiveControllers').controller('AdminTemplatesCtrl',
angular.module('theHiveControllers').controller('AdminCaseTemplatesCtrl',
function($scope, $modal, TemplateSrv, AlertSrv, UtilsSrv, ListSrv, MetricsCacheSrv) {
$scope.task = '';
$scope.tags = [];
Expand Down Expand Up @@ -76,8 +76,8 @@
$scope.openTaskDialog = function(task, action) {
$modal.open({
scope: $scope,
templateUrl: 'views/partials/admin/templates.task.html',
controller: 'AdminTemplateTasksCtrl',
templateUrl: 'views/partials/admin/case-templates.task.html',
controller: 'AdminCaseTemplateTasksCtrl',
size: 'lg',
resolve: {
action: function() {
Expand Down Expand Up @@ -108,8 +108,8 @@
$scope.deleteTemplate = function() {
$modal.open({
scope: $scope,
templateUrl: 'views/partials/admin/templates.delete.html',
controller: 'AdminTemplateDeleteCtrl',
templateUrl: 'views/partials/admin/case-templates.delete.html',
controller: 'AdminCaseTemplateDeleteCtrl',
size: ''
});
};
Expand Down Expand Up @@ -146,7 +146,7 @@
};

})
.controller('AdminTemplateTasksCtrl', function($scope, $modalInstance, action, task) {
.controller('AdminCaseTemplateTasksCtrl', function($scope, $modalInstance, action, task) {
$scope.task = task || {};
$scope.action = action;

Expand All @@ -162,7 +162,7 @@
$modalInstance.dismiss();
};
})
.controller('AdminTemplateDeleteCtrl', function($scope, $modalInstance, TemplateSrv) {
.controller('AdminCaseTemplateDeleteCtrl', function($scope, $modalInstance, TemplateSrv) {
$scope.cancel = function() {
$modalInstance.dismiss();
};
Expand Down
94 changes: 94 additions & 0 deletions ui/app/scripts/controllers/admin/AdminReportTemplatesCtrl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
(function () {
'use strict';

angular.module('theHiveControllers')
.controller('AdminReportTemplatesCtrl', AdminReportTemplatesCtrl)
.controller('AdminReportTemplateDialogCtrl', AdminReportTemplateDialogCtrl);


function AdminReportTemplatesCtrl($q, $modal, AnalyzerSrv, ReportTemplateSrv) {
var self = this;

this.templates = [];
this.analyzers = [];


this.load = function() {
$q.all([
ReportTemplateSrv.list(),
AnalyzerSrv.query({
range: 'all'
}).$promise
]).then(function (response) {
self.templates = response[0].data;
self.analyzers = response[1];

var map = _.indexBy(self.analyzers, 'id');

return $q.resolve(map);
}).then(function (analyzersMap) {
_.each(self.templates, function (tpl) {
_.each(tpl.analyzers, function (analyzerId) {
analyzersMap[analyzerId][tpl.flavor + 'Report'] = tpl;
});
});

console.log(self.analyzers);
});
};

this.showTemplate = function (reportTemplate, analyzer) {
var modalInstance = $modal.open({
//scope: $scope,
templateUrl: 'views/partials/admin/report-template-dialog.html',
controller: 'AdminReportTemplateDialogCtrl',
controllerAs: 'vm',
size: 'max',
resolve: {
reportTemplate: function () {
return reportTemplate;
},
analyzer: function () {
return analyzer;
}
}
});

modalInstance.result.then(function() {
self.load();
});
};

this.load();
};

function AdminReportTemplateDialogCtrl($modalInstance, reportTemplate, ReportTemplateSrv, analyzer) {
this.reportTemplate = reportTemplate;
this.analyzer = analyzer;
this.reportTypes = ['short', 'long'];
this.editorOptions = {
useWrapMode: true,
showGutter: true,
theme: 'default',
mode: 'xml'
};

this.formData = _.pick(reportTemplate, 'id', 'flavor', 'content');
this.formData.analyzers = [this.analyzer.id];

this.cancel = function () {
$modalInstance.dismiss();
};

this.saveTemplate = function() {
ReportTemplateSrv.save(this.formData)
.then(function() {
$modalInstance.close();
}, function(response) {
AlertSrv.error('AdminReportTemplateDialogCtrl', response.data, response.status);
});
};


}
})();
4 changes: 2 additions & 2 deletions ui/app/scripts/services/AnalyzerSrv.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
.factory('AnalyzerSrv', function($resource) {
return $resource('/api/analyzer/:analyzerId', {}, {
query: {
method: 'POST',
url: '/api/analyzer/_search',
method: 'GET',
url: '/api/connector/cortex/analyzer',
isArray: true
},
update: {
Expand Down
44 changes: 44 additions & 0 deletions ui/app/scripts/services/ReportTemplateSrv.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
(function() {
'use strict';
angular.module('theHiveServices')
.factory('ReportTemplateSrv', function($resource, $http) {
var baseUrl = '/api/report/template';
var resource = $resource(baseUrl, {}, {
query: {
method: 'POST',
url: baseUrl + '/_search',
isArray: true
},
update: {
method: 'PATCH'
},
create: {
method: 'POST'
},
save: {
method: 'PUT'
}
});

return {
get: function() {
return resource;
},

list: function() {
return $http.post(baseUrl + '/_search', {
range: 'all'
});
},

save: function(tpl) {
if(tpl.id) {
return $http.put(baseUrl + '/' + tpl.id, tpl, {});
} else {
return $http.post(baseUrl, tpl, {});
}
}
}

});
})();
8 changes: 7 additions & 1 deletion ui/app/styles/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ body {
padding-left: 6px;
padding-right: 6px;
}

.modal-max {
width: 90%;
}
.clickable {
cursor: pointer;
}
Expand Down Expand Up @@ -350,6 +352,10 @@ tr.task-row .tast-status {
text-align: center;
}

td.vmiddle {
vertical-align: middle !important;
}

@-moz-keyframes spin {
from {
-moz-transform: rotate(0deg);
Expand Down
8 changes: 7 additions & 1 deletion ui/app/views/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,17 @@
</li>
<li class="divider"></li>
<li>
<a ui-sref="app.administration.templates">
<a ui-sref="app.administration.case-templates">
<i class="fa fa-file-text"></i>
<span class="hpad5">Case templates</span>
</a>
</li>
<li>
<a ui-sref="app.administration.report-templates">
<i class="fa fa-file-text"></i>
<span class="hpad5">Report templates</span>
</a>
</li>
<li>
<a ui-sref="app.administration.metrics">
<i class="fa fa-tachometer"></i>
Expand Down
File renamed without changes.
39 changes: 39 additions & 0 deletions ui/app/views/partials/admin/report-template-dialog.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<form class="form-horizontal" name="tplForm" ng-submit="vm.saveTemplate()" novalidate>
<div class="modal-header bg-primary">
<h3 class="modal-title">{{vm.reportTemplate.id ? 'Update' : 'Add'}} report template</h3>
</div>
<div class="modal-body">
<div class="form-group">
<label class="col-sm-2 control-label">
Report Type
<i class="fa fa-asterisk text-danger"></i>
</label>
<div class="col-sm-4">
<select class="form-control" ng-model="vm.formData.flavor" ng-options="t for t in vm.reportTypes" required>
<option value="">-- choose report type --</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Analyzer</label>
<div class="col-sm-10">
<p class="form-control-static">{{vm.formData.analyzers[0]}}</p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
Template
<i class="fa fa-asterisk text-danger"></i>
</label>
<div class="col-sm-10">
<div ui-ace="vm.editorOptions"
ng-model="vm.formData.content" style="height: 400px;"></div>
</div>
</div>

</div>
<div class="modal-footer text-left">
<button class="btn btn-default" ng-click="vm.cancel()" type="button">Cancel</button>
<button class="btn btn-primary pull-right" ng-disabled="taskForm.$invalid" type="submit">Save template</button>
</div>
</form>
Loading

0 comments on commit 02b67d0

Please sign in to comment.