Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/BackofficeMainCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@

$scope.changeLanguage = function (lang_id) {
UserService.setUiLanguage(lang_id);
UserProfileService.updateProfile({language:lang_id},function(){});
UserProfileService.updateProfile({language:lang_id}, function () {
$rootScope.$broadcast('languageChanged');
});
gettextCatalog.setCurrentLanguage($rootScope.languages[lang_id].code);
$rootScope.uiLanguage = $rootScope.languages[lang_id].flag;
$scope.updatePaginationLabels();
Expand Down
206 changes: 201 additions & 5 deletions src/kb/info/BackofficeKbInfoCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
.controller('BackofficeKbInfoCtrl', [
'$scope', '$stateParams', 'toastr', '$mdMedia', '$mdDialog', 'gettextCatalog', 'TableHelperService',
'AssetService', 'ThreatService', 'VulnService', 'AmvService', 'MeasureService', 'TagService', 'RiskService', 'ObjlibService', '$state',
'RiskSourceService',
'$timeout', '$http', 'DownloadService', '$rootScope', 'SOACategoryService', 'ReferentialService', 'MeasureMeasureService',
'UserService', BackofficeKbInfoCtrl
]);
Expand All @@ -86,7 +87,7 @@
*/
function BackofficeKbInfoCtrl($scope, $stateParams, toastr, $mdMedia, $mdDialog, gettextCatalog, TableHelperService,
AssetService, ThreatService, VulnService, AmvService, MeasureService, TagService, RiskService, ObjlibService,
$state, $timeout, $http, DownloadService, $rootScope, SOACategoryService, ReferentialService,
$state, RiskSourceService, $timeout, $http, DownloadService, $rootScope, SOACategoryService, ReferentialService,
MeasureMeasureService, UserService) {

$scope.tab = $stateParams.tab;
Expand Down Expand Up @@ -117,18 +118,21 @@
case 'vulns':
$scope.currentTabIndex = 2;
break;
case 'measures':
case 'risk-sources':
$scope.currentTabIndex = 3;
break;
case 'categories':
case 'measures':
$scope.currentTabIndex = 4;
break;
case 'amvs':
case 'categories':
$scope.currentTabIndex = 5;
break;
case 'objlibs':
case 'amvs':
$scope.currentTabIndex = 6;
break;
case 'objlibs':
$scope.currentTabIndex = 7;
break;
}
}
$scope.selectTab($scope.tab);
Expand Down Expand Up @@ -768,6 +772,145 @@
});
};

/*
* RISK SOURCES TAB
*/
$scope.riskSourcesKb = TableHelperService.build('label', 20, 1, '');
$scope.riskSourcesKb.activeFilter = 1;
var riskSourcesFilterWatch;
var riskSourcesLanguageWatch;

$scope.selectRiskSourcesTab = function () {
$state.transitionTo('main.kb_mgmt.info_risk', {
'tab': 'risk-sources'
});
var initRiskSourcesFilter = true;
riskSourcesFilterWatch = $scope.$watch('riskSourcesKb.activeFilter', function () {
if (initRiskSourcesFilter) {
initRiskSourcesFilter = false;
} else {
$scope.updateRiskSources();
}
});
riskSourcesLanguageWatch = $rootScope.$on('languageChanged', function () {
$scope.updateRiskSources();
});
TableHelperService.watchSearch(
$scope,
'riskSourcesKb.query.filter',
$scope.riskSourcesKb.query,
$scope.updateRiskSources,
$scope.riskSourcesKb
);
$scope.updateRiskSources();
};

$scope.deselectRiskSourcesTab = function () {
if (riskSourcesFilterWatch) {
riskSourcesFilterWatch();
}
if (riskSourcesLanguageWatch) {
riskSourcesLanguageWatch();
}
TableHelperService.unwatchSearch($scope.riskSourcesKb);
};

$scope.updateRiskSources = function () {
var query = angular.copy($scope.riskSourcesKb.query);
query.status = $scope.riskSourcesKb.activeFilter;

if ($scope.riskSourcesKb.previousQueryOrder != $scope.riskSourcesKb.query.order) {
$scope.riskSourcesKb.query.page = query.page = 1;
$scope.riskSourcesKb.previousQueryOrder = $scope.riskSourcesKb.query.order;
}

$scope.riskSourcesKb.promise = RiskSourceService.getRiskSources(query);
$scope.riskSourcesKb.promise.then(function (data) {
$scope.riskSourcesKb.items = data;
});
};

$scope.removeRiskSourcesFilter = function () {
TableHelperService.removeFilter($scope.riskSourcesKb);
};

