Skip to content

Commit

Permalink
#53 Display analysis number for each observables
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Jan 2, 2017
1 parent d73eea5 commit 87cb4ee
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 31 deletions.
3 changes: 2 additions & 1 deletion thehive-backend/app/models/Artifact.scala
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,5 @@ class ArtifactModel @Inject() (

class Artifact(model: ArtifactModel, attributes: JsObject) extends EntityDef[ArtifactModel, Artifact](model, attributes) with ArtifactAttributes {
def dblists = model.dblists
}
override def toJson = super.toJson + ("reports" Json.parse(reports())) // FIXME is parse fails (invalid report)
}
28 changes: 28 additions & 0 deletions ui/app/scripts/controllers/case/CaseObservablesCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@
$scope.filter();
};

$scope.countReports = function(observable) {
return _.keys(observable.reports).length;
};

// FIXME à quoi ça sert ? c'est un tableau ou un object ?
$scope.artifactList = [];
$scope.artifactList.Action = 'main';
Expand Down Expand Up @@ -544,6 +548,30 @@
$scope.initSelection($scope.selection);
};

$scope.runAllOnObservable = function(artifact) {
var artifactId = artifact.id;
var artifactName = artifact.data || artifact.attachment.name;

var analyzerIds = [];
AnalyzerSrv.forDataType(artifact.dataType)
.then(function(analyzers) {
analyzerIds = _.pluck(analyzers, 'id');
return CortexSrv.getServers(analyzerIds);
})
.then(function (serverId) {
return $q.all(_.map(analyzerIds, function (analyzerId) {
return CortexSrv.createJob({
cortexId: serverId,
artifactId: artifactId,
analyzerId: analyzerId
});
}));
})
.then(function () {
AlertSrv.log('Analyzers has been successfully started for observable: ' + artifactName, 'success');
});
};

//
// Open an artifact
//
Expand Down
14 changes: 7 additions & 7 deletions ui/app/scripts/services/AnalyzerSrv.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@
analyzers = _.indexBy(response, 'id');

deferred.resolve(analyzers);
}, function (rejection) {
}, function (/*rejection*/) {
deferred.reject({});
})
});

} else {
deferred.resolve(analyzers);
}

return deferred.promise;
},
},

get: function(analyzerId) {
var deferred = $q.defer();
Expand All @@ -58,7 +58,7 @@
});
}

return deferred.promise;
return deferred.promise;
},

