Skip to content

Commit

Permalink
#131 Open job reports on a modal dialog from observables list
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Jun 27, 2017
1 parent 104145e commit 1e858e4
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 58 deletions.
38 changes: 38 additions & 0 deletions ui/app/scripts/controllers/case/CaseObservablesCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,44 @@
itemId: artifact.id
});
};

$scope.showReport = function(observable, analyzerId) {
CortexSrv.getJobs($scope.caseId, observable.id, analyzerId, 1)
.then(function(response) {
return CortexSrv.getJob(response.data[0].id)
})
.then(function(response){
var job = response.data;
var report = {
job: job,
template: job.analyzerId,
content: job.report,
status: job.status,
startDate: job.startDate,
endDate: job.endDate
};

var modalInstance = $uibModal.open({
templateUrl: 'views/partials/observables/list/job-report-dialog.html',
controller: function($uibModalInstance, report, observable) {
this.report = report;
this.observable = observable;
this.close = function() {
$uibModalInstance.dismiss();
}
},
controllerAs: '$vm',
size: 'max',
resolve: {
report: report,
observable: observable
}
});
})
.catch(function(err) {
NotificationSrv.error('Unable to fetch the analysis report');
})
}
}
);

Expand Down
9 changes: 7 additions & 2 deletions ui/app/scripts/directives/mini-report-list.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
restrict: 'E',
templateUrl: 'views/directives/mini-report-list.html',
scope: {
reports: '='
observable: '=',
reports: '=',
onItemClicked: '&'
},
link: function(scope) {
scope.taxonomies = [];
Expand All @@ -16,7 +18,10 @@
var taxonomies = [];

_.each(keys, function(key) {
taxonomies = taxonomies.concat(data[key].taxonomies || []);
taxonomies = taxonomies.concat(_.map(data[key].taxonomies || [], function(item) {
item.id = key;
return item;
}));
});

scope.taxonomies = taxonomies;
Expand Down
125 changes: 72 additions & 53 deletions ui/app/scripts/services/CortexSrv.js
Original file line number Diff line number Diff line change
@@ -1,67 +1,86 @@
(function () {
(function() {
'use strict';
angular.module('theHiveServices')
.factory('CortexSrv', function ($q, $http, $rootScope, $uibModal, StatSrv, StreamSrv, AnalyzerSrv, PSearchSrv) {
angular.module('theHiveServices').factory('CortexSrv', function($q, $http, $rootScope, $uibModal, StatSrv, StreamSrv, AnalyzerSrv, PSearchSrv) {

var baseUrl = './api/connector/cortex';
var baseUrl = './api/connector/cortex';

var factory = {
list: function (scope, caseId, observableId, callback) {
return PSearchSrv(undefined, 'connector/cortex/job', {
scope: scope,
sort: '-startDate',
loadAll: false,
pageSize: 200,
onUpdate: callback || angular.noop,
streamObjectType: 'case_artifact_job',
filter: {
_parent: {
_type: 'case_artifact',
_query: {
_id: observableId
}
var factory = {
list: function(scope, caseId, observableId, callback) {
return PSearchSrv(undefined, 'connector/cortex/job', {
scope: scope,
sort: '-startDate',
loadAll: false,
pageSize: 200,
onUpdate: callback || angular.noop,
streamObjectType: 'case_artifact_job',
filter: {
_parent: {
_type: 'case_artifact',
_query: {
_id: observableId
}
}
});
},
}
});
},

getJobs: function(caseId, observableId, analyzerId, limit) {
return $http.post(baseUrl + '/job/_search', {
sort: '-startDate',
range: '0-' + (limit || 10),
query: {
_and: [
{
_parent: {
_type: 'case_artifact',
_query: {
_id: observableId
}
}
}, {
analyzerId: analyzerId
}
]
}
})
},

getJob: function (jobId) {
return $http.get(baseUrl + '/job/' + jobId);
},
getJob: function(jobId) {
return $http.get(baseUrl + '/job/' + jobId);
},

createJob: function (job) {
return $http.post(baseUrl + '/job', job);
},
createJob: function(job) {
return $http.post(baseUrl + '/job', job);
},

getServers: function (analyzerIds) {
return AnalyzerSrv.serversFor(analyzerIds)
.then(function (servers) {
if (servers.length === 1) {
return $q.resolve(servers[0]);
} else {
return factory.promptForInstance(servers);
}
});
},
getServers: function(analyzerIds) {
return AnalyzerSrv.serversFor(analyzerIds).then(function(servers) {
if (servers.length === 1) {
return $q.resolve(servers[0]);
} else {
return factory.promptForInstance(servers);
}
});
},

promptForInstance: function (servers) {
var modalInstance = $uibModal.open({
templateUrl: 'views/partials/cortex/choose-instance-dialog.html',
controller: 'CortexInstanceDialogCtrl',
controllerAs: 'vm',
size: '',
resolve: {
servers: function () {
return servers;
}
promptForInstance: function(servers) {
var modalInstance = $uibModal.open({
templateUrl: 'views/partials/cortex/choose-instance-dialog.html',
controller: 'CortexInstanceDialogCtrl',
controllerAs: 'vm',
size: '',
resolve: {
servers: function() {
return servers;
}
});
}
});

return modalInstance.result;
}
};
return modalInstance.result;
}
};

return factory;
});
return factory;
});

})();
5 changes: 3 additions & 2 deletions ui/app/views/directives/mini-report-list.html
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
<div class="tags-list flexwrap mt-xxs" ng-if="taxonomies.length > 0">
<span class="mr-xxxs text-muted"><i class="fa fa-cog"></i></span>
<span class="label mb-xxxs mr-xxxs"
<span class="label mb-xxxs mr-xxxs clickable"
ng-repeat="taxonomy in taxonomies"
ng-class="{'info': 'label-info',
'safe': 'label-success',
'suspicious': 'label-warning',
'malicious': 'label-danger'
}[taxonomy.level]">
}[taxonomy.level]"
ng-click="onItemClicked({observable: observable, analyzerId: taxonomy.id})">
{{taxonomy.namespace}}:{{taxonomy.predicate}}{{taxonomy.value ? '='+taxonomy.value: ''}}
</span>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ <h4>List of observables ({{artifacts.total || 0}} of {{artifactStats.count}})</h
</span>
</div>

<mini-report-list reports="artifact.reports"></mini-report-list>
<mini-report-list observable="artifact" reports="artifact.reports" on-item-clicked="showReport(observable, analyzerId)"></mini-report-list>
</td>
<td>
<a href ng-click="addFilterValue('startDate', artifact.startDate)"><span uib-tooltip="{{artifact.startDate | showDate}}" tooltip-popup-delay="500" tooltip-placement="bottom">{{artifact.startDate | shortDate}}</span></a>
Expand Down
15 changes: 15 additions & 0 deletions ui/app/views/partials/observables/list/job-report-dialog.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<div class="modal-header bg-primary">
<h3 class="modal-title">Report of #{{$vm.report.job.analyzerId}} analysis</h3>
</div>
<div class="modal-body">
<report artifact="$vm.observable"
content="$vm.report.content.full || $vm.report.content"
report-type="long"
name="$vm.report.template"
status="$vm.report.status"
success="$vm.report.content.success"
></report>
</div>
<div class="modal-footer text-left">
<button class="btn btn-primary pull-right" type="button" ng-click="$vm.close()">Close</button>
</div>

0 comments on commit 1e858e4

Please sign in to comment.