$scope.openRiskSourceDialog = function (ev, riskSource) {
var showDialog = function (riskSourceData) {
$mdDialog.show({
controller: ['$scope', '$mdDialog', 'gettextCatalog', '$rootScope', 'riskSource', RiskSourceDialogCtrl],
templateUrl: 'views/create.risk_source.html',
clickOutsideToClose: true,
multiple: true,
targetEvent: ev,
locals: {
riskSource: riskSourceData ? angular.copy(riskSourceData) : null
}
}).then(function (payload) {
if (riskSource) {
payload.id = riskSource.id;
RiskSourceService.updateRiskSource(payload, function () {
$scope.updateRiskSources();
toastr.success(
gettextCatalog.getString('The risk source has been edited successfully.'),
gettextCatalog.getString('Edition successful')
);
});
} else {
RiskSourceService.createRiskSource(payload, function () {
$scope.updateRiskSources();
toastr.success(
gettextCatalog.getString('The risk source has been created successfully.'),
gettextCatalog.getString('Creation successful')
);
});
}
}, function (reject) {
$scope.handleRejectionDialog(reject);
});
};

if (riskSource) {
RiskSourceService.getRiskSource(riskSource.id).then(showDialog);
} else {
showDialog(null);
}
};

$scope.toggleRiskSourceStatus = function (riskSource) {
RiskSourceService.updateRiskSource({
id: riskSource.id,
isActive: !riskSource.isActive
}, function () {
$scope.updateRiskSources();
});
};

$scope.removeRiskSource = function (ev, riskSource) {
var confirm = $mdDialog.confirm()
.title(gettextCatalog.getString('Are you sure you want to delete risk source?', {
label: riskSource.label
}))
.textContent(gettextCatalog.getString('This operation is irreversible.'))
.targetEvent(ev)
.theme('light')
.ok(gettextCatalog.getString('Delete'))
.cancel(gettextCatalog.getString('Cancel'));

$mdDialog.show(confirm).then(function () {
RiskSourceService.deleteRiskSource(riskSource.id, function () {
$scope.updateRiskSources();
toastr.success(
gettextCatalog.getString('The risk source has been deleted.'),
gettextCatalog.getString('Deletion successful')
);
}, function (error) {
toastr.error(error.data.message, gettextCatalog.getString('Deletion failed'));
});
}, function (reject) {
$scope.handleRejectionDialog(reject);
});
};

/*
* REFERENTIALS TAB
*/
Expand Down Expand Up @@ -2695,4 +2838,57 @@
$mdDialog.hide($scope.exportData);
};
}

function RiskSourceDialogCtrl($scope, $mdDialog, gettextCatalog, $rootScope, riskSource) {
var currentLanguageCode = gettextCatalog.getCurrentLanguage();

$scope.dialogTitle = gettextCatalog.getString(riskSource ? 'Edit risk source' : 'Add a risk source');
$scope.confirmLabel = gettextCatalog.getString(riskSource ? 'Save' : 'Create');
$scope.languages = $rootScope.languages;
$scope.riskSource = riskSource || {
labels: {}
};

angular.forEach($scope.languages, function (language) {
if ($scope.riskSource.labels[language.code] === undefined) {
$scope.riskSource.labels[language.code] = riskSource ? riskSource.label : '';
}
});

$scope.cancel = function () {
$mdDialog.cancel();
};

$scope.getPrimaryLabel = function () {
var primaryLabel = ($scope.riskSource.labels[currentLanguageCode] || '').trim();
if (primaryLabel) {
return primaryLabel;
}

var labels = Object.values($scope.riskSource.labels);
for (var index = 0; index < labels.length; index++) {
var label = (labels[index] || '').trim();
if (label) {
return label;
}
}

return '';
};

$scope.save = function () {
var labels = {};
angular.forEach($scope.languages, function (language) {
var label = ($scope.riskSource.labels[language.code] || '').trim();
if (label) {
labels[language.code] = label;
}
});

$mdDialog.hide({
label: $scope.getPrimaryLabel(),
labels: labels
});
};
}
})();
31 changes: 31 additions & 0 deletions views/create.risk_source.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<md-dialog md-theme="light" class="dialog-width">
<form name="riskSourceForm">
<md-toolbar>
<div class="md-toolbar-tools">
<h2>{{ dialogTitle }}</h2>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="{{ 'Close dialog' | translate }}">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content>
<div class="md-dialog-content">
<md-input-container class="md-block" flex ng-repeat="(index, language) in languages">
<label>{{ ('Label' | translate) + ' (' + language.code.toUpperCase() + ')' }}</label>
<md-icon>language</md-icon>
<input ng-model="riskSource.labels[language.code]" name="label_{{ language.code }}">
</md-input-container>
</div>
</md-dialog-content>
<md-dialog-actions layout="row">
<span flex></span>
<md-button ng-click="cancel()">
{{ 'Cancel' | translate }}
</md-button>
<md-button ng-click="save()" ng-disabled="!getPrimaryLabel()" class="md-accent md-hue-3">
{{ confirmLabel }}
</md-button>
</md-dialog-actions>
</form>
</md-dialog>
64 changes: 64 additions & 0 deletions views/info_risk.kb_mgmt.html
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,70 @@ <h2 class="md-title md-padding-right md-padding-left">
md-total="{{vulns.items.count}}" md-on-paginate="updateVulns" md-page-select md-label="{{paginationLabels}}"></md-table-pagination>
</md-tab>