forDataType: function(dataType) {
Expand All @@ -69,7 +69,7 @@
var filtered = {};
_.each(all, function(value, key) {
if(value.dataTypeList && value.dataTypeList.indexOf(dataType) !== -1) {
filtered[key] = angular.copy(value);
filtered[key] = angular.copy(value);
filtered[key].active = true;
}
});
Expand All @@ -85,12 +85,12 @@

factory.query()
.then(function(all) {
var cortexIds = [];
var cortexIds = [];

_.each(all, function(value, key) {
if(analyzerIds.indexOf(key) > -1){
cortexIds = cortexIds.concat(value.cortexIds);
}
}
});

deferred.resolve(_.uniq(cortexIds));
Expand Down
31 changes: 27 additions & 4 deletions ui/app/styles/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -279,18 +279,41 @@ ul.observable-reports-summary li {
.border-left-tlp-na {
border-left: 6px solid #428BCA;
}
.border-left-tlp-white {
.border-left-tlp-white,
.border-left-tlp-0 {
border-left: 6px solid #5BC0CE;
}
.border-left-tlp-green {
.border-left-tlp-green,
.border-left-tlp-1 {
border-left: 6px solid #5CB85C;
}
.border-left-tlp-amber {
.border-left-tlp-amber,
.border-left-tlp-2 {
border-left: 6px solid #F0AD4E;
}
.border-left-tlp-red {
.border-left-tlp-red,
.border-left-tlp-3 {
border-left: 6px solid #D9534F;
}
.bg-tlp-na {
background-color: #428BCA;
}
.bg-tlp-white,
.bg-tlp-0 {
background-color: #5BC0CE;
}
.bg-tlp-green,
.bg-tlp-1 {
background-color: #5CB85C;
}
.bg-tlp-amber,
.bg-tlp-2 {
background-color: #F0AD4E;
}
.bg-tlp-red,
.bg-tlp-3 {
background-color: #D9534F;
}
.updatable-waiting .updatable-value {
background-color: gray;
}
Expand Down
43 changes: 24 additions & 19 deletions ui/app/views/partials/observables/list/artifacts-list-main.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,51 +25,56 @@ <h4>List of observables ({{artifacts.total || 0}} of {{artifactStats.count}})</h

<!-- list of artifacts-->
<div class="col-md-12">
<table style="font-size:0.9em" class="table">
<table class="table table-hover valigned">
<thead>
<tr>
<th style="width: 1%;">
<th style="width: 10px;" class="p-0"></th>
<th style="width: 20px">
<input type="checkbox" ng-change="selectAll()" ng-model="selection.all" ng-disabled="switchTEList"></input>
</th>
<th style="width: 1%"></th>
<th style="width: 1%"></th>
<th style="width: 1%"></th>
<th style="width: 10%">Date added <a href ng-click="artifacts.sort='-startDate'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+startDate'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
<th style="width: 7%">Type <a href ng-click="artifacts.sort='-dataType'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+dataType'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
<th style="width: 45%">Data/Filename <a href ng-click="artifacts.sort='-data'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+data'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
<!-- <th style="width:25%">Reports</th> -->
<th style="width: 20%">Tags</th>
<th style="width: 15px"></th>
<th style="width: 15px"></th>
<th style="width: 100px">Type <a href ng-click="artifacts.sort='-dataType'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+dataType'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
<th>Data/Filename <a href ng-click="artifacts.sort='-data'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+data'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
<th style="width: 140px">Reports</th>
<th style="width: 300px">Tags</th>
<th style="width: 120px">Date added <a href ng-click="artifacts.sort='-startDate'; artifacts.update()"><i class="fa fa-caret-up"></i></a><a href ng-click="artifacts.sort='+startDate'; artifacts.update()"><i class="fa fa-caret-down"></i></a></th>
</tr>
</thead>
<tbody>
<tr ng-mouseenter="showDropArtifact = true" ng-mouseleave="showDropArtifact = false" ng-repeat="artifact in artifacts.values">
<tr ng-repeat="artifact in artifacts.values">
<td class="p-0 bg-tlp-{{artifact.tlp}} clickable" ng-click="addFilterValue('tlp', artifact.tlp)"></td>
<td>
<input type="checkbox" ng-change="selectArtifact(artifact)" ng-model="selection.list[artifact.id]">
</td>
<td>
<span class="clickable" ng-click="addFilterValue('tlp', artifact.tlp)"><tlp format="small" value="artifact.tlp"></tlp></span>
</td>
<td>
<span ng-click="addFilterValue('ioc', artifact.ioc)" ng-if="artifact.ioc" class="clickable fa fa-star" tooltip="is an IOC" tooltip-popup-delay="500" tooltip-placement="bottom"></span>
</td>
<td>
<span tooltip="{{artifact.stats.seen}} related artifact(s)" tooltip-popup-delay="500" tooltip-placement="bottom" ng-if="artifact.stats.seen > 0" class="glyphicon glyphicon-eye-open"></span>
</td>
<td>
<a href="" ng-click="addFilterValue('startDate', artifact.startDate)"><span tooltip="{{artifact.startDate | showDate}}" tooltip-popup-delay="500" tooltip-placement="bottom">{{artifact.startDate | shortDate}}</span></a>
</td>
<td>
<a href="" ng-click="addFilterValue('dataType', artifact.dataType)"><span ng-bind="artifact.dataType"></span></a>
</td>
<td class="wrap" style="cursor: pointer;" ng-click="openArtifact(artifact)">{{(artifact.data | fang) || (artifact.attachment.name | fang)}}</td>
<!-- <td></td> -->
<td class="wrap clickable" ng-click="openArtifact(artifact)">{{(artifact.data | fang) || (artifact.attachment.name | fang)}}</td>
<td class="clickable" ng-switch="countReports(artifact)">
<span ng-switch-when="0">
<a href ng-click="runAllOnObservable(artifact)">Run all analyzers</a>
</span>
<span ng-switch-default>
<ng-pluralize count="countReports(artifact)" when="{'one': '1 analysis', 'other': '{} analysis'}"></ng-pluralize>
</span>
</td>
<td>
<span ng-repeat="l in artifact.tags">
<span class="label label-primary mr-xxs pointer" ng-click="addFilterValue('tags', l)">
<i class="glyphicon glyphicon-tag"></i> <span ng-bind="l"></span>
</span>
</span>
</td>
<td>
<a href="" ng-click="addFilterValue('startDate', artifact.startDate)"><span tooltip="{{artifact.startDate | showDate}}" tooltip-popup-delay="500" tooltip-placement="bottom">{{artifact.startDate | shortDate}}</span></a>
</td>
</tr>
</tbody>
</table>
Expand Down

0 comments on commit 87cb4ee

Please sign in to comment.