updateRecommendations method
Updates Global Recommendations in a Cloud to Local way TO GET FULL DATA -> UPDATETHREATWEIGHTS IS REQUIRED PREVIOUSLY
Implementation
@override
Future<void> updateRecommendations() async {
log('[UPDATE RECOMMENDATIONS]');
toolbox_api.Node typeChecker;
try {
typeChecker = await getNode(':Global:Recommendations');
} catch (e) {
/// CREATE NODE FOR TYPE of TLP WHITE EVENT
typeChecker =
toolbox_api.NodeImpl(':Global:Recommendations', _replicationAPI);
toolbox_api.Visibility? checkerVisible =
toolbox_api.VisibilityExtension.valueOf("white");
if (checkerVisible != null) {
typeChecker.visibility = checkerVisible;
}
await _storageController.add(typeChecker);
}
List<Recommendation> recommendations = await cloud.getRecommendations();
for (var rec in recommendations) {
String? id = rec.getId;
if (id != null) {
try {
toolbox_api.Node checker =
await getNode(':Global:Recommendations:$id');
Map<String, dynamic> mapper = rec.toJson();
for (var r in mapper.entries) {
if (r.key != "relatedThreatsWeights" && r.key != "Steps") {
checker.addOrUpdateValue(
toolbox_api.NodeValueImpl(r.key, r.value.toString()));
} else {
if (r.key == "Steps") {
String toAdd = "";
List<String> steps = r.value;
for (var step in steps) {
if (toAdd.isEmpty) {
toAdd = toAdd + "[" + '"' + step + '"';
} else {
toAdd = toAdd + "," + '"' + step + '"';
}
}
toAdd = toAdd + "]";
checker
.addOrUpdateValue(toolbox_api.NodeValueImpl(r.key, toAdd));
}
if (r.key == "relatedThreatsWeights") {
/// IF RELATED THREATS WEIGHTS
/// SEARCH CRITERIA TO GET NODE ID FOR KEY VALUE
String data = "";
List<String> related = r.value;
List<String> splitted = related[0].split(";");
for (var split in splitted) {
try {
List<String> splitThreat = split.split(",");
String threat = splitThreat[0].trim();
String threatValue = splitThreat[1].trim();
toolbox_api.SearchCriteria profileCriteria =
toolbox_api.SearchCriteria(
searchPath: ':Global:threats:',
key: 'GEIGER_threat',
value: threat);
List<toolbox_api.Node> scProf =
await _storageController.search(profileCriteria);
if (scProf.isNotEmpty) {
for (var element in scProf) {
toolbox_api.Node threatNode = element;
String uuid = threatNode.name;
toolbox_api.NodeValue? nameVal =
(await threatNode.getValue('name'));
toolbox_api.NodeValue? threatVal =
(await threatNode.getValue('GEIGER_threat'));
if (nameVal!.value == threatVal!.value) {
if (data.isEmpty == true) {
data = data + uuid + "," + threatValue;
} else {
data = data + ";" + uuid + "," + threatValue;
}
}
}
}
} catch (e) {
log("EXCEPTION GETTING RECOMMENDATIONS THREAT WEIGHTS");
}
}
checker
.addOrUpdateValue(toolbox_api.NodeValueImpl(r.key, data));
}
}
}
await _storageController.addOrUpdate(checker);
} catch (e) {
toolbox_api.Node newThreatNode = toolbox_api.NodeImpl(
':Global:Recommendations:$id', _replicationAPI);
toolbox_api.Visibility? visible =
toolbox_api.VisibilityExtension.valueOf("white");
if (visible != null) {
newThreatNode.visibility = visible;
}
Map<String, dynamic> mapper = rec.toJson();
for (var r in mapper.entries) {
if (r.key != "relatedThreatsWeights" && r.key != "Steps") {
newThreatNode.addOrUpdateValue(
toolbox_api.NodeValueImpl(r.key, r.value.toString()));
} else {
if (r.key == "Steps") {
String toAdd = "";
List<String> steps = r.value;
for (var step in steps) {
if (toAdd.isEmpty) {
toAdd = toAdd + "[" + '"' + step + '"';
} else {
toAdd = toAdd + "," + '"' + step + '"';
}
}
toAdd = toAdd + "]";
newThreatNode
.addOrUpdateValue(toolbox_api.NodeValueImpl(r.key, toAdd));
}
if (r.key == "relatedThreatsWeights") {
/// IF RELATED THREATS WEIGHTS
/// SEARCH CRITERIA TO GET NODE ID FOR KEY VALUE
String data = "";
List<String> related = r.value;
List<String> splitted = related[0].split(";");
for (var split in splitted) {
try {
List<String> splitThreat = split.split(",");
String threat = splitThreat[0].trim();
String threatValue = splitThreat[1].trim();
toolbox_api.SearchCriteria profileCriteria =
toolbox_api.SearchCriteria(
searchPath: ':Global:threats:',
key: 'GEIGER_threat',
value: threat);
List<toolbox_api.Node> scProf =
await _storageController.search(profileCriteria);
if (scProf.isNotEmpty) {
for (var element in scProf) {
toolbox_api.Node threatNode = element;
String uuid = threatNode.name;
toolbox_api.NodeValue? nameVal =
(await threatNode.getValue('name'));
toolbox_api.NodeValue? threatVal =
(await threatNode.getValue('GEIGER_threat'));
if (nameVal!.value == threatVal!.value) {
if (data.isEmpty == true) {
data = data + uuid + "," + threatValue;
} else {
data = data + ";" + uuid + "," + threatValue;
}
}
}
}
} catch (e) {
log("EXCEPTION GETTING RECOMMENDATIONS THREAT WEIGHTS");
}
}
newThreatNode
.addOrUpdateValue(toolbox_api.NodeValueImpl(r.key, data));
}
}
}
await _storageController.addOrUpdate(newThreatNode);
}
}
}
}