<md-tab label="{{ 'Risk Sources' | translate }}" md-on-select="selectRiskSourcesTab()" md-on-deselect="deselectRiskSourcesTab()">
<div layout="row" layout-align="start center" class="md-padding">
<h2 class="md-title md-padding-right md-padding-left">
<span translate>Risk Sources</span>
<md-button class="md-icon-button md-primary md-button ng-scope md-light-theme" aria-label="{{ 'Add a risk source' | translate }}" ng-click="openRiskSourceDialog($event)">
<md-tooltip md-direction="left">
{{ 'Add a risk source' | translate }}
</md-tooltip>
<md-icon>add_to_photos</md-icon>
</md-button>
</h2>

<form flex name="riskSourcesKb.filter.form">
<md-input-container class="md-block md-padding-left md-padding-right">
<label><md-icon>search</md-icon> {{ 'Search...' | translate }}</label>
<input ng-model="riskSourcesKb.query.filter" ng-model-options="riskSourcesKb.filter.options">
</md-input-container>
</form>

<md-select aria-label="filter" ng-model="riskSourcesKb.activeFilter">
<md-option value="all">{{ 'Show all' | translate }}</md-option>
<md-option value="0">{{ 'Show inactive only' | translate }}</md-option>
<md-option value="1">{{ 'Show active only' | translate }}</md-option>
</md-select>

<md-button class="md-icon-button md-primary" ng-click="removeRiskSourcesFilter()">
<md-icon>settings_backup_restore</md-icon>
<md-tooltip translate>Reset filter</md-tooltip>
</md-button>
</div>

<md-table-container flex>
<table md-table md-progress="riskSourcesKb.promise">
<thead md-head md-order="riskSourcesKb.query.order" md-on-reorder="updateRiskSources">
<tr md-row>
<th md-column md-order-by="isActive"><span translate>Active</span></th>
<th md-column md-order-by="label"><span translate>Label</span></th>
<th md-column md-order-by="isDefault"><span translate>Type</span></th>
<th md-column class="actions-column"><span translate>Actions</span></th>
</tr>
</thead>

<tbody md-body>
<tr md-row ng-repeat="riskSource in riskSourcesKb.items.riskSources">
<td md-cell>
<md-button class="md-icon-button md-primary" ng-click="toggleRiskSourceStatus(riskSource)">
<md-icon>{{ riskSource.isActive ? 'done' : 'clear' }}</md-icon>
</md-button>
</td>
<td md-cell>{{ riskSource.label }}</td>
<td md-cell>{{ (riskSource.isDefault ? 'Default' : 'Custom') | translate }}</td>
<td md-cell>
<md-button class="md-icon-button md-primary" ng-click="openRiskSourceDialog($event, riskSource)"><md-icon>edit</md-icon></md-button>
<md-button class="md-icon-button md-warn" ng-click="removeRiskSource($event, riskSource)"><md-icon>delete</md-icon></md-button>
</td>
</tr>
</tbody>
</table>
</md-table-container>

<md-table-pagination md-limit="riskSourcesKb.query.limit" md-limit-options="[20, 30, 50, 100]" md-page="riskSourcesKb.query.page"
md-total="{{riskSourcesKb.items.count}}" md-on-paginate="updateRiskSources" md-page-select md-label="{{paginationLabels}}"></md-table-pagination>
</md-tab>

<md-tab label="{{ 'Referentials' | translate }}" md-on-select="selectMeasuresTab()" md-on-deselect="deselectMeasuresTab()">
<md-tabs class="kb-sub-tabs" md-dynamic-height="true" md-border-bottom="" ng-if="updatingReferentials" md-selected="refTabSelected">
<md-button class="md-icon-button md-primary" ng-click="createNewReferential($event)">
Expand Down