diff --git a/ui/app/scripts/controllers/case/CaseObservablesCtrl.js b/ui/app/scripts/controllers/case/CaseObservablesCtrl.js index 75e014a53d..42fb8c063a 100644 --- a/ui/app/scripts/controllers/case/CaseObservablesCtrl.js +++ b/ui/app/scripts/controllers/case/CaseObservablesCtrl.js @@ -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'); + }) + } } ); diff --git a/ui/app/scripts/directives/mini-report-list.js b/ui/app/scripts/directives/mini-report-list.js index c40ce28399..845f02ea44 100644 --- a/ui/app/scripts/directives/mini-report-list.js +++ b/ui/app/scripts/directives/mini-report-list.js @@ -6,7 +6,9 @@ restrict: 'E', templateUrl: 'views/directives/mini-report-list.html', scope: { - reports: '=' + observable: '=', + reports: '=', + onItemClicked: '&' }, link: function(scope) { scope.taxonomies = []; @@ -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; diff --git a/ui/app/scripts/services/CortexSrv.js b/ui/app/scripts/services/CortexSrv.js index 073bf95da0..0dd722c419 100644 --- a/ui/app/scripts/services/CortexSrv.js +++ b/ui/app/scripts/services/CortexSrv.js @@ -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; + }); })(); diff --git a/ui/app/views/directives/mini-report-list.html b/ui/app/views/directives/mini-report-list.html index 4192453ef0..fdd33d5015 100644 --- a/ui/app/views/directives/mini-report-list.html +++ b/ui/app/views/directives/mini-report-list.html @@ -1,12 +1,13 @@
diff --git a/ui/app/views/partials/observables/list/artifacts-list-main.html b/ui/app/views/partials/observables/list/artifacts-list-main.html index 7356148ec1..17ea66a127 100644 --- a/ui/app/views/partials/observables/list/artifacts-list-main.html +++ b/ui/app/views/partials/observables/list/artifacts-list-main.html @@ -75,7 +75,7 @@