updateRecommendations method

  1. @override
Future<void> updateRecommendations()
override

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);
      }
    }
  }
}