Skip to content

Commit

Permalink
#1431 Use responder selector from case, alert, task, observable lists
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Jul 13, 2020
1 parent d24696b commit e2ff099
Show file tree
Hide file tree
Showing 13 changed files with 170 additions and 146 deletions.
1 change: 1 addition & 0 deletions frontend/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@
<script src="scripts/controllers/LiveCtrl.js"></script>
<script src="scripts/controllers/MainPageCtrl.js"></script>
<script src="scripts/controllers/MigrationCtrl.js"></script>
<script src="scripts/controllers/misc/ResponderSelectorCtrl.js"></script>
<script src="scripts/controllers/misc/ServerInstanceDialogCtrl.js"></script>
<script src="scripts/controllers/RootCtrl.js"></script>
<script src="scripts/controllers/SearchCtrl.js"></script>
Expand Down
25 changes: 13 additions & 12 deletions frontend/app/scripts/controllers/alert/AlertListCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,29 +187,30 @@
}
};

this.getResponders = function(eventId, force) {
this.getResponders = function(event, force) {
if(!force && this.responders !== null) {
return;
}

this.responders = null;
CortexSrv.getResponders('alert', eventId)
CortexSrv.getResponders('alert', event._id)
.then(function(responders) {
self.responders = responders;
return CortexSrv.promntForResponder(responders);
})
.catch(function(err) {
NotificationSrv.error('AlertList', err.data, err.status);
});
};

this.runResponder = function(responderId, responderName, event) {
CortexSrv.runResponder(responderId, responderName, 'alert', _.pick(event, '_id', 'tlp'))
.then(function(response) {
if(response && _.isString(response)) {
NotificationSrv.log(response, 'warning');
} else {
return CortexSrv.runResponder(response.id, response.name, 'alert', _.pick(event, '_id', 'tlp'));
}
})
.then(function(response){
NotificationSrv.log(['Responder', response.data.responderName, 'started successfully on alert', event.title].join(' '), 'success');
})
.catch(function(response) {
if(response && !_.isString(response)) {
NotificationSrv.error('CaseList', response.data, response.status);
.catch(function(err) {
if(err && !_.isString(err)) {
NotificationSrv.error('AlertList', err.data, err.status);
}
});
};
Expand Down
30 changes: 15 additions & 15 deletions frontend/app/scripts/controllers/case/CaseListCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,32 +226,32 @@
});
};

this.getCaseResponders = function(caseId, force) {
this.getCaseResponders = function(caze, force) {
if (!force && this.caseResponders !== null) {
return;
}

this.caseResponders = null;
CortexSrv.getResponders('case', caseId)
.then(function(responders) {
self.caseResponders = null;
CortexSrv.getResponders('case', caze._id)
.then(function(responders){
self.caseResponders = responders;
return CortexSrv.promntForResponder(responders);
})
.catch(function(err) {
NotificationSrv.error('CaseList', err.data, err.status);
});
};

this.runResponder = function(responderId, responderName, caze) {
CortexSrv.runResponder(responderId, responderName, 'case', _.pick(caze, '_id', 'tlp', 'pap'))
.then(function(response) {
if(response && _.isString(response)) {
NotificationSrv.log(response, 'warning');
} else {
return CortexSrv.runResponder(response.id, response.name, 'case', _.pick(caze, '_id', 'tlp', 'pap'));
}
})
.then(function(response){
NotificationSrv.log(['Responder', response.data.responderName, 'started successfully on case', caze.title].join(' '), 'success');
})
.catch(function(response) {
if (response && !_.isString(response)) {
NotificationSrv.error('CaseList', response.data, response.status);
.catch(function(err) {
if(err && !_.isString(err)) {
NotificationSrv.error('CaseList', err.data, err.status);
}
});
};

}
})();
27 changes: 14 additions & 13 deletions frontend/app/scripts/controllers/case/CaseObservablesCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -398,30 +398,31 @@
});
};

$scope.getObsResponders = function(observableId, force) {
$scope.getObsResponders = function(observable, force) {
if(!force && $scope.obsResponders !== null) {
return;
}

$scope.obsResponders = null;
CortexSrv.getResponders('case_artifact', observableId)
CortexSrv.getResponders('case_artifact', observable._id)
.then(function(responders) {
$scope.obsResponders = responders;
return CortexSrv.promntForResponder(responders);
})
.catch(function(err) {
NotificationSrv.error('observablesList', err.data, err.status);
});
};

$scope.runResponder = function(responderId, responderName, artifact) {
CortexSrv.runResponder(responderId, responderName, 'case_artifact', _.pick(artifact, '_id'))
.then(function(response) {
var data = '['+$filter('fang')(artifact.data || artifact.attachment.name)+']';
if(response && _.isString(response)) {
NotificationSrv.log(response, 'warning');
} else {
return CortexSrv.runResponder(response.id, response.name, 'case_artifact', _.pick(observable, '_id'));
}
})
.then(function(response){
var data = '['+$filter('fang')(observable.data || observable.attachment.name)+']';
NotificationSrv.log(['Responder', response.data.responderName, 'started successfully on observable', data].join(' '), 'success');
})
.catch(function(response) {
if(response && !_.isString(response)) {
NotificationSrv.error('observablesList', response.data, response.status);
.catch(function(err) {
if(err && !_.isString(err)) {
NotificationSrv.error('observablesList', err.data, err.status);
}
});
};
Expand Down
37 changes: 25 additions & 12 deletions frontend/app/scripts/controllers/case/CaseTasksCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,31 +230,44 @@
return defer.promise;
};

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

$scope.taskResponders = null;
CortexSrv.getResponders('case_task', taskId)
CortexSrv.getResponders('case_task', task._id)
.then(function(responders) {
$scope.taskResponders = responders;
return CortexSrv.promntForResponder(responders);
})
.catch(function(response) {
NotificationSrv.error('taskList', response.data, response.status);
});
};

$scope.runResponder = function(responderId, responderName, task) {
CortexSrv.runResponder(responderId, responderName, 'case_task', _.pick(task, '_id'))
.then(function(response) {
if(response && _.isString(response)) {
NotificationSrv.log(response, 'warning');
} else {
return CortexSrv.runResponder(response.id, response.name, 'case_task', _.pick(task, '_id'));
}
})
.then(function(response){
NotificationSrv.success(['Responder', response.data.responderName, 'started successfully on task', task.title].join(' '));
})
.catch(function(response) {
if(response && !_.isString(response)) {
NotificationSrv.error('taskList', response.data, response.status);
.catch(function(err) {
if(err && !_.isString(err)) {
NotificationSrv.error('taskList', err.data, err.status);
}
});
};

// $scope.runResponder = function(responderId, responderName, task) {
// CortexSrv.runResponder(responderId, responderName, 'case_task', _.pick(task, '_id'))
// .then(function(response) {
// NotificationSrv.success(['Responder', response.data.responderName, 'started successfully on task', task.title].join(' '));
// })
// .catch(function(response) {
// if(response && !_.isString(response)) {
// NotificationSrv.error('taskList', response.data, response.status);
// }
// });
// };
}
}());
20 changes: 20 additions & 0 deletions frontend/app/scripts/controllers/misc/ResponderSelectorCtrl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
(function() {
'use strict';

angular.module('theHiveControllers')
.controller('ResponderSelectorCtrl', function($uibModalInstance, responders) {
this.responders = responders || [];
this.selectAll = false;
this.state = {
filter: ''
};

this.next = function(responder) {
$uibModalInstance.close(responder);
};

this.cancel = function() {
$uibModalInstance.dismiss();
};
});
})();
21 changes: 21 additions & 0 deletions frontend/app/scripts/services/api/CortexSrv.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,27 @@
return modalInstance.result;
};

this.promntForResponder = function(responders) {
if(!responders || responders.length ===0) {
return $q.resolve('No responders available');
}

var modalInstance = $uibModal.open({
animation: 'true',
templateUrl: 'views/partials/misc/responder.selector.html',
controller: 'ResponderSelectorCtrl',
controllerAs: '$dialog',
size: 'lg',
resolve: {
responders: function() {
return responders;
}
}
});

return modalInstance.result;
};

this.getResponders = function(type, id) {
//return $http.get(baseUrl + '/responder')
return $http.get(baseUrl + '/responder/' + type + '/' + id)
Expand Down
4 changes: 4 additions & 0 deletions frontend/app/styles/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,10 @@ pre.clearpre {
background-color: #777;
}

.btn-clear:active {
box-shadow: none;
}

dl.dl-horizontal>dt.pull-left {
text-align: left !important;
}
Expand Down
22 changes: 4 additions & 18 deletions frontend/app/views/partials/alert/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -164,24 +164,10 @@ <h3 class="box-title">List of alerts ({{$vm.list.total || 0}} of {{alertEvents.c
<a class="btn btn-xs btn-icon btn-clear" href ng-click="$vm.markAsRead(event)" uib-tooltip="Mark as unread" ng-if="$vm.canMarkAsUnread(event)">
<i class="text-info text-20 fa fa-envelope-open-o"></i>
</a>
<span class="btn btn-xs btn-icon btn-clear" uib-dropdown ng-if="appConfig.connectors.cortex.enabled" if-permission="manageAction">
<a href class="text-primary noline nowrap" ng-click="$vm.getResponders(event._id, true)" uib-dropdown-toggle>
<i class="text-info text-20 fa fa-cog"></i>
</a>
<ul class="dropdown-menu align-right" uib-dropdown-menu>
<li ng-if="$vm.responders && $vm.responders.length === 0">
<a href ng-click="$vm.getResponders(event._id, true)">
<strong><i class="fa fa-refresh mr-xxs"></i> No responders available</strong>
</a>
</li>
<li ng-repeat="responder in $vm.responders">
<a href ng-click="$vm.runResponder(responder.id, responder.name, event)">
<strong>{{responder.name}}</strong>
<br>
<small>{{responder.description}}</small></a>
</li>
</ul>
</span>
<a class="btn btn-xs btn-icon btn-clear" href ng-click="$vm.getResponders(event, true)" uib-tooltip="Run responders"
ng-if="appConfig.connectors.cortex.enabled" if-permission="manageAction">
<i class="text-info text-20 fa fa-cog"></i>
</a>
</div>

<div class="pull-right">
Expand Down
31 changes: 6 additions & 25 deletions frontend/app/views/partials/case/case.list.html
Original file line number Diff line number Diff line change
Expand Up @@ -127,28 +127,12 @@ <h3 class="box-title">List of cases ({{$vm.list.total || 0}} of {{$vm.caseStats.
<case-duration start="currentCase.startDate" end="currentCase.endDate" icon="fa-clock-o"></case-duration>
</div>
</td>
<td>

<span class="ml-xs" uib-dropdown ng-if="appConfig.connectors.cortex.enabled" if-permission="manageAction" allowed="{{currentCase.extraData.permissions.join(',')}}">
<a href class="text-primary noline nowrap" ng-click="$vm.getCaseResponders(currentCase._id, true)" 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 align-right" uib-dropdown-menu>
<li ng-if="$vm.caseResponders && $vm.caseResponders.length === 0">
<a href ng-click="$vm.getCaseResponders(currentCase._id, true)">
<strong><i class="fa fa-refresh mr-xxs"></i> No responders available</strong>
</a>
</li>
<li ng-repeat="responder in $vm.caseResponders">
<a href ng-click="$vm.runResponder(responder.id, responder.name, currentCase)">
<strong>{{responder.name}}</strong>
<br>
<small>{{responder.description}}</small></a>
</li>
</ul>
</span>
<td class="text-center">
<!-- <a href class="text-primary noline nowrap" ng-click="$vm.getCaseResponders(currentCase, true)" uib-dropdown-toggle> -->
<a href class="btn btn-icon btn-clear" ng-click="$vm.getCaseResponders(currentCase, true)"
ng-if="appConfig.connectors.cortex.enabled" if-permission="manageAction" allowed="{{currentCase.extraData.permissions.join(',')}}">
<i class="text-info fa fa-cog"></i>
</a>
</td>
</tr>
</tbody>
Expand All @@ -162,9 +146,6 @@ <h3 class="box-title">List of cases ({{$vm.list.total || 0}} of {{$vm.caseStats.
</div>
</div>




<div ng-show="appLayout.showFlow" class="col-md-3">
<div class=" box">
<div class="box-header">
Expand Down
Loading

0 comments on commit e2ff099

Please sign in to comment.