Skip to content

Commit

Permalink
#609 WIP: add responders menus in case and task details pages
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Jul 11, 2018
1 parent cafa4da commit 0a4cb01
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 79 deletions.
29 changes: 27 additions & 2 deletions ui/app/scripts/controllers/case/CaseMainCtrl.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
(function() {
'use strict';
angular.module('theHiveControllers').controller('CaseMainCtrl',
function($scope, $rootScope, $state, $stateParams, $q, $uibModal, CaseTabsSrv, CaseSrv, MetricsCacheSrv, UserInfoSrv, MispSrv, StreamSrv, StreamStatSrv, NotificationSrv, UtilsSrv, CaseResolutionStatus, CaseImpactStatus, caze) {
function($scope, $rootScope, $state, $stateParams, $q, $uibModal, CaseTabsSrv, CaseSrv, MetricsCacheSrv, UserInfoSrv, MispSrv, StreamSrv, StreamStatSrv, NotificationSrv, UtilsSrv, CaseResolutionStatus, CaseImpactStatus, CortexSrv, caze) {
$scope.CaseResolutionStatus = CaseResolutionStatus;
$scope.CaseImpactStatus = CaseImpactStatus;
$scope.caseResponders = null;

var caseId = $stateParams.caseId;
if (!$rootScope.currentCaseId) {
Expand Down Expand Up @@ -281,7 +282,31 @@
NotificationSrv.error('caseDetails', response.data, response.status);
}
});
}
};

$scope.getCaseResponders = function(force) {
if(!force && $scope.caseResponders !== null) {
return;
}

CortexSrv.getResponders('case', $scope.caseId)
.then(function(responders) {
$scope.caseResponders = responders;
})
.catch(function(err) {
NotificationSrv.error('caseDetails', response.data, response.status);
})
};

$scope.runResponder = function(responderId) {
CortexSrv.runResponder(responderId, 'case', _.pick($scope.caze, 'id', 'tlp', 'pap'))
.then(function(response) {
console.log(response);
})
.catch(function(err) {
console.log(err);
});
};

/**
* A workaround filter to make sure the ngRepeat doesn't order the
Expand Down
27 changes: 26 additions & 1 deletion ui/app/scripts/controllers/case/CaseTasksItemCtrl.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
(function () {
'use strict';
angular.module('theHiveControllers').controller('CaseTasksItemCtrl',
function ($scope, $rootScope, $state, $stateParams, $timeout, CaseTabsSrv, CaseTaskSrv, PSearchSrv, TaskLogSrv, NotificationSrv, task) {
function ($scope, $rootScope, $state, $stateParams, $timeout, CaseTabsSrv, CaseTaskSrv, PSearchSrv, TaskLogSrv, NotificationSrv, CortexSrv, task) {
var caseId = $stateParams.caseId,
taskId = $stateParams.itemId;

// Initialize controller
$scope.task = task;
$scope.tabName = 'task-' + task.id;
$scope.taskResponders = null;

$scope.loading = false;
$scope.newLog = {
Expand Down Expand Up @@ -149,6 +150,30 @@
$scope.logs.update();
};

$scope.getTaskResponders = function(force) {
if(!force && $scope.taskResponders !== null) {
return;
}

CortexSrv.getResponders('case_task', $scope.caseId)
.then(function(responders) {
$scope.taskResponders = responders;
})
.catch(function(err) {
NotificationSrv.error('taskDetails', response.data, response.status);
})
};

$scope.runResponder = function(responderId) {
CortexSrv.runResponder(responderId, 'case_task', _.pick($scope.task, 'id'))
.then(function(response) {
console.log(response);
})
.catch(function(err) {
console.log(err);
});
};

// Add tabs
CaseTabsSrv.addTab($scope.tabName, {
name: $scope.tabName,
Expand Down
173 changes: 98 additions & 75 deletions ui/app/scripts/services/CortexSrv.js
Original file line number Diff line number Diff line change
@@ -1,98 +1,121 @@
(function() {
'use strict';
angular.module('theHiveServices').factory('CortexSrv', function($q, $http, $rootScope, $uibModal, StatSrv, StreamSrv, AnalyzerSrv, PSearchSrv) {

angular.module('theHiveServices').service('CortexSrv', function($q, $http, $rootScope, $uibModal, StatSrv, StreamSrv, AnalyzerSrv, PSearchSrv) {
var self = this;
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
}
this.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
}
this.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
}
}, {
_or: [
{analyzerId: analyzerId},
{
}
}, {
_or: [
{
analyzerId: analyzerId
}, {
_like: {
_field: 'analyzerDefinition',
_value: analyzerId
_field: 'analyzerDefinition',
_value: analyzerId
}
}
]
}
]
}
]
}
]
}
})
};

this.getJob = function(jobId, nstats) {
if (nstats) {
return $http.get(baseUrl + '/job/' + jobId, {
params: {
nstats: true
}
})
},
});
}
return $http.get(baseUrl + '/job/' + jobId);

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

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

createJob: function(job) {
return $http.post(baseUrl + '/job', job);
},
this.getServers = function(analyzerIds) {
return AnalyzerSrv.serversFor(analyzerIds).then(function(servers) {
if (servers.length === 1) {
return $q.resolve(servers[0]);
} else {
return self.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);
this.promptForInstance = function(servers) {
var modalInstance = $uibModal.open({
templateUrl: 'views/partials/cortex/choose-instance-dialog.html',
controller: 'ServerInstanceDialogCtrl',
controllerAs: 'vm',
size: '',
resolve: {
servers: function() {
return servers;
}
});
},
}
});

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

return modalInstance.result;
}
this.getResponders = function(type, id) {
//return $http.get(baseUrl + '/responder')
return $http.get(baseUrl + '/responder/' + type + '/' + id)
.then(function(response) {
return $q.resolve(response.data);
})
.catch(function(err) {
return $q.reject(err);
})
};

return factory;
this.runResponder = function(responderId, type, object) {
var post = {
responderId: responderId,
objectType: type,
objectId: object.id
};

return $http.post(baseUrl + '/action', post);
}
});

})();
21 changes: 20 additions & 1 deletion ui/app/views/partials/case/case.panelinfo.html
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,26 @@ <h3 class="box-title">
Reopen
</a>
</span>

<span class="ml-xs pull-right" uib-dropdown ng-if="appConfig.connectors.cortex.enabled">
<a href class="text-primary noline" ng-click="getCaseResponders()" uib-dropdown-toggle>
<i class="text-primary fa fa-cog"></i>
Responders
<i class="text-primary fa fa-angle-down"></i>
</a>
<ul class="dropdown-menu" uib-dropdown-menu>
<li ng-if="caseResponders && caseResponders.length === 0">
<a href ng-click="getCaseResponders(true)">
<strong><i class="fa fa-refresh mr-xxs"></i> No responders available</strong>
</a>
</li>
<li ng-repeat="responder in caseResponders">
<a href ng-click="runResponder(responder.id)">
<strong>{{responder.name}}</strong>
<br>
<small>{{responder.description}}</small></a>
</li>
</ul>
</span>
</div>
</div>

Expand Down
20 changes: 20 additions & 0 deletions ui/app/views/partials/case/case.tasks.item.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,26 @@ <h4 class="mb-xs text-primary">
Basic Information

<div class="task-actions pull-right">
<span class="mr-xxs action-button" uib-dropdown ng-if="appConfig.connectors.cortex.enabled">
<a href class="text-primary noline" ng-click="getTaskResponders()" uib-dropdown-toggle>
<i class="text-primary fa fa-cog"></i>
Responders
<i class="text-primary fa fa-angle-down"></i>
</a>
<ul class="dropdown-menu" uib-dropdown-menu>
<li ng-if="taskResponders && taskResponders.length === 0">
<a href ng-click="getTaskResponders(true)">
<strong><i class="fa fa-refresh mr-xxs"></i> No responders available</strong>
</a>
</li>
<li ng-repeat="responder in taskResponders">
<a href ng-click="runResponder(responder.id)">
<strong>{{responder.name}}</strong>
<br>
<small>{{responder.description}}</small></a>
</li>
</ul>
</span>
<a href ng-click="switchFlag()">
<span class="mr-xxs action-button" ng-class="{true: 'text-yellow', false: 'text-muted'}[task.flag]">
<i class="fa fa-flag"></i> {{task.flag ? 'Unflag' : 'Flag'}}
Expand Down

0 comments on commit 0a4cb01

Please sign in to comment.