From 6721b1db6924178ac56031832ea4a3feeb1a62f1 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Wed, 30 Mar 2022 09:43:16 +0200 Subject: [PATCH 01/83] Check if bug exists before executing tasks. Delete bug and libraries in backend if overwrite option is used. --- .../org/eclipse/steady/kb/command/Import.java | 21 +++++++++++++++++++ .../kb/task/ImportAffectedLibraries.java | 4 ++++ .../steady/kb/task/ImportVulnerability.java | 8 +++---- .../steady/backend/BackendConnector.java | 16 ++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index 6aa443c08..f22b199c9 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -115,6 +115,27 @@ private void importVuln(HashMap args, String dirPath) { Import.log.error("Please specify the vulerability id in the json"); return; } + + String vulnId = vuln.getVulnId(); + boolean bugExists = false; + try { + bugExists = BackendConnector.getInstance().isBugExisting(vulnId); + } + catch (BackendConnectionException e) { + log.error("Can't connect to the Backend"); + return; + } + + Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); + if (bugExists) { + if (overwrite) { + args.put(DELETE, true); + } + else { + log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); + return; + } + } List importTasks = TaskProvider.getInstance().getTasks(Command.NAME.IMPORT); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 9a047bb84..0b1a2a564 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -46,6 +46,7 @@ */ public class ImportAffectedLibraries implements Task { private static final String OVERWRITE_OPTION = "o"; + private static final String DELETE = "del"; private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); /** {@inheritDoc} */ @@ -56,6 +57,9 @@ public void execute( if (artifacts == null || artifacts.isEmpty()) { return; } + if ((boolean) args.get(DELETE)) { + backendConnector.deletePatchEvalResults(vuln.getVulnId(), AffectedVersionSource.KAYBEE); + } List affectedLibsToUpsert = new ArrayList(); HashSet ciaArtifactsCache = new HashSet<>(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index afc612fa7..ad7554efe 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -56,6 +56,7 @@ public class ImportVulnerability implements Task { private static final String OVERWRITE_OPTION = "o"; private static final String DIRECTORY_OPTION = "d"; private static final String VERBOSE_OPTION = "v"; + private static final String DELETE = "del"; private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); private BackendConnector backendConnector = null; @@ -67,10 +68,9 @@ public void execute( String vulnId = vuln.getVulnId(); this.backendConnector = _backendConnector; - Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); - if (!overwrite && getBackendConnector().isBugExisting(vulnId)) { - log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); - return; + if ((boolean) args.get(DELETE)) { + backendConnector.deleteBug(vuln.getVulnId()); + log.info(vuln.getVulnId()); } List commits = new ArrayList(); diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index be798a3e2..0671a9746 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -1041,6 +1041,22 @@ public void uploadChangeList(String _bug, String _json) throws BackendConnection req_list.send(); } + /** + *

deleteBug.

+ * + * @param _bugId a {@link java.lang.String} object. + * @throws org.eclipse.steady.backend.BackendConnectionException if any. + */ + public void deleteBug(String _bugId) throws BackendConnectionException { + + final BasicHttpRequest del_req = + new BasicHttpRequest(HttpMethod.DELETE, + PathBuilder.bug(_bugId)); + // payload cannot be empty otherwise request doesn t work + del_req.setPayload("[]", "application/json", true); + del_req.send(); + } + /** *

uploadCheckVersionResults.

* From 1a6297e858674abce05536bf81eb43733cdbf352 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Wed, 30 Mar 2022 15:37:33 +0200 Subject: [PATCH 02/83] Fixed small mistakes --- .../src/main/java/org/eclipse/steady/kb/command/Import.java | 2 ++ .../java/org/eclipse/steady/kb/task/ImportVulnerability.java | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index f22b199c9..3e4d22f4c 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -38,6 +38,7 @@ import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.shared.util.VulasConfiguration; +import org.eclipse.steady.backend.BackendConnectionException; /** * import command @@ -49,6 +50,7 @@ public class Import implements Command { private static final String DIRECTORY_OPTION = "d"; private static final String OVERWRITE_OPTION = "o"; private static final String VERBOSE_OPTION = "v"; + private static final String DELETE = "del"; private static final String UPLOAD_LONG_OPTION = "upload"; private static final String VERBOSE_LONG_OPTION = "verbose"; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index ad7554efe..670cc5102 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -70,7 +70,6 @@ public void execute( if ((boolean) args.get(DELETE)) { backendConnector.deleteBug(vuln.getVulnId()); - log.info(vuln.getVulnId()); } List commits = new ArrayList(); From 94597d5234ce0f09566c4101a576808bc553d923 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Wed, 30 Mar 2022 17:33:50 +0200 Subject: [PATCH 03/83] check if hashmap contains key --- .../org/eclipse/steady/kb/task/ImportAffectedLibraries.java | 2 +- .../java/org/eclipse/steady/kb/task/ImportVulnerability.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 0b1a2a564..9aff36f40 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -57,7 +57,7 @@ public void execute( if (artifacts == null || artifacts.isEmpty()) { return; } - if ((boolean) args.get(DELETE)) { + if (args.containsKey(DELETE) && (boolean) args.get(DELETE)) { backendConnector.deletePatchEvalResults(vuln.getVulnId(), AffectedVersionSource.KAYBEE); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 670cc5102..0fe815553 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -68,8 +68,11 @@ public void execute( String vulnId = vuln.getVulnId(); this.backendConnector = _backendConnector; - if ((boolean) args.get(DELETE)) { + if (args.containsKey(DELETE) && (boolean) args.get(DELETE)) { backendConnector.deleteBug(vuln.getVulnId()); + } else if (backendConnector.isBugExisting(vuln.getVulnId())) { + log.info("Bug [{}] already exists in backend, analysis will be skipped", vuln.getVulnId()); + return; } List commits = new ArrayList(); From 764cef9f8f72cdebf760564c4de5783806446a86 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Tue, 5 Apr 2022 16:30:40 +0200 Subject: [PATCH 04/83] Fixed code style --- java-files.txt | 597 ++++++++++++++++++ .../org/eclipse/steady/kb/command/Import.java | 8 +- .../steady/backend/BackendConnector.java | 3 +- non-compliant-files.txt | 0 4 files changed, 601 insertions(+), 7 deletions(-) create mode 100644 java-files.txt create mode 100644 non-compliant-files.txt diff --git a/java-files.txt b/java-files.txt new file mode 100644 index 000000000..80eb1aadb --- /dev/null +++ b/java-files.txt @@ -0,0 +1,597 @@ +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java +shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java +shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java +shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java +shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java +shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java +shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java +shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java +shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java +shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java +shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java +shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java +shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java +shared/src/main/java/org/eclipse/steady/shared/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java +shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/Constants.java +shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/StringList.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java +shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java +shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java +shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java +shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java +shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java +shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +lang/src/main/java/org/eclipse/steady/ConstructId.java +lang/src/main/java/org/eclipse/steady/ConstructChange.java +lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java +lang/src/main/java/org/eclipse/steady/Construct.java +lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java +lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java +lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java +lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java +lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java +lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +lang/src/main/java/org/eclipse/steady/DirAnalyzer.java +lang/src/main/java/org/eclipse/steady/FileAnalyzer.java +lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java +lang/src/main/java/org/eclipse/steady/FileAnalysisException.java +lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java +lang/src/main/java/org/eclipse/steady/core/util/package-info.java +lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java +lang/src/main/java/org/eclipse/steady/tasks/package-info.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java +lang/src/main/java/org/eclipse/steady/tasks/Task.java +lang/src/main/java/org/eclipse/steady/tasks/BomTask.java +lang/src/main/java/org/eclipse/steady/sign/Signature.java +lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java +lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java +lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java +lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java +lang/src/main/java/org/eclipse/steady/report/Report.java +lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportException.java +lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java +lang/src/main/java/org/eclipse/steady/goals/BomGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/TestGoal.java +lang/src/main/java/org/eclipse/steady/goals/package-info.java +lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java +lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java +lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java +lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java +lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalContext.java +lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java +lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java +lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java +lang-java/src/main/java/org/eclipse/steady/java/PomParser.java +lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java +lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java +lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java +lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java +lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java +lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java +lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java +lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java +lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java +lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/PythonId.java +lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java +lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java +lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java +repo-client/src/main/java/org/eclipse/steady/git/GitClient.java +repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +repo-client/src/main/java/org/eclipse/steady/package-info.java +repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java +repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java +repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java +repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java +repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java +kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java +cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java +cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java +shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java +shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java +shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java +shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java +shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java +shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java +shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java +shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java +shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java +shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java +shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java +shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java +lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java +lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java +lang/src/test/java/org/eclipse/steady/report/ReportTest.java +lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java +lang-java/src/test/java/ClassWithoutPackage.java +lang-java/src/test/java/NestedDeclarationMess.java +lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java +lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java +lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java +lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java +lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java +lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java +lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java +lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java +lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java +lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java +lang-java-reach-soot/src/test/java/SootCallGraphTest.java +lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java +lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java +repo-client/src/test/java/org/eclipse/steady/git/GitTest.java +patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java +patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java +cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java +rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index 3e4d22f4c..b0d5d1531 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -117,13 +117,12 @@ private void importVuln(HashMap args, String dirPath) { Import.log.error("Please specify the vulerability id in the json"); return; } - + String vulnId = vuln.getVulnId(); boolean bugExists = false; try { bugExists = BackendConnector.getInstance().isBugExisting(vulnId); - } - catch (BackendConnectionException e) { + } catch (BackendConnectionException e) { log.error("Can't connect to the Backend"); return; } @@ -132,8 +131,7 @@ private void importVuln(HashMap args, String dirPath) { if (bugExists) { if (overwrite) { args.put(DELETE, true); - } - else { + } else { log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); return; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 0671a9746..fcdf9b5fa 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -1050,8 +1050,7 @@ public void uploadChangeList(String _bug, String _json) throws BackendConnection public void deleteBug(String _bugId) throws BackendConnectionException { final BasicHttpRequest del_req = - new BasicHttpRequest(HttpMethod.DELETE, - PathBuilder.bug(_bugId)); + new BasicHttpRequest(HttpMethod.DELETE, PathBuilder.bug(_bugId)); // payload cannot be empty otherwise request doesn t work del_req.setPayload("[]", "application/json", true); del_req.send(); diff --git a/non-compliant-files.txt b/non-compliant-files.txt new file mode 100644 index 000000000..e69de29bb From 04b50a4b32181094f6c3b61103801d04eba12317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Galv=C3=A3o?= Date: Wed, 6 Apr 2022 14:42:06 +0200 Subject: [PATCH 05/83] Removed files added by accident --- java-files.txt | 597 ---------------------------------------- non-compliant-files.txt | 0 2 files changed, 597 deletions(-) delete mode 100644 java-files.txt delete mode 100644 non-compliant-files.txt diff --git a/java-files.txt b/java-files.txt deleted file mode 100644 index 80eb1aadb..000000000 --- a/java-files.txt +++ /dev/null @@ -1,597 +0,0 @@ -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java -shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java -shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java -shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java -shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java -shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java -shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java -shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java -shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java -shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java -shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java -shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java -shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java -shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java -shared/src/main/java/org/eclipse/steady/shared/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java -shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/Constants.java -shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java -shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/util/StringList.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java -shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java -shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java -shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java -shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java -shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java -shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java -shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java -lang/src/main/java/org/eclipse/steady/ConstructId.java -lang/src/main/java/org/eclipse/steady/ConstructChange.java -lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java -lang/src/main/java/org/eclipse/steady/Construct.java -lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java -lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java -lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java -lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java -lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java -lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java -lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java -lang/src/main/java/org/eclipse/steady/DirAnalyzer.java -lang/src/main/java/org/eclipse/steady/FileAnalyzer.java -lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java -lang/src/main/java/org/eclipse/steady/FileAnalysisException.java -lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java -lang/src/main/java/org/eclipse/steady/core/util/package-info.java -lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java -lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java -lang/src/main/java/org/eclipse/steady/tasks/package-info.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java -lang/src/main/java/org/eclipse/steady/tasks/Task.java -lang/src/main/java/org/eclipse/steady/tasks/BomTask.java -lang/src/main/java/org/eclipse/steady/sign/Signature.java -lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java -lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java -lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java -lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java -lang/src/main/java/org/eclipse/steady/report/Report.java -lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java -lang/src/main/java/org/eclipse/steady/goals/ReportException.java -lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java -lang/src/main/java/org/eclipse/steady/goals/BomGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java -lang/src/main/java/org/eclipse/steady/goals/TestGoal.java -lang/src/main/java/org/eclipse/steady/goals/package-info.java -lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java -lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java -lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java -lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java -lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalContext.java -lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java -lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java -lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java -lang-java/src/main/java/org/eclipse/steady/java/PomParser.java -lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java -lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java -lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java -lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java -lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java -lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java -lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java -lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java -lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java -lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java -lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/PythonId.java -lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java -lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java -lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java -repo-client/src/main/java/org/eclipse/steady/git/GitClient.java -repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java -repo-client/src/main/java/org/eclipse/steady/package-info.java -repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java -repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java -repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java -repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java -repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java -kb-importer/src/main/java/org/eclipse/steady/kb/Main.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java -cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java -cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java -shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java -shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java -shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java -shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java -shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java -shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java -shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java -shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java -shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java -shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java -shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java -lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java -lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java -lang/src/test/java/org/eclipse/steady/report/ReportTest.java -lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java -lang-java/src/test/java/ClassWithoutPackage.java -lang-java/src/test/java/NestedDeclarationMess.java -lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java -lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java -lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java -lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java -lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java -lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java -lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java -lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java -lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java -lang-java-reach-soot/src/test/java/SootCallGraphTest.java -lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java -lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java -repo-client/src/test/java/org/eclipse/steady/git/GitTest.java -patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java -patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java -kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java -rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java diff --git a/non-compliant-files.txt b/non-compliant-files.txt deleted file mode 100644 index e69de29bb..000000000 From e6e3346e22235a2ef3d62115cbe29cbd65f1dbb4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 7 Apr 2022 14:55:06 +0200 Subject: [PATCH 06/83] Removed repeated option variables from Tasks --- .../org/eclipse/steady/kb/command/Import.java | 20 +++++++++---------- .../kb/task/ImportAffectedLibraries.java | 8 ++++---- .../steady/kb/task/ImportVulnerability.java | 13 ++++-------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index b0d5d1531..edd4cbaad 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -46,16 +46,16 @@ public class Import implements Command { private static final String METADATA_JSON = "metadata.json"; - private static final String UPLOAD_CONSTRUCT_OPTION = "u"; - private static final String DIRECTORY_OPTION = "d"; - private static final String OVERWRITE_OPTION = "o"; - private static final String VERBOSE_OPTION = "v"; - private static final String DELETE = "del"; - - private static final String UPLOAD_LONG_OPTION = "upload"; - private static final String VERBOSE_LONG_OPTION = "verbose"; - private static final String OVERWRITE_LONG_OPTION = "overwrite"; - private static final String DIRECTORY_LONG_OPTION = "directory"; + public static final String UPLOAD_CONSTRUCT_OPTION = "u"; + public static final String DIRECTORY_OPTION = "d"; + public static final String OVERWRITE_OPTION = "o"; + public static final String VERBOSE_OPTION = "v"; + public static final String DELETE = "del"; + + public static final String UPLOAD_LONG_OPTION = "upload"; + public static final String VERBOSE_LONG_OPTION = "verbose"; + public static final String OVERWRITE_LONG_OPTION = "overwrite"; + public static final String DIRECTORY_LONG_OPTION = "directory"; private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 9aff36f40..3d471ea8d 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.Logger; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; +import org.eclipse.steady.kb.command.Import; import org.eclipse.steady.kb.command.Command; import org.eclipse.steady.kb.model.Artifact; import org.eclipse.steady.kb.model.Vulnerability; @@ -45,8 +46,7 @@ *

*/ public class ImportAffectedLibraries implements Task { - private static final String OVERWRITE_OPTION = "o"; - private static final String DELETE = "del"; + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); /** {@inheritDoc} */ @@ -57,7 +57,7 @@ public void execute( if (artifacts == null || artifacts.isEmpty()) { return; } - if (args.containsKey(DELETE) && (boolean) args.get(DELETE)) { + if (args.containsKey(Import.DELETE) && (boolean) args.get(Import.DELETE)) { backendConnector.deletePatchEvalResults(vuln.getVulnId(), AffectedVersionSource.KAYBEE); } @@ -75,7 +75,7 @@ public void execute( vuln.getVulnId(), purlGroup, purlArtifact, purlVersion, AffectedVersionSource.KAYBEE); if (affectedLibs != null && affectedLibs.length > 0) { AffectedLibrary affectedLibrary = affectedLibs[0]; - Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); + Boolean overwrite = (Boolean) args.get(Import.OVERWRITE_OPTION); if (overwrite || affectedLibrary.getAffected() == null) { setAfftectedLib(artifact, affectedLibrary); affectedLibsToUpsert.add(affectedLibrary); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 0fe815553..a2474d5b5 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -38,6 +38,7 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; import org.eclipse.steady.kb.command.Command; +import org.eclipse.steady.kb.command.Import; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Note; import org.eclipse.steady.kb.model.Vulnerability; @@ -53,10 +54,6 @@ *

ImportVulnerability class.

*/ public class ImportVulnerability implements Task { - private static final String OVERWRITE_OPTION = "o"; - private static final String DIRECTORY_OPTION = "d"; - private static final String VERBOSE_OPTION = "v"; - private static final String DELETE = "del"; private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); private BackendConnector backendConnector = null; @@ -68,15 +65,13 @@ public void execute( String vulnId = vuln.getVulnId(); this.backendConnector = _backendConnector; - if (args.containsKey(DELETE) && (boolean) args.get(DELETE)) { - backendConnector.deleteBug(vuln.getVulnId()); - } else if (backendConnector.isBugExisting(vuln.getVulnId())) { + if (backendConnector.isBugExisting(vuln.getVulnId())) { log.info("Bug [{}] already exists in backend, analysis will be skipped", vuln.getVulnId()); return; } List commits = new ArrayList(); - File file = new File((String) args.get(DIRECTORY_OPTION)); + File file = new File((String) args.get(Import.DIRECTORY_OPTION)); File commitDirs[] = file.listFiles( @@ -101,7 +96,7 @@ public boolean accept(File file) { Map> allChanges = new HashMap>(); for (Commit commit : commits) { changes = ConstructSet.identifyConstructChanges(commit, allChanges); - if ((Boolean) args.get(VERBOSE_OPTION)) { + if ((Boolean) args.get(Import.VERBOSE_OPTION)) { for (ConstructChange chg : changes) { log.info(chg.toString()); } From bbd4116cdde426a877675bdc307a941b90b61bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Galv=C3=A3o?= Date: Fri, 8 Apr 2022 11:20:12 +0200 Subject: [PATCH 07/83] Removed skip condition in ImportVulnerability and changed tests accordingly --- .../org/eclipse/steady/kb/command/Import.java | 14 ++++++++-- .../steady/kb/task/ImportVulnerability.java | 5 ---- .../eclipse/steady/kb/command/ImportTest.java | 26 +++++++++++++++++++ .../kb/task/TestImportVulnerability.java | 14 ---------- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index edd4cbaad..0be2973ed 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -59,6 +59,16 @@ public class Import implements Command { private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private BackendConnector backendConnector; + + public Import() { + this.backendConnector = BackendConnector.getInstance(); + } + + public Import(BackendConnector backendConnector) { + this.backendConnector = backendConnector; + } + /** {@inheritDoc} */ @Override public Command.NAME getCommandName() { @@ -121,7 +131,7 @@ private void importVuln(HashMap args, String dirPath) { String vulnId = vuln.getVulnId(); boolean bugExists = false; try { - bugExists = BackendConnector.getInstance().isBugExisting(vulnId); + bugExists = this.backendConnector.isBugExisting(vulnId); } catch (BackendConnectionException e) { log.error("Can't connect to the Backend"); return; @@ -142,7 +152,7 @@ private void importVuln(HashMap args, String dirPath) { for (Task task : importTasks) { try { args.put(DIRECTORY_OPTION, dirPath); - task.execute(vuln, args, BackendConnector.getInstance()); + task.execute(vuln, args, backendConnector); } catch (Exception e) { log.error( "Got [" diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index a2474d5b5..34b2aa366 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -65,11 +65,6 @@ public void execute( String vulnId = vuln.getVulnId(); this.backendConnector = _backendConnector; - if (backendConnector.isBugExisting(vuln.getVulnId())) { - log.info("Bug [{}] already exists in backend, analysis will be skipped", vuln.getVulnId()); - return; - } - List commits = new ArrayList(); File file = new File((String) args.get(Import.DIRECTORY_OPTION)); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java index 5146fbcf1..0ab7d056b 100755 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java @@ -17,12 +17,23 @@ * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors */ package org.eclipse.steady.kb.command; +import org.eclipse.steady.kb.task.MockBackConnector; +import org.eclipse.steady.shared.json.model.AffectedLibrary; +import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.util.Metadata; +import com.fasterxml.jackson.databind.ObjectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; import java.util.HashMap; +import java.util.List; import org.apache.commons.cli.Options; + +import java.io.IOException; import org.eclipse.steady.kb.exception.ValidationException; +import com.google.gson.JsonSyntaxException; +import org.eclipse.steady.backend.BackendConnectionException; import org.junit.Test; public class ImportTest { @@ -52,4 +63,19 @@ public void validationFail() throws ValidationException { args.put("d", "invalidDir"); command.validate(args); } + + @Test + public void testImportSkipExistingBug() + throws JsonSyntaxException, IOException, BackendConnectionException { + Vulnerability vuln = new Vulnerability(); + vuln.setVulnId("CVE-TEST01"); + MockBackConnector mockBackendConnector = new MockBackConnector(); + HashMap args = new HashMap(); + args.put("o", false); + args.put("v", false); + Import command = new Import(mockBackendConnector); + command.run(args); + assertNull(mockBackendConnector.getUploadJson()); + } + } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java index 0bae728f7..30b7d2c71 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java @@ -58,20 +58,6 @@ public void testImportVuln() throws JsonSyntaxException, IOException, BackendCon assertNotNull(bug.getDescription()); } - @Test - public void testImportVulnSkipExistingBug() - throws JsonSyntaxException, IOException, BackendConnectionException { - Vulnerability vuln = new Vulnerability(); - vuln.setVulnId("CVE-TEST01"); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("o", false); - args.put("v", false); - ImportVulnerability importVuln = new ImportVulnerability(); - importVuln.execute(vuln, args, mockBackendConnector); - assertNull(mockBackendConnector.getUploadJson()); - } - @AfterClass public static void cleanup() { try { From c0ea5081ffae02d5547910b23fe44b26890070b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Galv=C3=A3o?= Date: Fri, 8 Apr 2022 11:37:56 +0200 Subject: [PATCH 08/83] Fixed code style --- java-files.txt | 597 ++++++++++++++++++ .../eclipse/steady/kb/command/ImportTest.java | 6 +- .../kb/task/TestImportVulnerability.java | 1 - non-compliant-files.txt | 2 + pom.xml | 2 +- 5 files changed, 601 insertions(+), 7 deletions(-) create mode 100644 java-files.txt create mode 100644 non-compliant-files.txt diff --git a/java-files.txt b/java-files.txt new file mode 100644 index 000000000..f1657c7d3 --- /dev/null +++ b/java-files.txt @@ -0,0 +1,597 @@ +shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java +shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java +shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java +shared/src/main/java/org/eclipse/steady/shared/util/Constants.java +shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/StringList.java +shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java +shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java +shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java +shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java +shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java +shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java +shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java +shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java +shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java +shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java +shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java +shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java +shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java +shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java +shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java +shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java +shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java +shared/src/main/java/org/eclipse/steady/shared/package-info.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java +lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java +lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java +lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +lang/src/main/java/org/eclipse/steady/core/util/package-info.java +lang/src/main/java/org/eclipse/steady/ConstructId.java +lang/src/main/java/org/eclipse/steady/Construct.java +lang/src/main/java/org/eclipse/steady/report/Report.java +lang/src/main/java/org/eclipse/steady/FileAnalysisException.java +lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java +lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java +lang/src/main/java/org/eclipse/steady/goals/TestGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportException.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java +lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/BomGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java +lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java +lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java +lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java +lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java +lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalContext.java +lang/src/main/java/org/eclipse/steady/goals/package-info.java +lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java +lang/src/main/java/org/eclipse/steady/ConstructChange.java +lang/src/main/java/org/eclipse/steady/DirAnalyzer.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java +lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java +lang/src/main/java/org/eclipse/steady/tasks/Task.java +lang/src/main/java/org/eclipse/steady/tasks/package-info.java +lang/src/main/java/org/eclipse/steady/tasks/BomTask.java +lang/src/main/java/org/eclipse/steady/FileAnalyzer.java +lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java +lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java +lang/src/main/java/org/eclipse/steady/sign/Signature.java +lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java +lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java +lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java +lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java +lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java +lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java +lang-java/src/main/java/org/eclipse/steady/java/JavaId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java +lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java +lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java +lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java +lang-java/src/main/java/org/eclipse/steady/java/PomParser.java +lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java +lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java +lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java +lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java +lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java +lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java +lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java +lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java +lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java +lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java +lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/PythonId.java +lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java +lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java +lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java +repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java +repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +repo-client/src/main/java/org/eclipse/steady/git/GitClient.java +repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java +repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java +repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java +repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java +repo-client/src/main/java/org/eclipse/steady/package-info.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java +kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java +cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java +cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java +rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java +shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java +shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java +shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java +shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java +shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java +shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java +shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java +shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java +shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java +shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java +shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java +shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java +lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java +lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java +lang/src/test/java/org/eclipse/steady/report/ReportTest.java +lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java +lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java +lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java +lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java +lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java +lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java +lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java +lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java +lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java +lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java +lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java +lang-java/src/test/java/ClassWithoutPackage.java +lang-java/src/test/java/NestedDeclarationMess.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java +lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java +lang-java-reach-soot/src/test/java/SootCallGraphTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java +lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java +lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java +repo-client/src/test/java/org/eclipse/steady/git/GitTest.java +patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java +patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java +kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java +rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java index 0ab7d056b..c13b47714 100755 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java @@ -17,17 +17,14 @@ * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors */ package org.eclipse.steady.kb.command; + import org.eclipse.steady.kb.task.MockBackConnector; -import org.eclipse.steady.shared.json.model.AffectedLibrary; import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.util.Metadata; -import com.fasterxml.jackson.databind.ObjectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; import java.util.HashMap; -import java.util.List; import org.apache.commons.cli.Options; import java.io.IOException; @@ -77,5 +74,4 @@ public void testImportSkipExistingBug() command.run(args); assertNull(mockBackendConnector.getUploadJson()); } - } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java index 30b7d2c71..eeb403b51 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java @@ -2,7 +2,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import java.io.File; import java.io.IOException; import java.util.HashMap; diff --git a/non-compliant-files.txt b/non-compliant-files.txt new file mode 100644 index 000000000..9de491499 --- /dev/null +++ b/non-compliant-files.txt @@ -0,0 +1,2 @@ +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java diff --git a/pom.xml b/pom.xml index 7edf8ceba..cd99d756e 100755 --- a/pom.xml +++ b/pom.xml @@ -152,7 +152,7 @@ lang-java-reach lang-java-reach-wala lang-java-reach-soot - lang-python + repo-client From 3d83e6c3dacb858d1757e9724790d4fec0ff0847 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Tue, 12 Apr 2022 17:30:21 +0200 Subject: [PATCH 09/83] Created Manager and added function to extract tar (still have some errors) --- java-files.txt | 842 +++++++++--------- kb-importer/pom.xml | 10 + .../eclipse/steady/kb/ImporterController.java | 9 + .../main/java/org/eclipse/steady/kb/Main.java | 5 +- .../java/org/eclipse/steady/kb/Manager.java | 40 + .../org/eclipse/steady/kb/command/Import.java | 50 +- .../org/eclipse/steady/kb/util/Metadata.java | 60 +- non-compliant-files.txt | 2 - pom.xml | 5 + 9 files changed, 594 insertions(+), 429 deletions(-) create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java delete mode 100644 non-compliant-files.txt diff --git a/java-files.txt b/java-files.txt index f1657c7d3..62e009aa2 100644 --- a/java-files.txt +++ b/java-files.txt @@ -1,597 +1,599 @@ +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java +shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java +shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java +shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java +shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java +shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java +shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java +shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java +shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java +shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java -shared/src/main/java/org/eclipse/steady/shared/util/Constants.java -shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StringList.java -shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/Constants.java +shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java -shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java -shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java -shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java -shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java -shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java -shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java -shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java -shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java -shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java -shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java -shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java +shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/StringList.java shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java -shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java -shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java -shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java +shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java +shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java +shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java -shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java -shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java -shared/src/main/java/org/eclipse/steady/shared/package-info.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java +shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +lang/src/main/java/org/eclipse/steady/ConstructId.java +lang/src/main/java/org/eclipse/steady/ConstructChange.java lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java +lang/src/main/java/org/eclipse/steady/Construct.java +lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java +lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java +lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java +lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java +lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java +lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +lang/src/main/java/org/eclipse/steady/DirAnalyzer.java +lang/src/main/java/org/eclipse/steady/FileAnalyzer.java +lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java +lang/src/main/java/org/eclipse/steady/FileAnalysisException.java lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java -lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java lang/src/main/java/org/eclipse/steady/core/util/package-info.java -lang/src/main/java/org/eclipse/steady/ConstructId.java -lang/src/main/java/org/eclipse/steady/Construct.java +lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java +lang/src/main/java/org/eclipse/steady/tasks/package-info.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java +lang/src/main/java/org/eclipse/steady/tasks/Task.java +lang/src/main/java/org/eclipse/steady/tasks/BomTask.java +lang/src/main/java/org/eclipse/steady/sign/Signature.java +lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java +lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java +lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java +lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java lang/src/main/java/org/eclipse/steady/report/Report.java -lang/src/main/java/org/eclipse/steady/FileAnalysisException.java -lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java +lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java -lang/src/main/java/org/eclipse/steady/goals/TestGoal.java lang/src/main/java/org/eclipse/steady/goals/ReportException.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java lang/src/main/java/org/eclipse/steady/goals/BomGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/TestGoal.java +lang/src/main/java/org/eclipse/steady/goals/package-info.java +lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java -lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java -lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java -lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java lang/src/main/java/org/eclipse/steady/goals/GoalContext.java -lang/src/main/java/org/eclipse/steady/goals/package-info.java -lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java -lang/src/main/java/org/eclipse/steady/ConstructChange.java -lang/src/main/java/org/eclipse/steady/DirAnalyzer.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java -lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java -lang/src/main/java/org/eclipse/steady/tasks/Task.java -lang/src/main/java/org/eclipse/steady/tasks/package-info.java -lang/src/main/java/org/eclipse/steady/tasks/BomTask.java -lang/src/main/java/org/eclipse/steady/FileAnalyzer.java -lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java -lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java -lang/src/main/java/org/eclipse/steady/sign/Signature.java -lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java -lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java -lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java -lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java -lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java -lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java -lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java -lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java -lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java -lang-java/src/main/java/org/eclipse/steady/java/JavaId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java -lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java -lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java +lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java +lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java -lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java lang-java/src/main/java/org/eclipse/steady/java/PomParser.java -lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java -lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java -lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java +lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java +lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java +lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java -lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java -lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java +lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java +lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java -lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java -lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java -lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java -lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java +lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java +lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java +lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java +lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java -lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/PythonId.java +lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java +lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java -lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java -repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java -repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java +lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java repo-client/src/main/java/org/eclipse/steady/git/GitClient.java +repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +repo-client/src/main/java/org/eclipse/steady/package-info.java +repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java -repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java -repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java -repo-client/src/main/java/org/eclipse/steady/package-info.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java +repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java +repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java +kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java +kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java -kb-importer/src/main/java/org/eclipse/steady/kb/Main.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java -cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java +kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java +cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java -rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java +shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java -shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java -shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java -shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java -shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java -shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java -shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java -shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java -shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java +shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java +shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java +shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java +shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java lang/src/test/java/org/eclipse/steady/report/ReportTest.java -lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java -lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java -lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java -lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java -lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java -lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java -lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java +lang-java/src/test/java/ClassWithoutPackage.java +lang-java/src/test/java/NestedDeclarationMess.java lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java +lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java -lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java +lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java -lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java -lang-java/src/test/java/ClassWithoutPackage.java -lang-java/src/test/java/NestedDeclarationMess.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java +lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java +lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java +lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java +lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java +lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java lang-java-reach-soot/src/test/java/SootCallGraphTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java repo-client/src/test/java/org/eclipse/steady/git/GitTest.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java -kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java -kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index a6e75974e..2d528a286 100755 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -35,6 +35,16 @@ + + com.fasterxml.jackson.core + jackson-core + 2.9.10 + + + org.yaml + snakeyaml + 1.30 + commons-cli commons-cli diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java new file mode 100644 index 000000000..5402d67f7 --- /dev/null +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -0,0 +1,9 @@ +// import org.springframework.web.bind.annotation.RestController; + +// @RestController +class ImporterController { + + public void start() { + return; + } +} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index d893300a6..ca5a62d46 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -18,7 +18,6 @@ */ package org.eclipse.steady.kb; -import org.eclipse.steady.kb.command.CommandExecutor; /** *

Main class.

@@ -30,6 +29,8 @@ public class Main { * @param _args an array of {@link java.lang.String} objects */ public static void main(String[] _args) { - CommandExecutor.getInstance().execute(_args); + // CommandExecutor.getInstance().execute(_args); + Manager manager = new Manager(); + manager.start("/kb-importer/data/statements"); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java new file mode 100644 index 000000000..ffbf305d6 --- /dev/null +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -0,0 +1,40 @@ +package org.eclipse.steady.kb; + +import java.util.Map; +import java.util.HashMap; + +import java.io.File; + +import org.eclipse.steady.kb.command.Import; + +class Manager { + + // private ThreadPoolExecutor ....; + private Map runningProcesses = new HashMap(); // Lock ? + + public void start(String statementsPath) { + + File statementsDir = new File(statementsPath); + System.out.println(statementsDir); + File[] subdirs = statementsDir.listFiles(); + System.out.println(subdirs); + + HashMap args = new HashMap(); + args.put("o", false); + args.put("v", false); + for (File dir : subdirs) { + if (dir.isDirectory()) { + String dirPath = dir.getPath(); + args.put(Import.DIRECTORY_OPTION, dirPath); + Import command = new Import(); + command.run(args); + } + } + } + + + /*public String status() { + return ""; + }*/ + +} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index 0be2973ed..48eaa8088 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -46,6 +46,7 @@ public class Import implements Command { private static final String METADATA_JSON = "metadata.json"; + private static final String STATEMENT_YAML = "statement.yaml"; public static final String UPLOAD_CONSTRUCT_OPTION = "u"; public static final String DIRECTORY_OPTION = "d"; public static final String OVERWRITE_OPTION = "o"; @@ -89,7 +90,7 @@ public void run(HashMap args) { ? CoreConfiguration.ConnectType.READ_WRITE.toString() : CoreConfiguration.ConnectType.READ_ONLY.toString())); - if (FileUtil.isAccessibleFile(dirPath + File.separator + METADATA_JSON)) { + if (FileUtil.isAccessibleFile(dirPath + File.separator + STATEMENT_YAML)) { importVuln(args, dirPath); } else if (FileUtil.isAccessibleDirectory(dirPath)) { File directory = new File(dirPath); @@ -98,11 +99,12 @@ public void run(HashMap args) { for (File file : fList) { if (file.isDirectory()) { if (FileUtil.isAccessibleFile( - file.getAbsolutePath() + File.separator + METADATA_JSON)) { + file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { importVuln(args, file.getAbsolutePath()); } else { Import.log.warn( - "Skipping {} as the directory does not contain metdata.json file", + "Skipping {} as the directory does not contain statement.yaml or metdata.json" + + " file", file.getAbsolutePath()); } } @@ -117,7 +119,8 @@ public void run(HashMap args) { private void importVuln(HashMap args, String dirPath) { Vulnerability vuln = null; try { - vuln = Metadata.getVulnerabilityMetadata(dirPath); + // vuln = Metadata.getVulnerabilityMetadata(dirPath); + vuln = Metadata.getFromYaml(dirPath + File.separator + STATEMENT_YAML); } catch (JsonSyntaxException | IOException e1) { Import.log.error(e1.getMessage(), e1); return; @@ -196,4 +199,43 @@ public void validate(HashMap args) throws ValidationException { throw new ValidationException("directory " + dir + "does not exist"); } } + + public void extractOrClone(File dir) { + String dirPath = dir.getPath(); + // String cmd = "cd " + dirPath + "; ls"; + File tarFile = null; + // System.out.println(dirPath); + File[] cveFiles = dir.listFiles(); + for (File cveFile : cveFiles) { + String filename = cveFile.getName(); + System.out.println(filename); + String[] splitted = filename.split("[.]"); + if (splitted.length == 0) { + continue; + } + String extension = splitted[splitted.length - 1]; + if (extension.equals("tar") + || (splitted.length > 2 && splitted[splitted.length - 2].equals("tar"))) { + System.out.println("tar file found"); + tarFile = cveFile; + } + } + + if (tarFile != null) { + System.out.println("tarFile != null"); + String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; + try { + System.out.println("before exec"); + Process process = Runtime.getRuntime().exec(extractCommand); + System.out.println("after exec"); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println("tarFile == null"); + // How can I get the repo_url, commit_id and branch? + // String gitCloneCommand = "git clone " + tarFile.getPath() + " --directory " + dirPath; + // for F in $(git -C $repo_dir diff --name-only $commit_id^..$commit_id) + } + } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 2b0ed8c92..2b4f56483 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -20,15 +20,27 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.Files; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; +import org.yaml.snakeyaml.Yaml; + import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.Logger; +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.shared.util.FileUtil; +import org.eclipse.steady.kb.model.Note; +import org.eclipse.steady.kb.model.Artifact; /** * Metadata @@ -94,4 +106,50 @@ public static Vulnerability getVulnerabilityMetadata(String rootDir) return metadata; } + + public static Vulnerability getFromYaml(String metadataPathString) throws IOException { + // Yaml yaml = new Yaml(new Constructor(Vulnerability.class)); + Path metadataPath = Paths.get(metadataPathString); + Yaml yaml = new Yaml(); + + + // String metadataString = File.readString(dirPath + "/metadata.yaml"); + String metadataString = new String(Files.readAllBytes(metadataPath)); + + // Vulnerability vulnerability = yaml.load(metadataString); + Map vulnerabilityMap = yaml.load(metadataString); + // ObjectMapper objectMapper = new ObjectMapper(); + // Vulnerability vulnerability = objectMapper.convertValue(vulnerabilityMap, + // Vulnerability.class); + + Vulnerability vulnerability = new Vulnerability(); + + vulnerability.setVulnId((String) vulnerabilityMap.get("vulnerability_id")); + + List> notesMaps = + (List>) vulnerabilityMap.get("notes"); + List notes = new ArrayList(); + for (HashMap noteMap : notesMaps) { + Note note = new Note(); + note.setText((String) noteMap.get("text")); + List links = (List) noteMap.get("links"); + note.setLinks(links); + notes.add(note); + } + vulnerability.setNotes(notes); + + List> artifactsMaps = + (List>) vulnerabilityMap.get("artifacts"); + List artifacts = new ArrayList(); + for (HashMap artifactMap : artifactsMaps) { + Artifact artifact = new Artifact(); + artifact.setId((String) artifactMap.get("id")); + artifact.setReason((String)artifactMap.get("reason")); + artifact.setAffected((Boolean)artifactMap.get("affected")); + artifacts.add(artifact); + } + vulnerability.setArtifacts(artifacts); + + return vulnerability; + } } diff --git a/non-compliant-files.txt b/non-compliant-files.txt deleted file mode 100644 index 9de491499..000000000 --- a/non-compliant-files.txt +++ /dev/null @@ -1,2 +0,0 @@ -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java diff --git a/pom.xml b/pom.xml index cd99d756e..fe6f9c4d6 100755 --- a/pom.xml +++ b/pom.xml @@ -276,6 +276,11 @@ + + org.yaml + snakeyaml + 1.30 + javax.validation validation-api From e0dcbffd8f0c01f6c7e2a6260e89c6eace5cc6ca Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Wed, 13 Apr 2022 17:11:39 +0200 Subject: [PATCH 10/83] fixed some problems. still not working --- .../main/java/org/eclipse/steady/kb/Main.java | 32 ++++++++++++++++++- .../java/org/eclipse/steady/kb/Manager.java | 13 ++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index ca5a62d46..a8f255532 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -18,6 +18,13 @@ */ package org.eclipse.steady.kb; +import java.util.HashMap; +import org.apache.commons.cli.Options; + +import org.eclipse.steady.kb.command.Import; +import org.eclipse.steady.kb.command.Command; +import org.eclipse.steady.kb.command.CommandParser; +import org.eclipse.steady.kb.exception.CommandLineParserException; /** *

Main class.

@@ -30,7 +37,30 @@ public class Main { */ public static void main(String[] _args) { // CommandExecutor.getInstance().execute(_args); + + Command command = new Import(); + Options commandOptions = command.getOptions(); + + HashMap mapCommandOptionValues ; + try { + mapCommandOptionValues = CommandParser.parse(_args, commandOptions); + } catch (CommandLineParserException e) { + System.out.println("commandLineParserException"); + //log.error(e.getMessage()); + //printHelp(commandOptions); + return; + } + mapCommandOptionValues.put(Import.DIRECTORY_OPTION, "/kb-importer/data"); + + /*try { + command.validate(mapCommandOptionValues); + } catch (ValidationException e) { + log.error(e.getMessage()); + return; + }*/ + + command.run(mapCommandOptionValues); Manager manager = new Manager(); - manager.start("/kb-importer/data/statements"); + manager.start("/kb-importer/data/statements", mapCommandOptionValues); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index ffbf305d6..4a46f06e4 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -6,28 +6,29 @@ import java.io.File; import org.eclipse.steady.kb.command.Import; +import org.eclipse.steady.kb.command.Command; class Manager { // private ThreadPoolExecutor ....; private Map runningProcesses = new HashMap(); // Lock ? - public void start(String statementsPath) { + public void start(String statementsPath, + HashMap mapCommandOptionValues) { File statementsDir = new File(statementsPath); System.out.println(statementsDir); File[] subdirs = statementsDir.listFiles(); System.out.println(subdirs); - HashMap args = new HashMap(); - args.put("o", false); - args.put("v", false); for (File dir : subdirs) { if (dir.isDirectory()) { String dirPath = dir.getPath(); - args.put(Import.DIRECTORY_OPTION, dirPath); + mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); + System.out.println("mapCommandOptionValues"); + System.out.println(mapCommandOptionValues); Import command = new Import(); - command.run(args); + command.run(mapCommandOptionValues); } } } From 8247b13408116b6ada22ac9dcea8a64663c11d5d Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Fri, 15 Apr 2022 17:29:18 +0200 Subject: [PATCH 11/83] Changing architecture (contains errors) --- java-files.txt | 1 + .../java/org/eclipse/steady/kb/Import.java | 91 +++++++++++++++++++ .../main/java/org/eclipse/steady/kb/Main.java | 23 ----- .../java/org/eclipse/steady/kb/Manager.java | 66 +++++++++----- .../org/eclipse/steady/kb/command/Import.java | 73 ++++++++++++--- .../steady/kb/model/Vulnerability.java | 10 ++ .../org/eclipse/steady/kb/util/Metadata.java | 72 ++++++++++----- 7 files changed, 256 insertions(+), 80 deletions(-) create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/Import.java diff --git a/java-files.txt b/java-files.txt index 62e009aa2..23a78b27a 100644 --- a/java-files.txt +++ b/java-files.txt @@ -315,6 +315,7 @@ kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java +kb-importer/src/main/java/org/eclipse/steady/kb/Import.java kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java new file mode 100644 index 000000000..a46bb391e --- /dev/null +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -0,0 +1,91 @@ + + +class Import implements Runnable { + + private static final SOURCE_TAR = "changed-source-code.tar.gz" + private static final STATEMENT_YAML = "statement.yaml" + + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + + private BackendConnector backendConnector; + + public Import(Path vulnDir) { + this.vulnDir = vulnDir; + } + + @Override + public void run() { + + /* How to pass the argumens? + set configuration in the manager instead? + Object uploadConstruct = args.get(UPLOAD_CONSTRUCT_OPTION); + VulasConfiguration.getGlobal() + .setProperty( + CoreConfiguration.BACKEND_CONNECT, + (uploadConstruct != null + ? CoreConfiguration.ConnectType.READ_WRITE.toString() + : CoreConfiguration.ConnectType.READ_ONLY.toString()));*/ + + Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); + if (bugExists) { + if (overwrite) { + args.put(DELETE, true); + } else { + log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); + return; + } + } + Path statementPath = findStatementPath(); + if (statementPath != null) { + Vulnerability vuln = Metadata.getFromYaml(statementPath); + + ExtractOrClone extractOrClone = new ExtractOrClone(this.vulnDir, args); + ImportVulnerability importVulnerability = new ImportVulnerability(vuln, args); + ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(vuln, args); + + extractOrClone.execute(); + importVulnerability.execute(); + importAffectedLibraries.execute(); + } + + + } + + public Path findTarPath() { + if (FileUtil.isAccessibleFile(vulnDir + File.separator + SOURCE_TAR)) { + return vulnDir + File.separator + SOURCE_TAR; + } + } + + public Path findStatementPath() { + // TODO: Should also check for metadata.json? + // Review this function + if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { + return vulnDir + File.separator + STATEMENT_YAML; + } + /* Since there is one Import task per vulnerability, there is no need to loop over subdirectories + else if (FileUtil.isAccessibleDirectory(vulnDir)) { + File directory = new File(vulnDir); + File[] fList = directory.listFiles(); + if (fList != null) { + for (File file : fList) { + if (file.isDirectory()) { + if (FileUtil.isAccessibleFile( + file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { + return file.getAbsolutePath() + File.separator + STATEMENT_YAML; + } else { + Import.log.warn( + "Skipping {} as the directory does not contain statement.yaml" + + " file", + file.getAbsolutePath()); + } + } + } + } + }*/ + else { + Import.log.error("Invalid directory {}", vulnDir); + } + return null; + } +} \ No newline at end of file diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index a8f255532..9164de6e7 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -36,29 +36,6 @@ public class Main { * @param _args an array of {@link java.lang.String} objects */ public static void main(String[] _args) { - // CommandExecutor.getInstance().execute(_args); - - Command command = new Import(); - Options commandOptions = command.getOptions(); - - HashMap mapCommandOptionValues ; - try { - mapCommandOptionValues = CommandParser.parse(_args, commandOptions); - } catch (CommandLineParserException e) { - System.out.println("commandLineParserException"); - //log.error(e.getMessage()); - //printHelp(commandOptions); - return; - } - mapCommandOptionValues.put(Import.DIRECTORY_OPTION, "/kb-importer/data"); - - /*try { - command.validate(mapCommandOptionValues); - } catch (ValidationException e) { - log.error(e.getMessage()); - return; - }*/ - command.run(mapCommandOptionValues); Manager manager = new Manager(); manager.start("/kb-importer/data/statements", mapCommandOptionValues); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 4a46f06e4..86331a82e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -5,34 +5,56 @@ import java.io.File; -import org.eclipse.steady.kb.command.Import; +import org.eclipse.steady.kb.Import; import org.eclipse.steady.kb.command.Command; class Manager { - // private ThreadPoolExecutor ....; - private Map runningProcesses = new HashMap(); // Lock ? - - public void start(String statementsPath, - HashMap mapCommandOptionValues) { - - File statementsDir = new File(statementsPath); - System.out.println(statementsDir); - File[] subdirs = statementsDir.listFiles(); - System.out.println(subdirs); - - for (File dir : subdirs) { - if (dir.isDirectory()) { - String dirPath = dir.getPath(); - mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); - System.out.println("mapCommandOptionValues"); - System.out.println(mapCommandOptionValues); - Import command = new Import(); - command.run(mapCommandOptionValues); - } + private ThreadPoolExecutor executor = + (ThreadPoolExecutor) Executors.newCachedThreadPool(); + + enum VulnStatus { + NOT_STARTED, + PROCESSING, + IMPORTED, + FAILED } - } + + private Map vulnerabilitiesStatus = new HashMap(); + + public void start(String statementsPath, + HashMap mapCommandOptionValues) { + + File statementsDir = new File(statementsPath); + File[] subdirs = statementsDir.listFiles(); + + setUploadConfiguration(mapCommandOptionValues); + + for (File dir : subdirs) { + if (dir.isDirectory(){ + vulnerabilitiesStatus.put(dir.getName(), VulnStatus.NOT_STARTED); + } + } + for (File dir : vulnerabilitiesStatus.keySet()){ + //synchronized (vulnerabilitiesStatus.get(dir.getName())) { + String dirPath = dir.getPath(); + mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); + Import import = new Import(mapCommandOptionValues); + executor.execute(import); + //} + } + } + + private void setUploadConfiguration() { + Object uploadConstruct = args.get(UPLOAD_CONSTRUCT_OPTION); + VulasConfiguration.getGlobal() + .setProperty( + CoreConfiguration.BACKEND_CONNECT, + (uploadConstruct != null + ? CoreConfiguration.ConnectType.READ_WRITE.toString() + : CoreConfiguration.ConnectType.READ_ONLY.toString())); + } /*public String status() { return ""; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index 48eaa8088..a0ed2523a 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -22,9 +22,13 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.nio.file.Path; import java.util.HashMap; +import java.util.Map; import java.util.List; +import java.util.ArrayList; +import org.yaml.snakeyaml.Yaml; import com.google.gson.JsonSyntaxException; import org.apache.commons.cli.Options; @@ -33,6 +37,7 @@ import org.eclipse.steady.core.util.CoreConfiguration; import org.eclipse.steady.kb.exception.ValidationException; import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.task.Task; import org.eclipse.steady.kb.task.TaskProvider; import org.eclipse.steady.kb.util.Metadata; @@ -99,11 +104,11 @@ public void run(HashMap args) { for (File file : fList) { if (file.isDirectory()) { if (FileUtil.isAccessibleFile( - file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { + file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { importVuln(args, file.getAbsolutePath()); } else { Import.log.warn( - "Skipping {} as the directory does not contain statement.yaml or metdata.json" + "Skipping {} as the directory does not contain statement.yaml or metadata.json" + " file", file.getAbsolutePath()); } @@ -120,7 +125,11 @@ private void importVuln(HashMap args, String dirPath) { Vulnerability vuln = null; try { // vuln = Metadata.getVulnerabilityMetadata(dirPath); - vuln = Metadata.getFromYaml(dirPath + File.separator + STATEMENT_YAML); + vuln = + Metadata.getFromYaml( + dirPath + File.separator + STATEMENT_YAML); // this could be skipped in some cases + System.out.println("Vulnerability from YAML"); + System.out.println(vuln); } catch (JsonSyntaxException | IOException e1) { Import.log.error(e1.getMessage(), e1); return; @@ -150,6 +159,36 @@ private void importVuln(HashMap args, String dirPath) { } } + Yaml yaml = new Yaml(); + Path metadataPath = Paths.get(dirPath + File.separator + STATEMENT_YAML); + String metadataString; + try { + metadataString = new String(Files.readAllBytes(metadataPath)); + } catch (IOException e) { + e.printStackTrace(); + return; + } + Map vulnerabilityMap = yaml.load(metadataString); + List> fixes = + (List>) vulnerabilityMap.get("fixes"); + List commitList = new ArrayList(); + if (fixes != null) { + for (HashMap fix : fixes) { + String branch = (String) fix.get("id"); + List> commits = (List>) fix.get("commits"); + for (HashMap commitMap : commits) { + Commit commit = new Commit(); + String repository = commitMap.get("repository"); + String commitId = commitMap.get("id"); + commit.setRepoUrl(repository); + commit.setCommitId(commitId); + commit.setBranch(branch); + commitList.add(commit); + } + } + } + this.extractOrClone(new File(dirPath), commitList); + List importTasks = TaskProvider.getInstance().getTasks(Command.NAME.IMPORT); for (Task task : importTasks) { @@ -200,15 +239,12 @@ public void validate(HashMap args) throws ValidationException { } } - public void extractOrClone(File dir) { + public void extractOrClone(File dir, List commits) { String dirPath = dir.getPath(); - // String cmd = "cd " + dirPath + "; ls"; File tarFile = null; - // System.out.println(dirPath); File[] cveFiles = dir.listFiles(); for (File cveFile : cveFiles) { String filename = cveFile.getName(); - System.out.println(filename); String[] splitted = filename.split("[.]"); if (splitted.length == 0) { continue; @@ -216,25 +252,36 @@ public void extractOrClone(File dir) { String extension = splitted[splitted.length - 1]; if (extension.equals("tar") || (splitted.length > 2 && splitted[splitted.length - 2].equals("tar"))) { - System.out.println("tar file found"); tarFile = cveFile; } } if (tarFile != null) { - System.out.println("tarFile != null"); String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; try { - System.out.println("before exec"); Process process = Runtime.getRuntime().exec(extractCommand); - System.out.println("after exec"); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println("tarFile == null"); - // How can I get the repo_url, commit_id and branch? - // String gitCloneCommand = "git clone " + tarFile.getPath() + " --directory " + dirPath; + if (commits.size() > 0) { + String repoUrl = commits.get(0).getRepoUrl(); + String gitCloneCommand = "git clone " + repoUrl; // + " --directory" + gitDir + try { + System.out.println("before exec git clone"); + Runtime.getRuntime().exec(gitCloneCommand); + System.out.println("after exec git clone"); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println("PROBLEM: NO COMMITS"); + } + for (Commit commit : commits) { + String commitId = commit.getCommitId(); + // commit diff + } // for F in $(git -C $repo_dir diff --name-only $commit_id^..$commit_id) } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java index a7fe81567..fb6f919cf 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java @@ -34,6 +34,8 @@ public class Vulnerability { private List notes; private List aliases; + private List commits; + /** *

Getter for the field vulnId.

* @@ -105,4 +107,12 @@ public List getAliases() { public void setAliases(List aliases) { this.aliases = aliases; } + + public List getCommits() { + return commits + } + + public void setCommits(List commits) { + this.commits = commits; + } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 2b4f56483..0192d4373 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -112,7 +112,6 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce Path metadataPath = Paths.get(metadataPathString); Yaml yaml = new Yaml(); - // String metadataString = File.readString(dirPath + "/metadata.yaml"); String metadataString = new String(Files.readAllBytes(metadataPath)); @@ -126,29 +125,58 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce vulnerability.setVulnId((String) vulnerabilityMap.get("vulnerability_id")); - List> notesMaps = - (List>) vulnerabilityMap.get("notes"); - List notes = new ArrayList(); - for (HashMap noteMap : notesMaps) { - Note note = new Note(); - note.setText((String) noteMap.get("text")); - List links = (List) noteMap.get("links"); - note.setLinks(links); - notes.add(note); + if (vulnerabilityMap.containsKey("notes")) { + List> notesMaps = + (List>) vulnerabilityMap.get("notes"); + List notes = new ArrayList(); + for (HashMap noteMap : notesMaps) { + Note note = new Note(); + note.setText((String) noteMap.get("text")); + List links = (List) noteMap.get("links"); + note.setLinks(links); + notes.add(note); + } + vulnerability.setNotes(notes); + } + + if (vulnerabilityMap.containsKey("artifacts")) { + List> artifactsMaps = + (List>) vulnerabilityMap.get("artifacts"); + List artifacts = new ArrayList(); + for (HashMap artifactMap : artifactsMaps) { + Artifact artifact = new Artifact(); + artifact.setId((String) artifactMap.get("id")); + artifact.setReason((String) artifactMap.get("reason")); + artifact.setAffected((Boolean) artifactMap.get("affected")); + artifacts.add(artifact); + } + vulnerability.setArtifacts(artifacts); } - vulnerability.setNotes(notes); - - List> artifactsMaps = - (List>) vulnerabilityMap.get("artifacts"); - List artifacts = new ArrayList(); - for (HashMap artifactMap : artifactsMaps) { - Artifact artifact = new Artifact(); - artifact.setId((String) artifactMap.get("id")); - artifact.setReason((String)artifactMap.get("reason")); - artifact.setAffected((Boolean)artifactMap.get("affected")); - artifacts.add(artifact); + + if (vulnerabilityMap.containsKey("aliases")) { + List aliases = (List) vulnerabilityMap.get("aliases"); + vulnerability.setAliases(aliases); + } + + List> fixes = + (List>) vulnerabilityMap.get("fixes"); + List commitList = new ArrayList(); + if (fixes != null) { + for (HashMap fix : fixes) { + String branch = (String) fix.get("id"); + List> commits = (List>) fix.get("commits"); + for (HashMap commitMap : commits) { + Commit commit = new Commit(); + String repository = commitMap.get("repository"); + String commitId = commitMap.get("id"); + commit.setRepoUrl(repository); + commit.setCommitId(commitId); + commit.setBranch(branch); + commitList.add(commit); + } + } + vulnerability.setCommits(commitList); } - vulnerability.setArtifacts(artifacts); return vulnerability; } From 8e8c75134b16c3a82b780036d24b39882a80ba15 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Fri, 22 Apr 2022 16:39:40 +0200 Subject: [PATCH 12/83] Extracting and cloning in parallel, but without locks --- java-files.txt | 1 + .../java/org/eclipse/steady/kb/Import.java | 180 +++++++++------- .../main/java/org/eclipse/steady/kb/Main.java | 9 +- .../java/org/eclipse/steady/kb/Manager.java | 143 ++++++++---- .../org/eclipse/steady/kb/command/Import.java | 5 +- .../steady/kb/model/Vulnerability.java | 2 +- .../steady/kb/task/ExtractOrClone.java | 203 ++++++++++++++++++ .../org/eclipse/steady/kb/util/Metadata.java | 12 ++ 8 files changed, 427 insertions(+), 128 deletions(-) create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java diff --git a/java-files.txt b/java-files.txt index 23a78b27a..f95412382 100644 --- a/java-files.txt +++ b/java-files.txt @@ -307,6 +307,7 @@ kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index a46bb391e..39f164434 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -1,91 +1,119 @@ +package org.eclipse.steady.kb; +import java.util.HashMap; +import java.io.IOException; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.apache.logging.log4j.Logger; -class Import implements Runnable { +import org.eclipse.steady.shared.util.FileUtil; +import org.eclipse.steady.backend.BackendConnector; +import org.eclipse.steady.kb.task.ExtractOrClone; +import org.eclipse.steady.kb.util.Metadata; +import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.backend.BackendConnectionException; - private static final SOURCE_TAR = "changed-source-code.tar.gz" - private static final STATEMENT_YAML = "statement.yaml" - - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); - - private BackendConnector backendConnector; - - public Import(Path vulnDir) { - this.vulnDir = vulnDir; - } - - @Override - public void run() { +public class Import implements Runnable { - /* How to pass the argumens? - set configuration in the manager instead? - Object uploadConstruct = args.get(UPLOAD_CONSTRUCT_OPTION); - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (uploadConstruct != null - ? CoreConfiguration.ConnectType.READ_WRITE.toString() - : CoreConfiguration.ConnectType.READ_ONLY.toString()));*/ + public static final String METADATA_JSON = "metadata.json"; + public static final String STATEMENT_YAML = "statement.yaml"; + public static final String SOURCE_TAR = "changed-source-code.tar.gz"; - Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); - if (bugExists) { - if (overwrite) { - args.put(DELETE, true); - } else { - log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); - return; - } - } - Path statementPath = findStatementPath(); - if (statementPath != null) { - Vulnerability vuln = Metadata.getFromYaml(statementPath); + public static final String UPLOAD_CONSTRUCT_OPTION = "u"; + public static final String OVERWRITE_OPTION = "o"; + public static final String DELETE_OPTION = "del"; + public static final String DIRECTORY_OPTION = "d"; + public static final String DELETE = "del"; - ExtractOrClone extractOrClone = new ExtractOrClone(this.vulnDir, args); - ImportVulnerability importVulnerability = new ImportVulnerability(vuln, args); - ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(vuln, args); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private Path vulnDir; + private String vulnId; + private BackendConnector backendConnector; + private HashMap args; - extractOrClone.execute(); - importVulnerability.execute(); - importAffectedLibraries.execute(); - } + public Import(HashMap args) { + this.backendConnector = BackendConnector.getInstance(); + this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); + this.vulnId = vulnDir.getFileName().toString(); + this.args = args; + } + public String getVulnId() { + return this.vulnId; + } + @Override + public void run() { + boolean bugExists = false; + try { + // System.out.println("before isBugExisting"); + bugExists = this.backendConnector.isBugExisting(vulnId); + // System.out.println("after isBugExisting"); + } catch (BackendConnectionException e) { + log.error("Can't connect to the Backend"); + return; } + Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); + if (bugExists) { + if (overwrite) { + args.put(DELETE, true); + } else { + System.out.println("bugExists no Overwrite"); + log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); + return; + } + } + String statementPath = findStatementPath(); + System.out.println("statementPath"); + System.out.println(statementPath); + if (statementPath != null) { + Vulnerability vuln; + try { + vuln = Metadata.getFromYaml(statementPath); + } catch (IOException e) { + log.error("Error while reading Yaml file for [{}]", vulnId); + return; + } + // ImportVulnerability importVulnerability = new ImportVulnerability(vuln, args); + // ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(vuln, args); - public Path findTarPath() { - if (FileUtil.isAccessibleFile(vulnDir + File.separator + SOURCE_TAR)) { - return vulnDir + File.separator + SOURCE_TAR; - } - } + ExtractOrClone extractOrClone = new ExtractOrClone(); + extractOrClone.execute(new File(this.vulnDir.toString()), vuln); + // importVulnerability.execute(); + // importAffectedLibraries.execute(); + } + } - public Path findStatementPath() { - // TODO: Should also check for metadata.json? - // Review this function - if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { - return vulnDir + File.separator + STATEMENT_YAML; - } - /* Since there is one Import task per vulnerability, there is no need to loop over subdirectories - else if (FileUtil.isAccessibleDirectory(vulnDir)) { - File directory = new File(vulnDir); - File[] fList = directory.listFiles(); - if (fList != null) { - for (File file : fList) { - if (file.isDirectory()) { - if (FileUtil.isAccessibleFile( - file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { - return file.getAbsolutePath() + File.separator + STATEMENT_YAML; - } else { - Import.log.warn( - "Skipping {} as the directory does not contain statement.yaml" - + " file", - file.getAbsolutePath()); - } - } - } + public String findStatementPath() { + // TODO: Should also check for metadata.json? + // Review this function + if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { + return vulnDir + File.separator + STATEMENT_YAML; + } + // Since there is one Import task per vulnerability, there is no need to loop over + // subdirectories + else if (FileUtil.isAccessibleDirectory(vulnDir)) { + File directory = new File(vulnDir.toString()); + File[] fList = directory.listFiles(); + if (fList != null) { + for (File file : fList) { + if (file.isDirectory()) { + if (FileUtil.isAccessibleFile( + file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { + return file.getAbsolutePath() + File.separator + STATEMENT_YAML; + } else { + Import.log.warn( + "Skipping {} as the directory does not contain statement.yaml" + " file", + file.getAbsolutePath()); } - }*/ - else { - Import.log.error("Invalid directory {}", vulnDir); + } } - return null; + } + } else { + System.out.println("statement not found"); + Import.log.error("Invalid directory {}", vulnDir); } -} \ No newline at end of file + return null; + } +} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index 9164de6e7..f88830d7c 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -19,12 +19,6 @@ package org.eclipse.steady.kb; import java.util.HashMap; -import org.apache.commons.cli.Options; - -import org.eclipse.steady.kb.command.Import; -import org.eclipse.steady.kb.command.Command; -import org.eclipse.steady.kb.command.CommandParser; -import org.eclipse.steady.kb.exception.CommandLineParserException; /** *

Main class.

@@ -36,7 +30,8 @@ public class Main { * @param _args an array of {@link java.lang.String} objects */ public static void main(String[] _args) { - command.run(mapCommandOptionValues); + // command.run(mapCommandOptionValues); + HashMap mapCommandOptionValues = new HashMap(); Manager manager = new Manager(); manager.start("/kb-importer/data/statements", mapCommandOptionValues); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 86331a82e..8cd3e739b 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -2,62 +2,121 @@ import java.util.Map; import java.util.HashMap; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + import java.io.File; -import org.eclipse.steady.kb.Import; -import org.eclipse.steady.kb.command.Command; +import org.eclipse.steady.shared.util.VulasConfiguration; +import org.eclipse.steady.core.util.CoreConfiguration; -class Manager { +public class Manager { - private ThreadPoolExecutor executor = - (ThreadPoolExecutor) Executors.newCachedThreadPool(); - - enum VulnStatus { - NOT_STARTED, - PROCESSING, - IMPORTED, - FAILED + class MyThreadExecutor extends ThreadPoolExecutor { + public MyThreadExecutor( + int PoolSize, + int maxPoolSize, + long keepAliveTime, + TimeUnit unit, + BlockingQueue workQueue) { + super(PoolSize, maxPoolSize, keepAliveTime, unit, workQueue); } - - private Map vulnerabilitiesStatus = new HashMap(); - public void start(String statementsPath, - HashMap mapCommandOptionValues) { + @Override + protected void afterExecute(Runnable run, Throwable throw1) { - File statementsDir = new File(statementsPath); - File[] subdirs = statementsDir.listFiles(); + super.afterExecute(run, throw1); - setUploadConfiguration(mapCommandOptionValues); + // String vulnId = ((Import)run).getVulnId(); + // System.out.println("afterExecute()3"); + // System.out.println(vulnId); - for (File dir : subdirs) { - if (dir.isDirectory(){ - vulnerabilitiesStatus.put(dir.getName(), VulnStatus.NOT_STARTED); - } - } - for (File dir : vulnerabilitiesStatus.keySet()){ - //synchronized (vulnerabilitiesStatus.get(dir.getName())) { - String dirPath = dir.getPath(); - mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); - Import import = new Import(mapCommandOptionValues); - executor.execute(import); - //} - } + if (throw1 == null) { + // Manager.addStatus(vulnId, VulnStatus.IMPORTED); + Manager.addStatus(); + } else { + System.out.println("encountered exception- " + throw1.getMessage()); + // Manager.addStatus(vulnId, VulnStatus.FAILED); + } } + } + + private static int imported = 0; + + public static void addStatus() { // String vulnId, VulnStatus vulnStatus) { + imported += 1; + // System.out.println("addStatus()"); + // System.out.println(vulnId); + // vulnerabilitiesStatus.put(vulnId, vulnStatus); + // System.out.println("addStatus()2"); + } + + private MyThreadExecutor executor = + new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + // (ThreadPoolExecutor) Executors.newCachedThreadPool(); + // this.pool = Executors.newFixedThreadPool(_pool_size); + + enum VulnStatus { + NOT_STARTED, + PROCESSING, + IMPORTED, + FAILED + } - private void setUploadConfiguration() { + private static Map vulnerabilitiesStatus = new HashMap(); - Object uploadConstruct = args.get(UPLOAD_CONSTRUCT_OPTION); - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (uploadConstruct != null - ? CoreConfiguration.ConnectType.READ_WRITE.toString() - : CoreConfiguration.ConnectType.READ_ONLY.toString())); + public synchronized void start( + String statementsPath, HashMap mapCommandOptionValues) { + + File statementsDir = new File(statementsPath); + File[] subdirs = statementsDir.listFiles(); + + mapCommandOptionValues.put(Import.OVERWRITE_OPTION, true); // Change this + setUploadConfiguration(mapCommandOptionValues); + + for (File dir : subdirs) { + String dirPath = dir.getPath(); + mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); + Import command = new Import(mapCommandOptionValues); + executor.submit(command); + } + for (int i = 0; i < 10; i++) { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + System.out.println("Interrupted"); + } + System.out.println(status()); } + } - /*public String status() { - return ""; - }*/ + private void setUploadConfiguration(HashMap args) { + Object uploadConstruct = args.get(Import.UPLOAD_CONSTRUCT_OPTION); + VulasConfiguration.getGlobal() + .setProperty( + CoreConfiguration.BACKEND_CONNECT, + (uploadConstruct != null + ? CoreConfiguration.ConnectType.READ_WRITE.toString() + : CoreConfiguration.ConnectType.READ_ONLY.toString())); + } + + public String status() { + /*int imported = 0; + int others = 0; + for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { + if (vulnStatus == VulnStatus.IMPORTED) { + imported += 1; + } + else { + others += 1; + } + }*/ + return "imported = " + + Integer.toString(imported); // + "\nothers = " + Integer.toString(others); + } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java index a0ed2523a..a9c63a4fe 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java @@ -50,8 +50,9 @@ */ public class Import implements Command { - private static final String METADATA_JSON = "metadata.json"; - private static final String STATEMENT_YAML = "statement.yaml"; + public static final String METADATA_JSON = "metadata.json"; + public static final String STATEMENT_YAML = "statement.yaml"; + public static final String UPLOAD_CONSTRUCT_OPTION = "u"; public static final String DIRECTORY_OPTION = "d"; public static final String OVERWRITE_OPTION = "o"; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java index fb6f919cf..bb64a8288 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java @@ -109,7 +109,7 @@ public void setAliases(List aliases) { } public List getCommits() { - return commits + return commits; } public void setCommits(List commits) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java new file mode 100644 index 000000000..d0780dede --- /dev/null +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -0,0 +1,203 @@ +package org.eclipse.steady.kb.task; + +import java.io.IOException; +import java.io.File; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.HashMap; + +import org.eclipse.steady.shared.util.FileUtil; +import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.model.Commit; +import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.util.Metadata; + +public class ExtractOrClone { + + private static final String GIT_DIRECTORY = "git-repos"; + + public void execute(File dir, Vulnerability vuln) { + String dirPath = dir.getPath(); + File tarFile = getTarFile(dirPath); + + if (tarFile != null) { + extract(tarFile, dirPath); + } else { + clone(vuln, dirPath); + } + System.out.println("ExtractOrClone : done (" + dirPath + ")"); + } + + public File getTarFile(String dirPath) { + if (FileUtil.isAccessibleFile(dirPath + File.separator + Import.SOURCE_TAR)) { + return new File(dirPath + File.separator + Import.SOURCE_TAR); + } else return null; + /* + File tarFile = null; + File[] cveFiles = dir.listFiles(); + for (File cveFile : cveFiles) { + String filename = cveFile.getName(); + String[] splitted = filename.split("[.]"); + if (splitted.length == 0) { + continue; + } + String extension = splitted[splitted.length - 1]; + if (extension.equals("tar") + || (splitted.length > 2 && splitted[splitted.length - 2].equals("tar"))) { + tarFile = cveFile; + break; + } + } + return tarFile;*/ + } + + public void extract(File tarFile, String dirPath) { + String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; + try { + Process process = Runtime.getRuntime().exec(extractCommand); + process.waitFor(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + + public void clone(Vulnerability vuln, String dirPath) { + List commits = vuln.getCommits(); + if (commits.size() == 0) { + System.out.println("NO COMMITS"); + return; + } + for (Commit commit : commits) { + // TODO : lock the repo from this point + // can the bugs have multiple repositories? + String repoUrl = commit.getRepoUrl(); + String commitId = commit.getCommitId(); + String commitDirPath = dirPath + File.separator + commitId; + System.out.println("commitDirPath : " + commitDirPath); + File commitDir = new File(commitDirPath); + String repoDirPath = + GIT_DIRECTORY + File.separator + repoUrl.split("/")[repoUrl.split("/").length - 1]; + try { + cloneOnce(repoUrl, repoDirPath); + createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); + writeCommitDiff(commitId, repoDirPath, commitDirPath); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } + } + + public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, String commitDirPath) + throws IOException { + + String commitId = commit.getCommitId(); + String commitMetadataPath = commitDirPath + File.separator + Import.METADATA_JSON; + File commitMetadataFile = new File(commitDirPath); + // if (!Files.exists(commitMetadataPath)) { + HashMap commitMetadata = new HashMap(); + String gitShowCommand = + "git -C " + repoDirPath + " show --no-patch --no-notes --pretty='%at' " + commitId; + Process gitShow = + Runtime.getRuntime() + .exec(gitShowCommand); // have problems probably caused by parallelization + + BufferedReader gitShowStdInput = + new BufferedReader(new InputStreamReader(gitShow.getInputStream())); + BufferedReader gitShowError = + new BufferedReader(new InputStreamReader(gitShow.getErrorStream())); + String timestamp; + if ((timestamp = gitShowStdInput.readLine()) == null) { + System.out.println("NULL 1"); + } + System.out.println("timestamp1"); + System.out.println(timestamp); + if (timestamp == null) { + System.out.println("NULL!!!"); + } + String error = gitShowError.readLine(); + System.out.println("git show Error: " + error); + /* + while ((timestamp = gitShowStdInput.readLine()) == null) { + System.out.println("timestamp : "+timestamp); + }*/ + System.out.println("timestamp : " + timestamp); + + commitMetadata.put("repository", commit.getRepoUrl()); + commitMetadata.put("branch", commit.getBranch()); + commitMetadata.put("timestamp", timestamp); + commitMetadata.put("commit_id", commitId); + + Metadata.writeCommitMetadata(commitDirPath, commitMetadata); + } + + public void cloneOnce(String repoUrl, String repoDirPath) { + String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; + File repoDir = new File(repoDirPath); + if (Files.exists(Paths.get(repoDirPath))) { + System.out.println("Folder " + repoDirPath + " exists. Skipping git clone."); + } else { + try { + Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); + gitClone.waitFor(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + } + + public void writeCommitDiff(String commitId, String repoDirPath, String commitDirPath) + throws IOException { + String gitDiffCommand = + "git -C " + repoDirPath + " diff --name-only " + commitId + "^.." + commitId; + Process gitDiff = Runtime.getRuntime().exec(gitDiffCommand); + BufferedReader gitDiffStdInput = + new BufferedReader(new InputStreamReader(gitDiff.getInputStream())); + String filename; + while ((filename = gitDiffStdInput.readLine()) != null) { + // for each file modified in the commit... + String gitCatBeforeCommand = + "git -C " + repoDirPath + " cat-file -e " + commitId + "~1:" + filename + " &> /dev/null"; + Process gitCatBefore = Runtime.getRuntime().exec(gitCatBeforeCommand); + if (gitCatBefore.exitValue() == 0) { + // git -C $repo_dir show $commit_id~1:$F > $vulnerability_id/$commit_id/before/$F + String diffFileCommand = + "git -C " + + repoDirPath + + " show " + + commitId + + "~1:" + + filename + + " > " + + commitDirPath + + File.separator + + "before" + + File.separator + + filename; + } + + String gitCatAfterCommand = + "git -C " + repoDirPath + " cat-file -e " + commitId + ":" + filename + " &> /dev/null"; + Process gitCatAfter = Runtime.getRuntime().exec(gitCatBeforeCommand); + if (gitCatAfter.exitValue() == 0) { + // git -C $repo_dir show $commit_id:$F > $vulnerability_id/$commit_id/after/$F + String diffFileCommand = + "git -C " + + repoDirPath + + " show " + + commitId + + ":" + + filename + + " > " + + commitDirPath + + File.separator + + "after" + + File.separator + + filename; + } + } + } +} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 0192d4373..b58e75dfd 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -20,6 +20,8 @@ import java.io.File; import java.io.IOException; +import java.io.Writer; +import java.io.FileWriter; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Files; @@ -76,6 +78,16 @@ public static Commit getCommitMetadata(String commitDir) throws JsonSyntaxExcept return metadata; } + public static void writeCommitMetadata(String commitDir, HashMap commitMetadata) + throws IOException { + String filePath = commitDir + File.separator + META_PROPERTIES_FILE; + // File file = new File(filePath); + // file.createNewFile(); + Writer writer = new FileWriter(filePath, false); + new Gson().toJson(commitMetadata, writer); + writer.close(); + } + /** * read vulnerability information from meta file * From 0e79f9542f3aae16bded1004a92affde8e274dd4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 25 Apr 2022 12:31:41 +0200 Subject: [PATCH 13/83] repositories locks --- .../java/org/eclipse/steady/kb/Import.java | 7 +- .../java/org/eclipse/steady/kb/Manager.java | 78 +++++++++---------- .../steady/kb/task/ExtractOrClone.java | 14 +++- 3 files changed, 55 insertions(+), 44 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 39f164434..f6b2b1a75 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -13,6 +13,7 @@ import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.backend.BackendConnectionException; +import org.eclipse.steady.kb.Manager; public class Import implements Runnable { @@ -31,8 +32,10 @@ public class Import implements Runnable { private String vulnId; private BackendConnector backendConnector; private HashMap args; + Manager manager; - public Import(HashMap args) { + public Import(Manager manager, HashMap args) { + this.manager = manager; this.backendConnector = BackendConnector.getInstance(); this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); this.vulnId = vulnDir.getFileName().toString(); @@ -78,7 +81,7 @@ public void run() { // ImportVulnerability importVulnerability = new ImportVulnerability(vuln, args); // ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(vuln, args); - ExtractOrClone extractOrClone = new ExtractOrClone(); + ExtractOrClone extractOrClone = new ExtractOrClone(this.manager); extractOrClone.execute(new File(this.vulnDir.toString()), vuln); // importVulnerability.execute(); // importAffectedLibraries.execute(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 8cd3e739b..0aff3bf2e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -6,7 +6,10 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.io.File; @@ -15,49 +18,20 @@ public class Manager { - class MyThreadExecutor extends ThreadPoolExecutor { - public MyThreadExecutor( - int PoolSize, - int maxPoolSize, - long keepAliveTime, - TimeUnit unit, - BlockingQueue workQueue) { - super(PoolSize, maxPoolSize, keepAliveTime, unit, workQueue); - } - - @Override - protected void afterExecute(Runnable run, Throwable throw1) { - - super.afterExecute(run, throw1); - - // String vulnId = ((Import)run).getVulnId(); - // System.out.println("afterExecute()3"); - // System.out.println(vulnId); - - if (throw1 == null) { - // Manager.addStatus(vulnId, VulnStatus.IMPORTED); - Manager.addStatus(); - } else { - System.out.println("encountered exception- " + throw1.getMessage()); - // Manager.addStatus(vulnId, VulnStatus.FAILED); - } - } - } - private static int imported = 0; - public static void addStatus() { // String vulnId, VulnStatus vulnStatus) { + public static void addStatus(String vulnId, VulnStatus vulnStatus) { imported += 1; - // System.out.println("addStatus()"); - // System.out.println(vulnId); - // vulnerabilitiesStatus.put(vulnId, vulnStatus); - // System.out.println("addStatus()2"); + System.out.println("addStatus()"); + System.out.println(vulnId); + vulnerabilitiesStatus.put(vulnId, vulnStatus); + System.out.println("addStatus()2"); } - private MyThreadExecutor executor = - new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); - // (ThreadPoolExecutor) Executors.newCachedThreadPool(); - // this.pool = Executors.newFixedThreadPool(_pool_size); + private ThreadPoolExecutor executor = + //new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + //(ThreadPoolExecutor) Executors.newCachedThreadPool(); + (ThreadPoolExecutor) Executors.newFixedThreadPool(8); enum VulnStatus { NOT_STARTED, @@ -67,6 +41,32 @@ enum VulnStatus { } private static Map vulnerabilitiesStatus = new HashMap(); + // synchronized Map reposInProcess = new HashMap(); + Map repoLocks = new HashMap(); + + + //private synchronized Set vulnDone; + + /*public synchronized boolean isRepoInProcess(String repo) { + return reposInProcess.get(repo); + }*/ + + public void start(String repo) { + // reposInProcess.put(repo, true); + if (!repoLocks.containsKey(repo)){ + repoLocks.put(repo, new ReentrantLock()); + } + repoLocks.get(repo).lock(); + } + + public void complete(String repo) { + if (!repoLocks.containsKey(repo)) { + System.out.println("ERROR : Lock not found"); + return; + } + repoLocks.get(repo).unlock(); + } + //HashMap all_vulns = public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { @@ -80,7 +80,7 @@ public synchronized void start( for (File dir : subdirs) { String dirPath = dir.getPath(); mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); - Import command = new Import(mapCommandOptionValues); + Import command = new Import(this, mapCommandOptionValues); executor.submit(command); } for (int i = 0; i < 10; i++) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index d0780dede..3156ecd4c 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -14,10 +14,16 @@ import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.Import; import org.eclipse.steady.kb.util.Metadata; +import org.eclipse.steady.kb.Manager; public class ExtractOrClone { private static final String GIT_DIRECTORY = "git-repos"; + private final Manager manager; + + public ExtractOrClone(Manager manager){ + this.manager = manager; + } public void execute(File dir, Vulnerability vuln) { String dirPath = dir.getPath(); @@ -81,9 +87,11 @@ public void clone(Vulnerability vuln, String dirPath) { String repoDirPath = GIT_DIRECTORY + File.separator + repoUrl.split("/")[repoUrl.split("/").length - 1]; try { - cloneOnce(repoUrl, repoDirPath); - createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); - writeCommitDiff(commitId, repoDirPath, commitDirPath); + manager.start(repoUrl); + cloneOnce(repoUrl, repoDirPath); + createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); + writeCommitDiff(commitId, repoDirPath, commitDirPath); + manager.complete(repoUrl); } catch (IOException e) { e.printStackTrace(); continue; From 93b0f7acb497389cea1872e7e0e523bc9f3052b5 Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Fri, 29 Apr 2022 14:23:50 +0200 Subject: [PATCH 14/83] Parallel processing working for repos with tar (need to test more) --- .../java/org/eclipse/steady/kb/Import.java | 60 ++++--- .../java/org/eclipse/steady/kb/Manager.java | 150 ++++++++++++------ .../steady/kb/task/ExtractOrClone.java | 130 ++++++++++----- .../kb/task/ImportAffectedLibraries.java | 6 + .../steady/kb/task/ImportVulnerability.java | 41 ++++- .../org/eclipse/steady/kb/util/Metadata.java | 27 +++- 6 files changed, 299 insertions(+), 115 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index f6b2b1a75..29bafd664 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -6,14 +6,16 @@ import java.nio.file.Path; import java.nio.file.Paths; import org.apache.logging.log4j.Logger; +import com.github.packageurl.MalformedPackageURLException; import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.backend.BackendConnector; import org.eclipse.steady.kb.task.ExtractOrClone; +import org.eclipse.steady.kb.task.ImportVulnerability; +import org.eclipse.steady.kb.task.ImportAffectedLibraries; import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.backend.BackendConnectionException; -import org.eclipse.steady.kb.Manager; public class Import implements Runnable { @@ -48,55 +50,77 @@ public String getVulnId() { @Override public void run() { + + manager.setVulnStatus(vulnId, Manager.VulnStatus.PROCESSING); boolean bugExists = false; try { - // System.out.println("before isBugExisting"); bugExists = this.backendConnector.isBugExisting(vulnId); - // System.out.println("after isBugExisting"); } catch (BackendConnectionException e) { log.error("Can't connect to the Backend"); return; } + System.out.println("a"); Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); if (bugExists) { if (overwrite) { args.put(DELETE, true); } else { - System.out.println("bugExists no Overwrite"); log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); return; } } + System.out.println("b"); String statementPath = findStatementPath(); - System.out.println("statementPath"); - System.out.println(statementPath); + System.out.println("c"); + if (statementPath != null) { + System.out.println("d"); Vulnerability vuln; try { + // System.out.println("getFromYaml..."); vuln = Metadata.getFromYaml(statementPath); + // System.out.println("after getFromYaml"); } catch (IOException e) { log.error("Error while reading Yaml file for [{}]", vulnId); return; } - // ImportVulnerability importVulnerability = new ImportVulnerability(vuln, args); - // ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(vuln, args); + System.out.println("e"); + if (vuln.getCommits() == null || vuln.getCommits().size() == 0) { + log.error("No fix commits for vulnerability " + vuln.getVulnId()); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); + return; + } + + ExtractOrClone extractOrClone = + new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString())); + extractOrClone.execute(); - ExtractOrClone extractOrClone = new ExtractOrClone(this.manager); - extractOrClone.execute(new File(this.vulnDir.toString()), vuln); - // importVulnerability.execute(); - // importAffectedLibraries.execute(); + if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED) { + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.DIFF_DONE); + ImportVulnerability importVulnerability = new ImportVulnerability(); + ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(); + try { + importVulnerability.execute(vuln, args, backendConnector); + } catch (IOException | BackendConnectionException e) { + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); + e.printStackTrace(); + } + try { + importAffectedLibraries.execute(vuln, args, backendConnector); + } catch (IOException | MalformedPackageURLException | BackendConnectionException e) { + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_LIB); + e.printStackTrace(); + } + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); + } } } public String findStatementPath() { - // TODO: Should also check for metadata.json? // Review this function if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { return vulnDir + File.separator + STATEMENT_YAML; - } - // Since there is one Import task per vulnerability, there is no need to loop over - // subdirectories - else if (FileUtil.isAccessibleDirectory(vulnDir)) { + } else if (FileUtil.isAccessibleDirectory(vulnDir)) { File directory = new File(vulnDir.toString()); File[] fList = directory.listFiles(); if (fList != null) { @@ -107,7 +131,7 @@ else if (FileUtil.isAccessibleDirectory(vulnDir)) { return file.getAbsolutePath() + File.separator + STATEMENT_YAML; } else { Import.log.warn( - "Skipping {} as the directory does not contain statement.yaml" + " file", + "Skipping {} as the directory does not contain statement.yaml file", file.getAbsolutePath()); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 0aff3bf2e..4fde87656 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -1,16 +1,14 @@ package org.eclipse.steady.kb; +import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.Executors; - import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; + import java.io.File; import org.eclipse.steady.shared.util.VulasConfiguration; @@ -18,55 +16,53 @@ public class Manager { - private static int imported = 0; - - public static void addStatus(String vulnId, VulnStatus vulnStatus) { - imported += 1; - System.out.println("addStatus()"); - System.out.println(vulnId); + public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { vulnerabilitiesStatus.put(vulnId, vulnStatus); - System.out.println("addStatus()2"); + } + + public VulnStatus getVulnStatus(String vulnId) { + return vulnerabilitiesStatus.get(vulnId); } private ThreadPoolExecutor executor = - //new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); - //(ThreadPoolExecutor) Executors.newCachedThreadPool(); - (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + (ThreadPoolExecutor) Executors.newCachedThreadPool(); + // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); - enum VulnStatus { + public enum VulnStatus { NOT_STARTED, PROCESSING, + DIFF_DONE, IMPORTED, - FAILED + FAILED, + FAILED_IMPORT_LIB, + FAILED_IMPORT_VULN, + NO_FIXES } private static Map vulnerabilitiesStatus = new HashMap(); - // synchronized Map reposInProcess = new HashMap(); - Map repoLocks = new HashMap(); - - - //private synchronized Set vulnDone; - /*public synchronized boolean isRepoInProcess(String repo) { - return reposInProcess.get(repo); - }*/ + Map repoLocks = new HashMap(); - public void start(String repo) { - // reposInProcess.put(repo, true); - if (!repoLocks.containsKey(repo)){ + public void lockRepo(String repo) { + System.out.println("Lock: " + repo); + if (!repoLocks.containsKey(repo)) { + System.out.println("no key: " + repo); repoLocks.put(repo, new ReentrantLock()); } repoLocks.get(repo).lock(); + System.out.println("Locked:" + repo); } - public void complete(String repo) { + public void unlockRepo(String repo) { + System.out.println("Unlock: " + repo); if (!repoLocks.containsKey(repo)) { System.out.println("ERROR : Lock not found"); return; } repoLocks.get(repo).unlock(); + System.out.println("Unlocked: " + repo); } - //HashMap all_vulns = public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { @@ -79,18 +75,37 @@ public synchronized void start( for (File dir : subdirs) { String dirPath = dir.getPath(); - mapCommandOptionValues.put(Import.DIRECTORY_OPTION, dirPath); - Import command = new Import(this, mapCommandOptionValues); - executor.submit(command); + String vulnId = dir.getName().toString(); + setVulnStatus(vulnId, VulnStatus.NOT_STARTED); } - for (int i = 0; i < 10; i++) { + for (File dir : subdirs) { + String dirPath = dir.getPath(); + System.out.println(dirPath); + if (dir.getName().startsWith("CVE")) { + // It is necessary to copy the arguments to avoid concurrent modification + HashMap args = new HashMap(mapCommandOptionValues); + System.out.println(args); + args.put(Import.DIRECTORY_OPTION, dirPath); + System.out.println(args); + Import command = new Import(this, args); + System.out.println("after new Import"); + executor.submit(command); + // command.run(); + System.out.println(status()); + /*try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + }*/ + } + } + while (true) { + System.out.println(status()); try { - Thread.sleep(10000); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); - System.out.println("Interrupted"); } - System.out.println(status()); } } @@ -105,18 +120,59 @@ private void setUploadConfiguration(HashMap args) { } public String status() { - /*int imported = 0; - int others = 0; + int not_started = 0; + int imported = 0; + int processing = 0; + int diff_done = 0; + int no_fixes = 0; + int failed = 0; + int failed_vuln = 0; + int failed_lib = 0; for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { - if (vulnStatus == VulnStatus.IMPORTED) { - imported += 1; - } - else { - others += 1; - } - }*/ - + switch (vulnStatus) { + case NOT_STARTED: + not_started += 1; + break; + case IMPORTED: + imported += 1; + break; + case PROCESSING: + processing += 1; + break; + case DIFF_DONE: + diff_done += 1; + break; + case NO_FIXES: + no_fixes += 1; + break; + case FAILED_IMPORT_VULN: + failed_vuln += 1; + break; + case FAILED_IMPORT_LIB: + failed_lib += 1; + break; + case FAILED: + failed += 1; + break; + default: + break; + } + } return "imported = " - + Integer.toString(imported); // + "\nothers = " + Integer.toString(others); + + Integer.toString(imported) + + "\nnot_started = " + + Integer.toString(not_started) + + "\nprocessing = " + + Integer.toString(processing) + + "\ndiff_done = " + + Integer.toString(diff_done) + + "\nno_commits = " + + Integer.toString(no_fixes) + + "\nfailed = " + + Integer.toString(failed) + + "\nfailed vuln = " + + Integer.toString(failed_lib) + + "\nfailed lib = " + + Integer.toString(failed_vuln); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 3156ecd4c..082d77af9 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -5,6 +5,7 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.HashMap; @@ -20,19 +21,31 @@ public class ExtractOrClone { private static final String GIT_DIRECTORY = "git-repos"; private final Manager manager; + private final Vulnerability vuln; + private final String vulnId; + private final String dirPath; + private final File tarFile; - public ExtractOrClone(Manager manager){ + public ExtractOrClone(Manager manager, Vulnerability vuln, File dir) { this.manager = manager; + this.vuln = vuln; + this.vulnId = vuln.getVulnId(); + this.dirPath = dir.getPath(); + this.tarFile = getTarFile(dirPath); + System.out.println("ExtractOrClone constructor"); } - public void execute(File dir, Vulnerability vuln) { - String dirPath = dir.getPath(); - File tarFile = getTarFile(dirPath); + public void execute() { + System.out.println("ExtractOrClone.execute()"); if (tarFile != null) { + System.out.println("if (tarFile != null)"); extract(tarFile, dirPath); } else { - clone(vuln, dirPath); + System.out.println("else"); + System.out.println("skipping clone"); + manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); + // clone(vuln, dirPath); } System.out.println("ExtractOrClone : done (" + dirPath + ")"); } @@ -61,41 +74,58 @@ public File getTarFile(String dirPath) { } public void extract(File tarFile, String dirPath) { + + System.out.println("extract"); String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; try { Process process = Runtime.getRuntime().exec(extractCommand); process.waitFor(); + + File dir = new File(dirPath); + + List commits = vuln.getCommits(); + for (Commit commit : commits) { + String commitDirPath = dirPath + File.separator + commit.getCommitId(); + createAndWriteCommitMetadata(commit, null, commitDirPath); + } + } catch (IOException | InterruptedException e) { + String vulnId = dirPath.split(File.separator)[dirPath.split(File.separator).length - 1]; + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); e.printStackTrace(); } } public void clone(Vulnerability vuln, String dirPath) { + System.out.println("clone"); + System.out.println(vuln); + List commits = vuln.getCommits(); + System.out.println(commits); if (commits.size() == 0) { System.out.println("NO COMMITS"); return; } + for (Commit commit : commits) { - // TODO : lock the repo from this point - // can the bugs have multiple repositories? String repoUrl = commit.getRepoUrl(); String commitId = commit.getCommitId(); String commitDirPath = dirPath + File.separator + commitId; System.out.println("commitDirPath : " + commitDirPath); File commitDir = new File(commitDirPath); String repoDirPath = - GIT_DIRECTORY + File.separator + repoUrl.split("/")[repoUrl.split("/").length - 1]; + GIT_DIRECTORY + File.separator + repoUrl.replace("https://", "").replace("/", "_"); + manager.lockRepo(repoUrl); try { - manager.start(repoUrl); - cloneOnce(repoUrl, repoDirPath); - createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); - writeCommitDiff(commitId, repoDirPath, commitDirPath); - manager.complete(repoUrl); - } catch (IOException e) { + cloneOnce(repoUrl, repoDirPath); + createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); + writeCommitDiff(commitId, repoDirPath, commitDirPath); + } catch (IOException | InterruptedException e) { e.printStackTrace(); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); continue; } + manager.unlockRepo(repoUrl); } } @@ -107,33 +137,37 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri File commitMetadataFile = new File(commitDirPath); // if (!Files.exists(commitMetadataPath)) { HashMap commitMetadata = new HashMap(); - String gitShowCommand = - "git -C " + repoDirPath + " show --no-patch --no-notes --pretty='%at' " + commitId; - Process gitShow = - Runtime.getRuntime() - .exec(gitShowCommand); // have problems probably caused by parallelization - - BufferedReader gitShowStdInput = - new BufferedReader(new InputStreamReader(gitShow.getInputStream())); - BufferedReader gitShowError = - new BufferedReader(new InputStreamReader(gitShow.getErrorStream())); + String timestamp; - if ((timestamp = gitShowStdInput.readLine()) == null) { - System.out.println("NULL 1"); - } - System.out.println("timestamp1"); - System.out.println(timestamp); - if (timestamp == null) { - System.out.println("NULL!!!"); + if (repoDirPath == null) { + System.out.println("repoDirPath == null"); + Path timestampPath = Paths.get(commitDirPath + File.separator + "timestamp"); + System.out.println(commitDirPath + File.separator + "timestamp"); + timestamp = new String(Files.readAllBytes(timestampPath)).replace("\n", ""); + System.out.println(timestamp); + } else { + String gitShowCommand = + "git -C " + repoDirPath + " show --no-patch --no-notes --pretty='%at' " + commitId; + Process gitShow = Runtime.getRuntime().exec(gitShowCommand); + + BufferedReader gitShowStdInput = + new BufferedReader(new InputStreamReader(gitShow.getInputStream())); + System.out.println(gitShowCommand); + + if ((timestamp = gitShowStdInput.readLine()) == null || timestamp == null) { + BufferedReader gitShowError = + new BufferedReader(new InputStreamReader(gitShow.getErrorStream())); + System.out.println("Error: Failed to get commit timestamp"); + String error = gitShowError.readLine(); + System.out.println("git show Error: " + error); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); + } } - String error = gitShowError.readLine(); - System.out.println("git show Error: " + error); /* while ((timestamp = gitShowStdInput.readLine()) == null) { System.out.println("timestamp : "+timestamp); }*/ System.out.println("timestamp : " + timestamp); - commitMetadata.put("repository", commit.getRepoUrl()); commitMetadata.put("branch", commit.getBranch()); commitMetadata.put("timestamp", timestamp); @@ -142,18 +176,28 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri Metadata.writeCommitMetadata(commitDirPath, commitMetadata); } - public void cloneOnce(String repoUrl, String repoDirPath) { + public void cloneOnce(String repoUrl, String repoDirPath) + throws IOException, InterruptedException { String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; File repoDir = new File(repoDirPath); + if (Files.exists(Paths.get(repoDirPath))) { System.out.println("Folder " + repoDirPath + " exists. Skipping git clone."); } else { - try { - Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); - gitClone.waitFor(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); + Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); + BufferedReader gitCloneStdInput = + new BufferedReader(new InputStreamReader(gitClone.getInputStream())); + BufferedReader gitCloneErrorInput = + new BufferedReader(new InputStreamReader(gitClone.getErrorStream())); + String line; + while ((line = gitCloneStdInput.readLine()) != null) { + System.out.println("git clone"); + System.out.println(line); + if ((line = gitCloneErrorInput.readLine()) != null) { + System.out.println(line); + } } + gitClone.waitFor(); } } @@ -185,6 +229,9 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi + "before" + File.separator + filename; + } else { + System.out.println("Error: git cat-file didn't work"); + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); } String gitCatAfterCommand = @@ -205,6 +252,9 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi + "after" + File.separator + filename; + } else { + System.out.println("Error: git cat-file didn't work"); + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); } } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 3d471ea8d..6a69fe5c1 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -53,6 +53,9 @@ public class ImportAffectedLibraries implements Task { public void execute( Vulnerability vuln, HashMap args, BackendConnector backendConnector) throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException { + + System.out.println("ImportAffectedLibraries: " + vuln.getVulnId()); + List artifacts = vuln.getArtifacts(); if (artifacts == null || artifacts.isEmpty()) { return; @@ -121,6 +124,7 @@ public void execute( affectedLibsToUpsert.add(affectedLibrary); } } + System.out.println("ImportAffectedLibraries 2"); if (!affectedLibsToUpsert.isEmpty()) { ObjectMapper mapper = new ObjectMapper(); @@ -129,6 +133,8 @@ public void execute( backendConnector.uploadBugAffectedLibraries( null, vuln.getVulnId(), json, AffectedVersionSource.KAYBEE); } + + System.out.println("ImportAffectedLibraries: " + vuln.getVulnId() + " complete"); } private void setAfftectedLib(Artifact artifact, AffectedLibrary affectedLibrary) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 34b2aa366..2623c3a89 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -63,11 +63,15 @@ public void execute( Vulnerability vuln, HashMap args, BackendConnector _backendConnector) throws BackendConnectionException, JsonSyntaxException, IOException { String vulnId = vuln.getVulnId(); + System.out.println("ImportVulnerability: " + vulnId); this.backendConnector = _backendConnector; List commits = new ArrayList(); File file = new File((String) args.get(Import.DIRECTORY_OPTION)); + System.out.println("ImportVulnerability 1 "); + System.out.println("directory option " + (String) args.get(Import.DIRECTORY_OPTION)); + File commitDirs[] = file.listFiles( new FileFilter() { @@ -76,22 +80,47 @@ public boolean accept(File file) { return file.isDirectory(); } }); + // String commitDirsPaths[] = file.list(); + System.out.println("ImportVulnerability 2"); + System.out.println(commitDirs); + System.out.println(commitDirs.length); for (File commitDir : commitDirs) { - String dir = commitDir.getAbsolutePath(); - Commit commit = null; - commit = Metadata.getCommitMetadata(dir); + // File commitDir = new File(commitDirPath); + System.out.println("commitDir.getName()"); + System.out.println(commitDir.getName()); + System.out.println(commitDir.getPath()); + System.out.println(commitDir.isDirectory()); + + if (commitDir.isDirectory()) { + System.out.println("for commitDir"); + System.out.println(commitDir.getName()); + + System.out.println("for commitDir 2"); - if (commit != null) { - commits.add(commit); + String dir = commitDir.getAbsolutePath(); + System.out.println("for commitDir 3"); + Commit commit = null; + commit = Metadata.getCommitMetadata(dir); + System.out.println("for commitDir 4"); + + if (commit != null) { + System.out.println("for commitDir 5"); + commits.add(commit); + System.out.println("for commitDir 6"); + } + System.out.println("for commitDir 7"); } } + System.out.println("ImportVulnerability 3"); Set changes = null; Map> allChanges = new HashMap>(); for (Commit commit : commits) { + System.out.println("ImportVuln for commit"); + System.out.println(commit); changes = ConstructSet.identifyConstructChanges(commit, allChanges); - if ((Boolean) args.get(Import.VERBOSE_OPTION)) { + if (args.containsKey(Import.VERBOSE_OPTION) && (Boolean) args.get(Import.VERBOSE_OPTION)) { for (ConstructChange chg : changes) { log.info(chg.toString()); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index b58e75dfd..25541020f 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -121,19 +121,24 @@ public static Vulnerability getVulnerabilityMetadata(String rootDir) public static Vulnerability getFromYaml(String metadataPathString) throws IOException { // Yaml yaml = new Yaml(new Constructor(Vulnerability.class)); + System.out.println("in getFromYaml"); + Path metadataPath = Paths.get(metadataPathString); Yaml yaml = new Yaml(); // String metadataString = File.readString(dirPath + "/metadata.yaml"); String metadataString = new String(Files.readAllBytes(metadataPath)); + System.out.println("getFromYaml 1"); // Vulnerability vulnerability = yaml.load(metadataString); Map vulnerabilityMap = yaml.load(metadataString); // ObjectMapper objectMapper = new ObjectMapper(); // Vulnerability vulnerability = objectMapper.convertValue(vulnerabilityMap, // Vulnerability.class); + System.out.println("getFromYaml 2"); Vulnerability vulnerability = new Vulnerability(); + System.out.println("getFromYaml 3"); vulnerability.setVulnId((String) vulnerabilityMap.get("vulnerability_id")); @@ -169,15 +174,26 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce List aliases = (List) vulnerabilityMap.get("aliases"); vulnerability.setAliases(aliases); } + System.out.println("getFromYaml 4"); - List> fixes = - (List>) vulnerabilityMap.get("fixes"); List commitList = new ArrayList(); - if (fixes != null) { + if (vulnerabilityMap.containsKey("fixes")) { + + System.out.println("getFromYaml contains fixes"); + List> fixes = + (List>) vulnerabilityMap.get("fixes"); for (HashMap fix : fixes) { - String branch = (String) fix.get("id"); + System.out.println("getFromYaml contains fixes 1"); + System.out.println(fix); + System.out.println(fix.keySet()); + System.out.println(fix.get("id")); + + String branch = fix.get("id").toString(); + System.out.println("getFromYaml contains fixes branch:" + branch); List> commits = (List>) fix.get("commits"); for (HashMap commitMap : commits) { + System.out.println("Metadata for commit"); + System.out.println(commitMap); Commit commit = new Commit(); String repository = commitMap.get("repository"); String commitId = commitMap.get("id"); @@ -187,7 +203,10 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce commitList.add(commit); } } + System.out.println("getFromYaml 5"); + vulnerability.setCommits(commitList); + System.out.println("getFromYaml 6"); } return vulnerability; From 4e50e90945c98b423abeb948db56483bee360fec Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Fri, 29 Apr 2022 17:12:18 +0200 Subject: [PATCH 15/83] started writing a test --- .../java/org/eclipse/steady/kb/Manager.java | 5 +-- .../steady/kb/task/ExtractOrClone.java | 12 +++---- .../steady/kb/task/TestExtractOrClone.java | 33 +++++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 4fde87656..d052b1b16 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -65,7 +65,7 @@ public void unlockRepo(String repo) { } public synchronized void start( - String statementsPath, HashMap mapCommandOptionValues) { + String statementsPath, HashMap mapCommandOptionValues) { File statementsDir = new File(statementsPath); File[] subdirs = statementsDir.listFiles(); @@ -84,11 +84,8 @@ public synchronized void start( if (dir.getName().startsWith("CVE")) { // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); - System.out.println(args); args.put(Import.DIRECTORY_OPTION, dirPath); - System.out.println(args); Import command = new Import(this, args); - System.out.println("after new Import"); executor.submit(command); // command.run(); System.out.println(status()); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 082d77af9..77717b642 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -43,9 +43,9 @@ public void execute() { extract(tarFile, dirPath); } else { System.out.println("else"); - System.out.println("skipping clone"); - manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); - // clone(vuln, dirPath); + //System.out.println("skipping clone"); + //manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); + clone(vuln, dirPath); } System.out.println("ExtractOrClone : done (" + dirPath + ")"); } @@ -123,7 +123,7 @@ public void clone(Vulnerability vuln, String dirPath) { } catch (IOException | InterruptedException e) { e.printStackTrace(); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); - continue; + break; } manager.unlockRepo(repoUrl); } @@ -190,13 +190,13 @@ public void cloneOnce(String repoUrl, String repoDirPath) BufferedReader gitCloneErrorInput = new BufferedReader(new InputStreamReader(gitClone.getErrorStream())); String line; - while ((line = gitCloneStdInput.readLine()) != null) { + /*while ((line = gitCloneStdInput.readLine()) != null) { System.out.println("git clone"); System.out.println(line); if ((line = gitCloneErrorInput.readLine()) != null) { System.out.println(line); } - } + }*/ gitClone.waitFor(); } } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java new file mode 100644 index 000000000..be3ec3e4b --- /dev/null +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -0,0 +1,33 @@ +package org.eclipse.steady.kb.task; + +import java.io.IOException; + +import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.model.Import; +import org.eclipse.steady.kb.util.Metadata; +import org.eclipse.steady.shared.util.VulasConfiguration; +import org.junit.Test; +import com.github.packageurl.MalformedPackageURLException; +import com.google.gson.JsonSyntaxException; + +public class TestExtractOrClone { + @Test + public void testExtract() { + + Manager manager = new Manager(); + + Vulnerability vuln = Metadata.getFromYaml(); + + HashMap args = new HashMap(); + args.put("v", false); + args.put(Import.OVERWRITE_OPTION, false); + args.put(Import.DIRECTORY_OPTION, ""); + + ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, dir) + extractOrClone.execute(); + + // TODO : check extracted files + + } + +} \ No newline at end of file From fbebcd9999262043ca65ef1ebc874fbd69a22adb Mon Sep 17 00:00:00 2001 From: Pedro GALVAO Date: Tue, 3 May 2022 15:58:07 +0200 Subject: [PATCH 16/83] Test for ExtractOrClone --- .../java/org/eclipse/steady/kb/Import.java | 3 +- .../steady/kb/task/ExtractOrClone.java | 53 +- .../org/eclipse/steady/kb/util/Metadata.java | 5 +- .../java/org/eclipse/steady/kb/MainTest.java | 3 +- .../steady/kb/task/TestExtractOrClone.java | 63 +- .../eclipse/steady/kb/util/MetadataTest.java | 17 + .../resources/testRootDir1/statement.yaml | 26 + .../testRootDir6/changed-source-code.tar.gz | Bin 0 -> 151640 bytes .../resources/testRootDir6/statement.yaml | 630 ++++++++++++++++++ .../resources/testRootDir7/statement.yaml | 630 ++++++++++++++++++ 10 files changed, 1404 insertions(+), 26 deletions(-) create mode 100755 kb-importer/src/test/resources/testRootDir1/statement.yaml create mode 100644 kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz create mode 100644 kb-importer/src/test/resources/testRootDir6/statement.yaml create mode 100644 kb-importer/src/test/resources/testRootDir7/statement.yaml diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 29bafd664..8edf17081 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -69,9 +69,8 @@ public void run() { return; } } - System.out.println("b"); + String statementPath = findStatementPath(); - System.out.println("c"); if (statementPath != null) { System.out.println("d"); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 77717b642..804bf41d2 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -8,6 +8,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.HashMap; import org.eclipse.steady.shared.util.FileUtil; @@ -77,7 +78,9 @@ public void extract(File tarFile, String dirPath) { System.out.println("extract"); String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; + try { + Process process = Runtime.getRuntime().exec(extractCommand); process.waitFor(); @@ -113,13 +116,18 @@ public void clone(Vulnerability vuln, String dirPath) { String commitDirPath = dirPath + File.separator + commitId; System.out.println("commitDirPath : " + commitDirPath); File commitDir = new File(commitDirPath); + commitDir.mkdir(); String repoDirPath = GIT_DIRECTORY + File.separator + repoUrl.replace("https://", "").replace("/", "_"); manager.lockRepo(repoUrl); try { cloneOnce(repoUrl, repoDirPath); + System.out.println("after cloneOnce"); createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); + System.out.println("after createAndWriteCommitMetadata"); writeCommitDiff(commitId, repoDirPath, commitDirPath); + System.out.println("after writeCommmitDiff"); + } catch (IOException | InterruptedException e) { e.printStackTrace(); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); @@ -197,24 +205,36 @@ public void cloneOnce(String repoUrl, String repoDirPath) System.out.println(line); } }*/ - gitClone.waitFor(); } } public void writeCommitDiff(String commitId, String repoDirPath, String commitDirPath) - throws IOException { + throws IOException, InterruptedException { String gitDiffCommand = "git -C " + repoDirPath + " diff --name-only " + commitId + "^.." + commitId; + System.out.println(gitDiffCommand); Process gitDiff = Runtime.getRuntime().exec(gitDiffCommand); BufferedReader gitDiffStdInput = new BufferedReader(new InputStreamReader(gitDiff.getInputStream())); String filename; while ((filename = gitDiffStdInput.readLine()) != null) { + System.out.println("while"); + System.out.println(filename); + // for each file modified in the commit... String gitCatBeforeCommand = - "git -C " + repoDirPath + " cat-file -e " + commitId + "~1:" + filename + " &> /dev/null"; + "git -C " + repoDirPath + " cat-file -e " + commitId + "~1:" + filename;// + " &> /dev/null"; Process gitCatBefore = Runtime.getRuntime().exec(gitCatBeforeCommand); + + BufferedReader gitCatErrorInput = + new BufferedReader(new InputStreamReader(gitDiff.getErrorStream())); + gitCatBefore.waitFor(); if (gitCatBefore.exitValue() == 0) { + String filepath = commitDirPath + File.separator + "before" + File.separator + filename; + File file = new File(filepath); + File dir = file.getParentFile(); + //Paths.createDirectories(dir.getPath()); + dir.mkdirs(); // git -C $repo_dir show $commit_id~1:$F > $vulnerability_id/$commit_id/before/$F String diffFileCommand = "git -C " @@ -224,21 +244,29 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi + "~1:" + filename + " > " - + commitDirPath - + File.separator - + "before" - + File.separator - + filename; + + filepath; + System.out.println(diffFileCommand); + Process gitDiffFileBefore = Runtime.getRuntime().exec(diffFileCommand); + gitDiffFileBefore.waitFor(); + } else { System.out.println("Error: git cat-file didn't work"); + System.out.println(gitCatErrorInput.readLine()); manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); } String gitCatAfterCommand = "git -C " + repoDirPath + " cat-file -e " + commitId + ":" + filename + " &> /dev/null"; Process gitCatAfter = Runtime.getRuntime().exec(gitCatBeforeCommand); + gitCatAfter.waitFor(); + if (gitCatAfter.exitValue() == 0) { // git -C $repo_dir show $commit_id:$F > $vulnerability_id/$commit_id/after/$F + String filepath = commitDirPath + File.separator + "after" + File.separator + filename; + File file = new File(filepath); + File dir = file.getParentFile(); + //Paths.createDirectories(dir.getPath()); + dir.mkdirs(); String diffFileCommand = "git -C " + repoDirPath @@ -247,11 +275,10 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi + ":" + filename + " > " - + commitDirPath - + File.separator - + "after" - + File.separator - + filename; + + filepath; + System.out.println(diffFileCommand); + Process gitDiffFileAfter = Runtime.getRuntime().exec(diffFileCommand); + gitDiffFileAfter.waitFor(); } else { System.out.println("Error: git cat-file didn't work"); manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 25541020f..01cc202d6 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -81,8 +81,9 @@ public static Commit getCommitMetadata(String commitDir) throws JsonSyntaxExcept public static void writeCommitMetadata(String commitDir, HashMap commitMetadata) throws IOException { String filePath = commitDir + File.separator + META_PROPERTIES_FILE; - // File file = new File(filePath); - // file.createNewFile(); + System.out.println(filePath); + File file = new File(filePath); + file.createNewFile(); Writer writer = new FileWriter(filePath, false); new Gson().toJson(commitMetadata, writer); writer.close(); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java index 379a3c4b5..ed3dd3b99 100755 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java @@ -23,6 +23,7 @@ public class MainTest { private static final String SPACE = " "; +/* @Test public void testHelp() { String args = "help"; @@ -33,5 +34,5 @@ public void testHelp() { public void testVersion() { String args = "version"; Main.main(args.split(SPACE)); - } + }*/ } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index be3ec3e4b..0de514cb1 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -1,32 +1,79 @@ package org.eclipse.steady.kb.task; import java.io.IOException; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Arrays; import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.model.Import; +import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.Manager; import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.shared.util.VulasConfiguration; -import org.junit.Test; import com.github.packageurl.MalformedPackageURLException; import com.google.gson.JsonSyntaxException; +import org.junit.Test; +import org.junit.Before; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.junit.runner.RunWith; + +//@RunWith(Parameterized.class) public class TestExtractOrClone { - @Test - public void testExtract() { - Manager manager = new Manager(); + Manager manager; + ClassLoader classLoader; + String dirPath; - Vulnerability vuln = Metadata.getFromYaml(); + /* @Before + public void initialize() { + this.manager = new Manager(); + classLoader = getClass().getClassLoader(); + this.dirPath = classLoader.getResource("testRootDir7").getPath(); + } + + public TestExtractOrClone(String dirName) { + classLoader = getClass().getClassLoader(); + this.dirPath = classLoader.getResource(dirName).getPath(); + } + + @Parameterized.Parameters + public static List directories() { + return Arrays.asList(new Object[][] { + { "testRootDir6" }, + { "testRootDir7" } + }); + }*/ + + @Test + public void testClone() throws IOException { + + this.manager = new Manager(); + classLoader = getClass().getClassLoader(); + this.dirPath = classLoader.getResource("testRootDir7").getPath(); + + File dir = new File(dirPath); + String statementPath = dirPath + File.separator + "statement.yaml"; + + Vulnerability vuln = Metadata.getFromYaml(statementPath); HashMap args = new HashMap(); args.put("v", false); args.put(Import.OVERWRITE_OPTION, false); args.put(Import.DIRECTORY_OPTION, ""); - ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, dir) + ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, dir); extractOrClone.execute(); - // TODO : check extracted files + File commitDir1 = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); + File commitDir2 = new File(dirPath + File.separator + "d3acf45ea4db51fa5c4cbd0bc0e7b6d9ef805e6"); + File commitDir3 = new File(dirPath + File.separator + "e0de9126ed8cf25cf141d3e66420da94e350708"); + + org.junit.Assert.assertEquals(commitDir1.exists(), true); + org.junit.Assert.assertEquals(commitDir2.exists(), true); + org.junit.Assert.assertEquals(commitDir3.exists(), true); } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java index b5a02c0a6..0eabdf8ac 100755 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.io.IOException; +import java.io.File; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Vulnerability; @@ -96,4 +97,20 @@ public void testMetadataArtifactsPUrl() throws JsonSyntaxException, IOException public void testInvalidCommitMetadataDir() throws JsonSyntaxException, IOException { Metadata.getVulnerabilityMetadata("commitDir2"); } + + @Test + public void testGetFromYaml() throws IOException { + + ClassLoader classLoader = getClass().getClassLoader(); + String path = classLoader.getResource("testRootDir1").getPath() + File.separator + "statement.yaml"; + Vulnerability vuln = Metadata.getFromYaml(path); + + System.out.println("vuln"); + System.out.println(vuln); + System.out.println(vuln.getArtifacts()); + + assertEquals(3, vuln.getArtifacts().size()); + assertEquals(3, vuln.getNotes().size()); + assertEquals("COLLECTIONS-580", vuln.getVulnId()); + } } diff --git a/kb-importer/src/test/resources/testRootDir1/statement.yaml b/kb-importer/src/test/resources/testRootDir1/statement.yaml new file mode 100755 index 000000000..7ffa4cddd --- /dev/null +++ b/kb-importer/src/test/resources/testRootDir1/statement.yaml @@ -0,0 +1,26 @@ +api_version: v1 +vulnerability_id: COLLECTIONS-580 +aliases: +- TEST-1234 +- SOME-OTHER-ID-1234 +artifacts: +- id: pkg:maven/org.apache.commons/commons-collections4@4.0 + affected: true + reason: Test +- id: pkg:maven/org.apache.commons/commons-collections4@4.0.1-SNAPSHOT + affected: true + reason: Test +- id: pkg:maven/org.apache.commons/commons-collections4@4.1 + affected: false + reason: Test +notes: +- links: + - https://issues.apache.org/jira/browse/COLLECTIONS-580 + text: Arbitrary remote code execution with InvokerTransformer +- links: + - https://issues.apache.org/jira/browse/COLLECTIONS-580 + - https://github.com/apache/commons-collections/commit/b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b + text: With InvokerTransformer serializable collections can be build that execute arbitrary Java code. +- links: + - https://issues.apache.org/jira/browse/COLLECTIONS-580 + text: With InvokerTransformer serializable collections can be build that execute arbitrary Java code. \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz b/kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5582d17829854c1d2676fa4ed852314b9d7c9a5c GIT binary patch literal 151640 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 Date: Fri, 6 May 2022 16:25:00 +0200 Subject: [PATCH 17/83] Started to write ImporterController --- kb-importer/pom.xml | 11 +- .../java/org/eclipse/steady/kb/Import.java | 10 +- .../eclipse/steady/kb/ImporterController.java | 19 ++- .../java/org/eclipse/steady/kb/Manager.java | 17 +- .../steady/kb/task/ExtractOrClone.java | 149 +++++++++--------- .../steady/kb/task/TestExtractOrClone.java | 18 ++- pom.xml | 5 +- 7 files changed, 140 insertions(+), 89 deletions(-) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 2d528a286..cbe2d0b36 100755 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -28,13 +28,22 @@ org.eclipse.steady 3.2.3-SNAPSHOT - kb-importer Knowledge Base Importer + + + + + + org.springframework.boot + spring-boot-starter-web + 2.6.7 + + com.fasterxml.jackson.core jackson-core diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 8edf17081..1cac4ac0d 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -50,16 +50,23 @@ public String getVulnId() { @Override public void run() { + System.out.println("Import.run()"); manager.setVulnStatus(vulnId, Manager.VulnStatus.PROCESSING); boolean bugExists = false; try { + + System.out.println("try"); bugExists = this.backendConnector.isBugExisting(vulnId); + System.out.println("after isBugExisting"); + } catch (BackendConnectionException e) { + System.out.println("BackendConnectionException"); + log.error("Can't connect to the Backend"); return; } - System.out.println("a"); + System.out.println("aaaaaaaaaa"); Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); if (bugExists) { if (overwrite) { @@ -137,7 +144,6 @@ public String findStatementPath() { } } } else { - System.out.println("statement not found"); Import.log.error("Invalid directory {}", vulnDir); } return null; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 5402d67f7..70ae5fa18 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -1,9 +1,24 @@ -// import org.springframework.web.bind.annotation.RestController; +package org.eclipse.steady.kb; -// @RestController +import java.util.HashMap; +import org.eclipse.steady.kb.Manager; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@CrossOrigin("*") +@RequestMapping("/") class ImporterController { + @RequestMapping("/start") public void start() { + + HashMap mapCommandOptionValues = new HashMap(); + Manager manager = new Manager(); + manager.start("/kb-importer/data/statements", mapCommandOptionValues); + return; } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index d052b1b16..aa723b624 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -72,11 +72,12 @@ public synchronized void start( mapCommandOptionValues.put(Import.OVERWRITE_OPTION, true); // Change this setUploadConfiguration(mapCommandOptionValues); - + System.out.println(subdirs); for (File dir : subdirs) { - String dirPath = dir.getPath(); - String vulnId = dir.getName().toString(); - setVulnStatus(vulnId, VulnStatus.NOT_STARTED); + if (dir.getName().startsWith("CVE")) { + String vulnId = dir.getName().toString(); + setVulnStatus(vulnId, VulnStatus.NOT_STARTED); + } } for (File dir : subdirs) { String dirPath = dir.getPath(); @@ -87,13 +88,8 @@ public synchronized void start( args.put(Import.DIRECTORY_OPTION, dirPath); Import command = new Import(this, args); executor.submit(command); - // command.run(); + //command.run(); System.out.println(status()); - /*try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - }*/ } } while (true) { @@ -172,4 +168,5 @@ public String status() { + "\nfailed lib = " + Integer.toString(failed_vuln); } + } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 804bf41d2..02ff0746f 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.HashMap; +import java.util.ArrayList; import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.kb.model.Vulnerability; @@ -84,8 +85,6 @@ public void extract(File tarFile, String dirPath) { Process process = Runtime.getRuntime().exec(extractCommand); process.waitFor(); - File dir = new File(dirPath); - List commits = vuln.getCommits(); for (Commit commit : commits) { String commitDirPath = dirPath + File.separator + commit.getCommitId(); @@ -117,7 +116,7 @@ public void clone(Vulnerability vuln, String dirPath) { System.out.println("commitDirPath : " + commitDirPath); File commitDir = new File(commitDirPath); commitDir.mkdir(); - String repoDirPath = + String repoDirPath = dirPath + File.separator + GIT_DIRECTORY + File.separator + repoUrl.replace("https://", "").replace("/", "_"); manager.lockRepo(repoUrl); try { @@ -173,7 +172,7 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri } /* while ((timestamp = gitShowStdInput.readLine()) == null) { - System.out.println("timestamp : "+timestamp); + System.out.println("timestamp : " + timestamp); }*/ System.out.println("timestamp : " + timestamp); commitMetadata.put("repository", commit.getRepoUrl()); @@ -187,24 +186,24 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri public void cloneOnce(String repoUrl, String repoDirPath) throws IOException, InterruptedException { String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; - File repoDir = new File(repoDirPath); if (Files.exists(Paths.get(repoDirPath))) { System.out.println("Folder " + repoDirPath + " exists. Skipping git clone."); } else { Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); - BufferedReader gitCloneStdInput = + /*BufferedReader gitCloneStdInput = new BufferedReader(new InputStreamReader(gitClone.getInputStream())); BufferedReader gitCloneErrorInput = new BufferedReader(new InputStreamReader(gitClone.getErrorStream())); String line; - /*while ((line = gitCloneStdInput.readLine()) != null) { + while ((line = gitCloneStdInput.readLine()) != null) { System.out.println("git clone"); System.out.println(line); if ((line = gitCloneErrorInput.readLine()) != null) { System.out.println(line); } }*/ + gitClone.waitFor(); } } @@ -218,71 +217,79 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi new BufferedReader(new InputStreamReader(gitDiff.getInputStream())); String filename; while ((filename = gitDiffStdInput.readLine()) != null) { - System.out.println("while"); - System.out.println(filename); - - // for each file modified in the commit... - String gitCatBeforeCommand = - "git -C " + repoDirPath + " cat-file -e " + commitId + "~1:" + filename;// + " &> /dev/null"; - Process gitCatBefore = Runtime.getRuntime().exec(gitCatBeforeCommand); - - BufferedReader gitCatErrorInput = - new BufferedReader(new InputStreamReader(gitDiff.getErrorStream())); - gitCatBefore.waitFor(); - if (gitCatBefore.exitValue() == 0) { - String filepath = commitDirPath + File.separator + "before" + File.separator + filename; - File file = new File(filepath); - File dir = file.getParentFile(); - //Paths.createDirectories(dir.getPath()); - dir.mkdirs(); - // git -C $repo_dir show $commit_id~1:$F > $vulnerability_id/$commit_id/before/$F - String diffFileCommand = - "git -C " - + repoDirPath - + " show " - + commitId - + "~1:" - + filename - + " > " - + filepath; - System.out.println(diffFileCommand); - Process gitDiffFileBefore = Runtime.getRuntime().exec(diffFileCommand); - gitDiffFileBefore.waitFor(); - - } else { - System.out.println("Error: git cat-file didn't work"); - System.out.println(gitCatErrorInput.readLine()); - manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); - } + execGitDiffFile(repoDirPath, commitId, filename, true); + execGitDiffFile(repoDirPath, commitId, filename, false); + } + } - String gitCatAfterCommand = - "git -C " + repoDirPath + " cat-file -e " + commitId + ":" + filename + " &> /dev/null"; - Process gitCatAfter = Runtime.getRuntime().exec(gitCatBeforeCommand); - gitCatAfter.waitFor(); - - if (gitCatAfter.exitValue() == 0) { - // git -C $repo_dir show $commit_id:$F > $vulnerability_id/$commit_id/after/$F - String filepath = commitDirPath + File.separator + "after" + File.separator + filename; - File file = new File(filepath); - File dir = file.getParentFile(); - //Paths.createDirectories(dir.getPath()); - dir.mkdirs(); - String diffFileCommand = - "git -C " - + repoDirPath - + " show " - + commitId - + ":" - + filename - + " > " - + filepath; - System.out.println(diffFileCommand); - Process gitDiffFileAfter = Runtime.getRuntime().exec(diffFileCommand); - gitDiffFileAfter.waitFor(); - } else { - System.out.println("Error: git cat-file didn't work"); - manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); - } + public void execGitDiffFile(String repoDirPath, String commitId, String filename, boolean before) + throws IOException, InterruptedException { + + String commitDirPath = dirPath + File.separator + commitId; + String commitStr; + if (before) { + commitStr = commitId + "~1:"; + } else { + commitStr = commitId + ":"; } + String beforeOrAfter = before? "before" : "after"; + // for each file modified in the commit... + String gitCatCommand = + "git -C " + repoDirPath + " cat-file -e " + commitStr + filename;// + " &> /dev/null"; + Process gitCat = Runtime.getRuntime().exec(gitCatCommand); + System.out.println(gitCatCommand); + BufferedReader gitCatErrorInput = + new BufferedReader(new InputStreamReader(gitCat.getErrorStream())); + gitCat.waitFor(); + if (gitCat.exitValue() == 0) { + + System.out.println("git cat-file works"); + String filepath = commitDirPath + File.separator + beforeOrAfter + File.separator + filename; + File file = new File(filepath); + File dir = file.getParentFile(); + // Paths.createDirectories(dir.getPath()); + dir.mkdirs(); + // git -C $repo_dir show $commit_id~1:$F > $vulnerability_id/$commit_id/before/$F + String diffFileCommand = + "git -C " + + repoDirPath + + " show " + + commitId + + "~1:" + + filename; + + System.out.println(diffFileCommand); + Process gitDiffFile = Runtime.getRuntime().exec(diffFileCommand); + + writeCmdOutputToFile(gitDiffFile, filepath); + + gitDiffFile.waitFor(); + + } else { + System.out.println("Error: git cat-file didn't work"); + System.out.println(gitCatErrorInput.readLine()); + // What to do in case it doesn't work? + // manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); + } + } + + public void writeCmdOutputToFile(Process process, String filepath) throws IOException { + BufferedReader stdInput = + new BufferedReader(new InputStreamReader(process.getInputStream())); + /*BufferedReader errorInput = + new BufferedReader(new InputStreamReader(process.getErrorStream())); + if ((line = errorInput.readLine()) != null) { + System.out.println(line); + }*/ + String line; + String lines = ""; + while ((line = stdInput.readLine()) != null) { + lines += line + "\n"; + } + Path path = Paths.get(filepath); + byte[] bytes = lines.getBytes(); + + Files.write(path, bytes); } + } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index 0de514cb1..36832f40b 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Arrays; @@ -68,13 +70,27 @@ public void testClone() throws IOException { extractOrClone.execute(); File commitDir1 = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); + File commitDir1before = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "before"); + File commitDir1after = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "after"); + File someJavaFile = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8/after/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java"); File commitDir2 = new File(dirPath + File.separator + "d3acf45ea4db51fa5c4cbd0bc0e7b6d9ef805e6"); File commitDir3 = new File(dirPath + File.separator + "e0de9126ed8cf25cf141d3e66420da94e350708"); - org.junit.Assert.assertEquals(commitDir1.exists(), true); + org.junit.Assert.assertEquals(commitDir1before.exists(), true); + org.junit.Assert.assertEquals(commitDir1after.exists(), true); + + // TODO : count number of files instead + org.junit.Assert.assertEquals(commitDir1before.list().length > 0, true); + org.junit.Assert.assertEquals(commitDir1after.list().length > 0, true); + org.junit.Assert.assertEquals(someJavaFile.exists(), true); org.junit.Assert.assertEquals(commitDir2.exists(), true); org.junit.Assert.assertEquals(commitDir3.exists(), true); + // clean directories after testing + Files.delete(Paths.get(commitDir1.getPath())); + Files.delete(Paths.get(commitDir2.getPath())); + Files.delete(Paths.get(commitDir3.getPath())); + // TODO: remove directory git-repos before and/or after testing } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index fe6f9c4d6..ad99ddfaa 100755 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,8 @@ - 8 + 8 + 8 true true true @@ -152,7 +153,7 @@ lang-java-reach lang-java-reach-wala lang-java-reach-soot - + lang-python repo-client From d9a4e6f11fa6a731ef096fb46ae9cd43015ac342 Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Wed, 11 May 2022 20:12:32 +0200 Subject: [PATCH 18/83] Removed comments, fixed small problems, added stopWatch to Import --- java-files.txt | 801 +++++++++--------- kb-importer/pom.xml | 85 +- .../java/org/eclipse/steady/kb/Import.java | 45 +- .../eclipse/steady/kb/ImporterController.java | 45 +- .../main/java/org/eclipse/steady/kb/Main.java | 9 + .../java/org/eclipse/steady/kb/Manager.java | 113 ++- .../steady/kb/task/ExtractOrClone.java | 69 +- .../kb/task/ImportAffectedLibraries.java | 5 +- .../steady/kb/task/ImportVulnerability.java | 29 +- .../org/eclipse/steady/kb/util/Metadata.java | 19 - .../resources/steady-kb-importer.properties | 22 + 11 files changed, 688 insertions(+), 554 deletions(-) create mode 100644 kb-importer/src/main/resources/steady-kb-importer.properties diff --git a/java-files.txt b/java-files.txt index f95412382..2688a881e 100644 --- a/java-files.txt +++ b/java-files.txt @@ -1,601 +1,602 @@ -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java -shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java -shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java -shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java +shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java +shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java +shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java +shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java +shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java -shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java +shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java -shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java -shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java -shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java -shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java -shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java -shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java -shared/src/main/java/org/eclipse/steady/shared/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java +shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java -shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/Constants.java -shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/Constants.java shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java shared/src/main/java/org/eclipse/steady/shared/util/StringList.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java +shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java -shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java -shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java -shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java -shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java -shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java -shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java +shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java +shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java +shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java +shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/package-info.java shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java +shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java +shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java +lang/src/main/java/org/eclipse/steady/Construct.java lang/src/main/java/org/eclipse/steady/ConstructId.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java +lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java +lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java +lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java +lang/src/main/java/org/eclipse/steady/goals/GoalContext.java +lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java +lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java +lang/src/main/java/org/eclipse/steady/goals/TestGoal.java +lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java +lang/src/main/java/org/eclipse/steady/goals/package-info.java +lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java +lang/src/main/java/org/eclipse/steady/goals/ReportException.java +lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java +lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java +lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java +lang/src/main/java/org/eclipse/steady/goals/BomGoal.java +lang/src/main/java/org/eclipse/steady/report/Report.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java +lang/src/main/java/org/eclipse/steady/tasks/package-info.java +lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java +lang/src/main/java/org/eclipse/steady/tasks/BomTask.java +lang/src/main/java/org/eclipse/steady/tasks/Task.java +lang/src/main/java/org/eclipse/steady/FileAnalyzer.java +lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java +lang/src/main/java/org/eclipse/steady/sign/Signature.java +lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java +lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java +lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java lang/src/main/java/org/eclipse/steady/ConstructChange.java -lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java -lang/src/main/java/org/eclipse/steady/Construct.java -lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java +lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java -lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java -lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java +lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java -lang/src/main/java/org/eclipse/steady/DirAnalyzer.java -lang/src/main/java/org/eclipse/steady/FileAnalyzer.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +lang/src/main/java/org/eclipse/steady/core/util/package-info.java +lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java +lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java lang/src/main/java/org/eclipse/steady/FileAnalysisException.java -lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java -lang/src/main/java/org/eclipse/steady/core/util/package-info.java -lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java -lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java -lang/src/main/java/org/eclipse/steady/tasks/package-info.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java -lang/src/main/java/org/eclipse/steady/tasks/Task.java -lang/src/main/java/org/eclipse/steady/tasks/BomTask.java -lang/src/main/java/org/eclipse/steady/sign/Signature.java -lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java -lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java -lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java -lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java -lang/src/main/java/org/eclipse/steady/report/Report.java -lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java -lang/src/main/java/org/eclipse/steady/goals/ReportException.java -lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java -lang/src/main/java/org/eclipse/steady/goals/BomGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java -lang/src/main/java/org/eclipse/steady/goals/TestGoal.java -lang/src/main/java/org/eclipse/steady/goals/package-info.java -lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java -lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java -lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java -lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java -lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalContext.java -lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java -lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java -lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java +lang/src/main/java/org/eclipse/steady/DirAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaId.java lang-java/src/main/java/org/eclipse/steady/java/PomParser.java -lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java +lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java +lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java -lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java +lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java -lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java -lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java -lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java -lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java +lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java +lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java +lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java +lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java +lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java lang-python/src/main/java/org/eclipse/steady/python/PythonId.java +lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java -lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java +lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java -lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java repo-client/src/main/java/org/eclipse/steady/git/GitClient.java repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java repo-client/src/main/java/org/eclipse/steady/package-info.java +repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java -repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java -repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java kb-importer/src/main/java/org/eclipse/steady/kb/Main.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java +kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java -kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java +kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +kb-importer/src/main/java/org/eclipse/steady/kb/Import.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java -kb-importer/src/main/java/org/eclipse/steady/kb/Import.java -kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java +kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java +kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java +kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java +rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java -shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java +shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java +shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java +shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java -shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java -shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java +shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java -shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java -shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java -shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java -lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java -lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java -lang/src/test/java/org/eclipse/steady/report/ReportTest.java -lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java +lang/src/test/java/org/eclipse/steady/report/ReportTest.java +lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java +lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java lang-java/src/test/java/ClassWithoutPackage.java -lang-java/src/test/java/NestedDeclarationMess.java -lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java +lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java +lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java +lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java -lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java +lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java +lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java -lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java -lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java -lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java +lang-java/src/test/java/NestedDeclarationMess.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java lang-java-reach-soot/src/test/java/SootCallGraphTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java repo-client/src/test/java/org/eclipse/steady/git/GitTest.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java +cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java -rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index cbe2d0b36..db68cae0d 100755 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -28,39 +28,84 @@ org.eclipse.steady 3.2.3-SNAPSHOT - kb-importer + + + org.eclipse.steady + kb-importer + 3.2.3-SNAPSHOT Knowledge Base Importer + + jar + + - - - org.springframework.boot - spring-boot-starter-web - 2.6.7 - + + com.fasterxml.jackson.core jackson-core 2.9.10 + + com.fasterxml.jackson.core + jackson-databind + 2.9.10.8 + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.10 + + org.yaml snakeyaml 1.30 + commons-io commons-io + 2.11.0 @@ -77,6 +122,13 @@ ${project.version} test + + + junit + junit + 4.13.2 + test + @@ -94,6 +146,7 @@ com.github.package-url packageurl-java + 1.4.1 com.jayway.jsonpath @@ -104,10 +157,18 @@ - - org.apache.maven.plugins - maven-resources-plugin - + org.apache.maven.plugins @@ -154,7 +215,7 @@ - + org.apache.maven.plugins diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 1cac4ac0d..9a0b62855 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -5,7 +5,9 @@ import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; -import org.apache.logging.log4j.Logger; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.github.packageurl.MalformedPackageURLException; import org.eclipse.steady.shared.util.FileUtil; @@ -16,6 +18,7 @@ import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.backend.BackendConnectionException; +import org.eclipse.steady.shared.util.StopWatch; public class Import implements Runnable { @@ -28,8 +31,11 @@ public class Import implements Runnable { public static final String DELETE_OPTION = "del"; public static final String DIRECTORY_OPTION = "d"; public static final String DELETE = "del"; + public static final String SEQUENTIAL = "seq"; + + private static Logger log = LoggerFactory.getLogger(Import.class); - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private StopWatch stopWatch = null; private Path vulnDir; private String vulnId; private BackendConnector backendConnector; @@ -42,6 +48,7 @@ public Import(Manager manager, HashMap args) { this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); this.vulnId = vulnDir.getFileName().toString(); this.args = args; + this.stopWatch = new StopWatch(this.vulnId).start(); } public String getVulnId() { @@ -50,37 +57,36 @@ public String getVulnId() { @Override public void run() { - System.out.println("Import.run()"); manager.setVulnStatus(vulnId, Manager.VulnStatus.PROCESSING); boolean bugExists = false; try { - - System.out.println("try"); bugExists = this.backendConnector.isBugExisting(vulnId); - System.out.println("after isBugExisting"); - } catch (BackendConnectionException e) { - System.out.println("BackendConnectionException"); - log.error("Can't connect to the Backend"); return; } - System.out.println("aaaaaaaaaa"); - Boolean overwrite = (Boolean) args.get(OVERWRITE_OPTION); + Boolean overwrite = false; + if (args.containsKey(OVERWRITE_OPTION)) { + overwrite = (Boolean) args.get(OVERWRITE_OPTION); + } if (bugExists) { if (overwrite) { args.put(DELETE, true); + log.info("Bug [{}] already exists in backend and will be overwritten", vulnId); } else { log.info("Bug [{}] already exists in backend, analysis will be skipped", vulnId); + manager.setVulnStatus(vulnId, Manager.VulnStatus.IMPORTED); return; } + } else { + log.info("Bug [{}] does not exist in backend", vulnId); } String statementPath = findStatementPath(); if (statementPath != null) { - System.out.println("d"); + //System.out.println("d"); Vulnerability vuln; try { // System.out.println("getFromYaml..."); @@ -90,27 +96,34 @@ public void run() { log.error("Error while reading Yaml file for [{}]", vulnId); return; } - System.out.println("e"); + //System.out.println("e"); if (vuln.getCommits() == null || vuln.getCommits().size() == 0) { log.error("No fix commits for vulnerability " + vuln.getVulnId()); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); return; } - + ExtractOrClone extractOrClone = new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString())); + + this.stopWatch.lap("ExtractOrClone"); extractOrClone.execute(); - if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED) { + if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED && + manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.NO_FIXES) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.DIFF_DONE); ImportVulnerability importVulnerability = new ImportVulnerability(); + ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(); + + this.stopWatch.lap("ImportVulnerability"); try { importVulnerability.execute(vuln, args, backendConnector); } catch (IOException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); e.printStackTrace(); } + this.stopWatch.lap("ImportAffectedLibraries"); try { importAffectedLibraries.execute(vuln, args, backendConnector); } catch (IOException | MalformedPackageURLException | BackendConnectionException e) { @@ -119,6 +132,8 @@ public void run() { } manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); } + this.stopWatch.stop(); + log.info(vuln.getVulnId() + " StopWatch Runtime " + Long.toString(this.stopWatch.getRuntime())); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 70ae5fa18..ebc357c70 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -3,22 +3,47 @@ import java.util.HashMap; import org.eclipse.steady.kb.Manager; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +//import org.springframework.web.bind.annotation.CrossOrigin; +//import org.springframework.web.bind.annotation.RequestMapping; -@RestController -@CrossOrigin("*") -@RequestMapping("/") +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +//@RestController +//@CrossOrigin("*") +//@RequestMapping("/") class ImporterController { - @RequestMapping("/start") + private static Logger log = LoggerFactory.getLogger(ImporterController.class); + + private Thread importerCacheFetch = null; + + //@RequestMapping("/start") public void start() { HashMap mapCommandOptionValues = new HashMap(); Manager manager = new Manager(); - manager.start("/kb-importer/data/statements", mapCommandOptionValues); - - return; + + this.importerCacheFetch = + new Thread( + new Runnable() { + public void run() { + while (true) { + manager.start("/kb-importer/data/statements", mapCommandOptionValues); + + long interval = 3600*24*1000; + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + ImporterController.log.error( + "Interrupted exception: " + + e.getMessage()); + } + } + } + }, + "ImporterCacheFetch"); + this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index f88830d7c..bf847b257 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -18,6 +18,9 @@ */ package org.eclipse.steady.kb; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +//import org.springframework.boot.SpringApplication; import java.util.HashMap; /** @@ -31,8 +34,14 @@ public class Main { */ public static void main(String[] _args) { // command.run(mapCommandOptionValues); + HashMap mapCommandOptionValues = new HashMap(); Manager manager = new Manager(); + for (String arg : _args) { + arg.replace("-", ""); + mapCommandOptionValues.put(arg, true); + } manager.start("/kb-importer/data/statements", mapCommandOptionValues); + //SpringApplication.run(Main.class, _args); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index aa723b624..811fe7b39 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -1,6 +1,8 @@ package org.eclipse.steady.kb; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; +import java.util.Set; import java.util.Map; import java.util.HashMap; import java.util.concurrent.ThreadPoolExecutor; @@ -8,27 +10,28 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; - +import java.nio.file.Path; +import java.nio.file.Paths; import java.io.File; +import java.io.IOException; import org.eclipse.steady.shared.util.VulasConfiguration; import org.eclipse.steady.core.util.CoreConfiguration; +import org.eclipse.steady.shared.util.DirWithFileSearch; public class Manager { - public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { - vulnerabilitiesStatus.put(vulnId, vulnStatus); - } - - public VulnStatus getVulnStatus(String vulnId) { - return vulnerabilitiesStatus.get(vulnId); - } + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); (ThreadPoolExecutor) Executors.newCachedThreadPool(); // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + private static Map vulnerabilitiesStatus = new HashMap(); + + Map repoLocks = new HashMap(); + public enum VulnStatus { NOT_STARTED, PROCESSING, @@ -40,62 +43,78 @@ public enum VulnStatus { NO_FIXES } - private static Map vulnerabilitiesStatus = new HashMap(); + public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { + vulnerabilitiesStatus.put(vulnId, vulnStatus); + } - Map repoLocks = new HashMap(); + public VulnStatus getVulnStatus(String vulnId) { + return vulnerabilitiesStatus.get(vulnId); + } public void lockRepo(String repo) { - System.out.println("Lock: " + repo); + //System.out.println("Lock: " + repo); if (!repoLocks.containsKey(repo)) { - System.out.println("no key: " + repo); + //System.out.println("no key: " + repo); repoLocks.put(repo, new ReentrantLock()); } repoLocks.get(repo).lock(); - System.out.println("Locked:" + repo); + //System.out.println("Locked:" + repo); } public void unlockRepo(String repo) { - System.out.println("Unlock: " + repo); + //System.out.println("Unlock: " + repo); if (!repoLocks.containsKey(repo)) { - System.out.println("ERROR : Lock not found"); + //System.out.println("ERROR : Lock not found"); return; } repoLocks.get(repo).unlock(); - System.out.println("Unlocked: " + repo); + //System.out.println("Unlocked: " + repo); } public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { + + try { + log.info("Updating kaybee..."); + kaybeeUpdate(); + log.info("Running kaybee pull..."); + kaybeePull(); + } catch (IOException | InterruptedException e) { + log.error("Exception while performing update: " + e.getMessage()); + return; + } File statementsDir = new File(statementsPath); File[] subdirs = statementsDir.listFiles(); - mapCommandOptionValues.put(Import.OVERWRITE_OPTION, true); // Change this setUploadConfiguration(mapCommandOptionValues); - System.out.println(subdirs); - for (File dir : subdirs) { - if (dir.getName().startsWith("CVE")) { - String vulnId = dir.getName().toString(); - setVulnStatus(vulnId, VulnStatus.NOT_STARTED); - } + final DirWithFileSearch search = new DirWithFileSearch("statement.yaml"); + Set vulnDirsPaths = search.search(Paths.get(statementsDir.getPath())); + for (Path dirPath : vulnDirsPaths) { + File vulnDir = dirPath.toFile(); + log.info("Found vulnerability directory: " + vulnDir.getName()); + String vulnId = vulnDir.getName().toString(); + setVulnStatus(vulnId, VulnStatus.NOT_STARTED); } - for (File dir : subdirs) { - String dirPath = dir.getPath(); - System.out.println(dirPath); - if (dir.getName().startsWith("CVE")) { - // It is necessary to copy the arguments to avoid concurrent modification - HashMap args = new HashMap(mapCommandOptionValues); - args.put(Import.DIRECTORY_OPTION, dirPath); - Import command = new Import(this, args); + for (Path vulnDirPath : vulnDirsPaths) { + File vulnDir = vulnDirPath.toFile(); + String vulnDirStr = vulnDirPath.toString(); + log.info("Initializing process for directory " + vulnDirPath); + // It is necessary to copy the arguments to avoid concurrent modification + HashMap args = new HashMap(mapCommandOptionValues); + args.put(Import.DIRECTORY_OPTION, vulnDirStr); + Import command = new Import(this, args); + if (mapCommandOptionValues.containsKey(Import.SEQUENTIAL)) { + command.run(); + } else { executor.submit(command); - //command.run(); - System.out.println(status()); } + System.out.println(status()); } while (true) { System.out.println(status()); try { - Thread.sleep(1000); + Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } @@ -112,6 +131,24 @@ private void setUploadConfiguration(HashMap args) { : CoreConfiguration.ConnectType.READ_ONLY.toString())); } + public void kaybeeUpdate() throws IOException, InterruptedException { + // TODO : write directory as option/property + Process updateProcess = Runtime.getRuntime().exec("/kb-importer/data/kaybee update --force"); + updateProcess.waitFor(); + if (updateProcess.exitValue() != 0){ + log.error("Failed to update kaybee"); + } + } + + public void kaybeePull() throws IOException, InterruptedException { + // TODO : write directories as option/property + Process pullProcess = Runtime.getRuntime().exec("/kb-importer/data/kaybee pull -c /kb-importer/conf/kaybeeconf.yaml"); + pullProcess.waitFor(); + if (pullProcess.exitValue() != 0){ + log.error("Kaybee pull failed"); + } + } + public String status() { int not_started = 0; int imported = 0; @@ -155,18 +192,18 @@ public String status() { + Integer.toString(imported) + "\nnot_started = " + Integer.toString(not_started) - + "\nprocessing = " + + "\nextracting/cloning = " + Integer.toString(processing) + "\ndiff_done = " + Integer.toString(diff_done) - + "\nno_commits = " + + "\nno_fixes = " + Integer.toString(no_fixes) - + "\nfailed = " + + "\nfailed extract/clone = " + Integer.toString(failed) + "\nfailed vuln = " + Integer.toString(failed_lib) + "\nfailed lib = " - + Integer.toString(failed_vuln); + + Integer.toString(failed_vuln) + "\n"; } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 02ff0746f..a4e267efe 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -11,6 +11,7 @@ import java.util.concurrent.TimeUnit; import java.util.HashMap; import java.util.ArrayList; +import org.apache.logging.log4j.Logger; import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.kb.model.Vulnerability; @@ -21,6 +22,8 @@ public class ExtractOrClone { + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private static final String GIT_DIRECTORY = "git-repos"; private final Manager manager; private final Vulnerability vuln; @@ -34,22 +37,23 @@ public ExtractOrClone(Manager manager, Vulnerability vuln, File dir) { this.vulnId = vuln.getVulnId(); this.dirPath = dir.getPath(); this.tarFile = getTarFile(dirPath); - System.out.println("ExtractOrClone constructor"); + //System.out.println("ExtractOrClone constructor"); } public void execute() { - System.out.println("ExtractOrClone.execute()"); + //System.out.println("ExtractOrClone.execute()"); if (tarFile != null) { - System.out.println("if (tarFile != null)"); + //System.out.println("if (tarFile != null)"); extract(tarFile, dirPath); } else { - System.out.println("else"); + //System.out.println("else"); //System.out.println("skipping clone"); - //manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); - clone(vuln, dirPath); + log.info("Skipping clone for vulnerability " + this.vulnId); + manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); + //clone(vuln, dirPath); } - System.out.println("ExtractOrClone : done (" + dirPath + ")"); + log.info("ExtractOrClone : done (" + dirPath + ")"); } public File getTarFile(String dirPath) { @@ -77,7 +81,7 @@ public File getTarFile(String dirPath) { public void extract(File tarFile, String dirPath) { - System.out.println("extract"); + log.info("Extracting vulnerability " + vulnId); String extractCommand = "tar -xf " + tarFile.getPath() + " --directory " + dirPath; try { @@ -99,13 +103,11 @@ public void extract(File tarFile, String dirPath) { } public void clone(Vulnerability vuln, String dirPath) { - System.out.println("clone"); - System.out.println(vuln); List commits = vuln.getCommits(); - System.out.println(commits); if (commits.size() == 0) { - System.out.println("NO COMMITS"); + log.warn("No commits for vulnerability " + this.vulnId); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); return; } @@ -113,7 +115,7 @@ public void clone(Vulnerability vuln, String dirPath) { String repoUrl = commit.getRepoUrl(); String commitId = commit.getCommitId(); String commitDirPath = dirPath + File.separator + commitId; - System.out.println("commitDirPath : " + commitDirPath); + //System.out.println("commitDirPath : " + commitDirPath); File commitDir = new File(commitDirPath); commitDir.mkdir(); String repoDirPath = dirPath + File.separator + @@ -121,11 +123,11 @@ public void clone(Vulnerability vuln, String dirPath) { manager.lockRepo(repoUrl); try { cloneOnce(repoUrl, repoDirPath); - System.out.println("after cloneOnce"); + //System.out.println("after cloneOnce"); createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); - System.out.println("after createAndWriteCommitMetadata"); + //System.out.println("after createAndWriteCommitMetadata"); writeCommitDiff(commitId, repoDirPath, commitDirPath); - System.out.println("after writeCommmitDiff"); + //System.out.println("after writeCommmitDiff"); } catch (IOException | InterruptedException e) { e.printStackTrace(); @@ -147,11 +149,8 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri String timestamp; if (repoDirPath == null) { - System.out.println("repoDirPath == null"); Path timestampPath = Paths.get(commitDirPath + File.separator + "timestamp"); - System.out.println(commitDirPath + File.separator + "timestamp"); timestamp = new String(Files.readAllBytes(timestampPath)).replace("\n", ""); - System.out.println(timestamp); } else { String gitShowCommand = "git -C " + repoDirPath + " show --no-patch --no-notes --pretty='%at' " + commitId; @@ -159,14 +158,19 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri BufferedReader gitShowStdInput = new BufferedReader(new InputStreamReader(gitShow.getInputStream())); - System.out.println(gitShowCommand); - + log.info("Executing: " + gitShowCommand); + try { + gitShow.waitFor(); + } catch (InterruptedException e) { + return; + } if ((timestamp = gitShowStdInput.readLine()) == null || timestamp == null) { BufferedReader gitShowError = new BufferedReader(new InputStreamReader(gitShow.getErrorStream())); - System.out.println("Error: Failed to get commit timestamp"); + String repoUrl = commit.getRepoUrl(); + log.error("Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); String error = gitShowError.readLine(); - System.out.println("git show Error: " + error); + log.error("git show: " + error); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); } } @@ -174,7 +178,6 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri while ((timestamp = gitShowStdInput.readLine()) == null) { System.out.println("timestamp : " + timestamp); }*/ - System.out.println("timestamp : " + timestamp); commitMetadata.put("repository", commit.getRepoUrl()); commitMetadata.put("branch", commit.getBranch()); commitMetadata.put("timestamp", timestamp); @@ -185,11 +188,13 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri public void cloneOnce(String repoUrl, String repoDirPath) throws IOException, InterruptedException { + String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; if (Files.exists(Paths.get(repoDirPath))) { - System.out.println("Folder " + repoDirPath + " exists. Skipping git clone."); + log.info("Folder " + repoDirPath + " exists. Skipping git clone."); } else { + log.info("Cloning repository " + repoUrl); Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); /*BufferedReader gitCloneStdInput = new BufferedReader(new InputStreamReader(gitClone.getInputStream())); @@ -211,10 +216,11 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi throws IOException, InterruptedException { String gitDiffCommand = "git -C " + repoDirPath + " diff --name-only " + commitId + "^.." + commitId; - System.out.println(gitDiffCommand); + log.info("Executing: " + gitDiffCommand); Process gitDiff = Runtime.getRuntime().exec(gitDiffCommand); BufferedReader gitDiffStdInput = new BufferedReader(new InputStreamReader(gitDiff.getInputStream())); + String filename; while ((filename = gitDiffStdInput.readLine()) != null) { execGitDiffFile(repoDirPath, commitId, filename, true); @@ -237,13 +243,12 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename String gitCatCommand = "git -C " + repoDirPath + " cat-file -e " + commitStr + filename;// + " &> /dev/null"; Process gitCat = Runtime.getRuntime().exec(gitCatCommand); - System.out.println(gitCatCommand); + log.info("Executing: " + gitCatCommand); BufferedReader gitCatErrorInput = new BufferedReader(new InputStreamReader(gitCat.getErrorStream())); gitCat.waitFor(); if (gitCat.exitValue() == 0) { - - System.out.println("git cat-file works"); + //System.out.println("git cat-file works"); String filepath = commitDirPath + File.separator + beforeOrAfter + File.separator + filename; File file = new File(filepath); File dir = file.getParentFile(); @@ -258,7 +263,7 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename + "~1:" + filename; - System.out.println(diffFileCommand); + log.info("Executing: " + diffFileCommand); Process gitDiffFile = Runtime.getRuntime().exec(diffFileCommand); writeCmdOutputToFile(gitDiffFile, filepath); @@ -266,8 +271,8 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename gitDiffFile.waitFor(); } else { - System.out.println("Error: git cat-file didn't work"); - System.out.println(gitCatErrorInput.readLine()); + log.error("git cat-file didn't work"); + log.error(gitCatErrorInput.readLine()); // What to do in case it doesn't work? // manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 6a69fe5c1..2904e3067 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -54,7 +54,7 @@ public void execute( Vulnerability vuln, HashMap args, BackendConnector backendConnector) throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException { - System.out.println("ImportAffectedLibraries: " + vuln.getVulnId()); + log.info("Initiating ImportAffectedLibraries for vulnerability " + vuln.getVulnId()); List artifacts = vuln.getArtifacts(); if (artifacts == null || artifacts.isEmpty()) { @@ -124,7 +124,6 @@ public void execute( affectedLibsToUpsert.add(affectedLibrary); } } - System.out.println("ImportAffectedLibraries 2"); if (!affectedLibsToUpsert.isEmpty()) { ObjectMapper mapper = new ObjectMapper(); @@ -134,7 +133,7 @@ public void execute( null, vuln.getVulnId(), json, AffectedVersionSource.KAYBEE); } - System.out.println("ImportAffectedLibraries: " + vuln.getVulnId() + " complete"); + log.info("ImportAffectedLibraries: " + vuln.getVulnId() + " complete"); } private void setAfftectedLib(Artifact artifact, AffectedLibrary affectedLibrary) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 2623c3a89..260745238 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -63,15 +63,12 @@ public void execute( Vulnerability vuln, HashMap args, BackendConnector _backendConnector) throws BackendConnectionException, JsonSyntaxException, IOException { String vulnId = vuln.getVulnId(); - System.out.println("ImportVulnerability: " + vulnId); + log.info("Initiating ImportVulnerability: " + vulnId); this.backendConnector = _backendConnector; List commits = new ArrayList(); File file = new File((String) args.get(Import.DIRECTORY_OPTION)); - System.out.println("ImportVulnerability 1 "); - System.out.println("directory option " + (String) args.get(Import.DIRECTORY_OPTION)); - File commitDirs[] = file.listFiles( new FileFilter() { @@ -81,44 +78,26 @@ public boolean accept(File file) { } }); // String commitDirsPaths[] = file.list(); - System.out.println("ImportVulnerability 2"); - System.out.println(commitDirs); - System.out.println(commitDirs.length); + //System.out.println("ImportVulnerability 2"); + //System.out.println(commitDirs); + //System.out.println(commitDirs.length); for (File commitDir : commitDirs) { - // File commitDir = new File(commitDirPath); - System.out.println("commitDir.getName()"); - System.out.println(commitDir.getName()); - System.out.println(commitDir.getPath()); - System.out.println(commitDir.isDirectory()); if (commitDir.isDirectory()) { - System.out.println("for commitDir"); - System.out.println(commitDir.getName()); - - System.out.println("for commitDir 2"); - String dir = commitDir.getAbsolutePath(); - System.out.println("for commitDir 3"); Commit commit = null; commit = Metadata.getCommitMetadata(dir); - System.out.println("for commitDir 4"); if (commit != null) { - System.out.println("for commitDir 5"); commits.add(commit); - System.out.println("for commitDir 6"); } - System.out.println("for commitDir 7"); } } - System.out.println("ImportVulnerability 3"); Set changes = null; Map> allChanges = new HashMap>(); for (Commit commit : commits) { - System.out.println("ImportVuln for commit"); - System.out.println(commit); changes = ConstructSet.identifyConstructChanges(commit, allChanges); if (args.containsKey(Import.VERBOSE_OPTION) && (Boolean) args.get(Import.VERBOSE_OPTION)) { for (ConstructChange chg : changes) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 01cc202d6..33a9d7a33 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -81,7 +81,6 @@ public static Commit getCommitMetadata(String commitDir) throws JsonSyntaxExcept public static void writeCommitMetadata(String commitDir, HashMap commitMetadata) throws IOException { String filePath = commitDir + File.separator + META_PROPERTIES_FILE; - System.out.println(filePath); File file = new File(filePath); file.createNewFile(); Writer writer = new FileWriter(filePath, false); @@ -122,24 +121,20 @@ public static Vulnerability getVulnerabilityMetadata(String rootDir) public static Vulnerability getFromYaml(String metadataPathString) throws IOException { // Yaml yaml = new Yaml(new Constructor(Vulnerability.class)); - System.out.println("in getFromYaml"); Path metadataPath = Paths.get(metadataPathString); Yaml yaml = new Yaml(); // String metadataString = File.readString(dirPath + "/metadata.yaml"); String metadataString = new String(Files.readAllBytes(metadataPath)); - System.out.println("getFromYaml 1"); // Vulnerability vulnerability = yaml.load(metadataString); Map vulnerabilityMap = yaml.load(metadataString); // ObjectMapper objectMapper = new ObjectMapper(); // Vulnerability vulnerability = objectMapper.convertValue(vulnerabilityMap, // Vulnerability.class); - System.out.println("getFromYaml 2"); Vulnerability vulnerability = new Vulnerability(); - System.out.println("getFromYaml 3"); vulnerability.setVulnId((String) vulnerabilityMap.get("vulnerability_id")); @@ -175,26 +170,15 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce List aliases = (List) vulnerabilityMap.get("aliases"); vulnerability.setAliases(aliases); } - System.out.println("getFromYaml 4"); List commitList = new ArrayList(); if (vulnerabilityMap.containsKey("fixes")) { - - System.out.println("getFromYaml contains fixes"); List> fixes = (List>) vulnerabilityMap.get("fixes"); for (HashMap fix : fixes) { - System.out.println("getFromYaml contains fixes 1"); - System.out.println(fix); - System.out.println(fix.keySet()); - System.out.println(fix.get("id")); - String branch = fix.get("id").toString(); - System.out.println("getFromYaml contains fixes branch:" + branch); List> commits = (List>) fix.get("commits"); for (HashMap commitMap : commits) { - System.out.println("Metadata for commit"); - System.out.println(commitMap); Commit commit = new Commit(); String repository = commitMap.get("repository"); String commitId = commitMap.get("id"); @@ -204,10 +188,7 @@ public static Vulnerability getFromYaml(String metadataPathString) throws IOExce commitList.add(commit); } } - System.out.println("getFromYaml 5"); - vulnerability.setCommits(commitList); - System.out.println("getFromYaml 6"); } return vulnerability; diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties new file mode 100644 index 000000000..cdd119fc3 --- /dev/null +++ b/kb-importer/src/main/resources/steady-kb-importer.properties @@ -0,0 +1,22 @@ +# +# This file is part of Eclipse Steady. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors +# + +# Time between consecutive starts +# Default: +# TODO \ No newline at end of file From d28d6f1ee33cf1192155984d4953094c94059ed1 Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Thu, 12 May 2022 17:32:57 +0200 Subject: [PATCH 19/83] Rest service with Spring Framework --- java-files.txt | 12 - kb-importer/.gitignore | 34 + kb-importer/Jenkinsfile | 3 + kb-importer/pom.xml | 235 +------ .../java/org/eclipse/steady/kb/Import.java | 34 +- .../eclipse/steady/kb/ImporterController.java | 93 +-- .../main/java/org/eclipse/steady/kb/Main.java | 69 +- .../java/org/eclipse/steady/kb/Manager.java | 48 +- .../steady/kb/task/ExtractOrClone.java | 4 +- .../org.eclipse.steady.kb.command.Command | 3 - .../services/org.eclipse.steady.kb.task.Task | 2 - .../src/main/resources/application.properties | 1 + .../resources/steady-kb-importer.properties | 22 - .../java/org/eclipse/steady/kb/MainTest.java | 38 -- .../org/eclipse/steady/kb/TestConstructs.java | 82 --- .../steady/kb/TestPythonConstructs.java | 96 --- .../java/org/eclipse/steady/kb/ZipUtil.java | 52 -- .../steady/kb/command/CommandParserTest.java | 86 --- .../eclipse/steady/kb/command/ImportTest.java | 77 --- .../steady/kb/task/MockBackConnector.java | 88 --- .../steady/kb/task/TestExtractOrClone.java | 96 --- .../kb/task/TestImportAffectedLibraries.java | 84 --- .../kb/task/TestImportVulnerability.java | 68 -- ...TestImportVulnerability_CVE_2017_2617.java | 67 -- .../eclipse/steady/kb/util/MetadataTest.java | 116 ---- .../src/test/resources/COLLECTIONS-580.zip | Bin 107314 -> 0 bytes .../resources/CVE-2011-4343/metadata.json | 41 -- .../src/test/resources/CVE-2014-0094.zip | Bin 24527 -> 0 bytes .../src/test/resources/CVE-2016-2048.zip | Bin 141723 -> 0 bytes .../src/test/resources/CVE-2017-2617.zip | Bin 61942 -> 0 bytes .../test/resources/commitDir1/metadata.json | 6 - .../src/test/resources/credentials.xml | 46 ++ .../src/test/resources/plugins/test.txt | 0 .../test/resources/secrets/hudson.util.Secret | Bin 0 -> 7369 bytes .../src/test/resources/secrets/master.key | Bin 0 -> 7369 bytes .../resources/testAffectedLibs/metadata.json | 55 -- .../test/resources/testRootDir1/metadata.json | 46 -- .../resources/testRootDir1/statement.yaml | 26 - .../test/resources/testRootDir2/metadata.json | 45 -- .../test/resources/testRootDir3/metadata.json | 3 - .../test/resources/testRootDir4/metadata.json | 30 - .../test/resources/testRootDir5/metadata.json | 20 - .../testRootDir6/changed-source-code.tar.gz | Bin 151640 -> 0 bytes .../resources/testRootDir6/statement.yaml | 630 ------------------ .../resources/testRootDir7/statement.yaml | 630 ------------------ 45 files changed, 241 insertions(+), 2847 deletions(-) create mode 100644 kb-importer/.gitignore create mode 100644 kb-importer/Jenkinsfile mode change 100755 => 100644 kb-importer/pom.xml mode change 100755 => 100644 kb-importer/src/main/java/org/eclipse/steady/kb/Main.java delete mode 100644 kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.command.Command delete mode 100644 kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.task.Task create mode 100644 kb-importer/src/main/resources/application.properties delete mode 100644 kb-importer/src/main/resources/steady-kb-importer.properties delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java delete mode 100755 kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java delete mode 100755 kb-importer/src/test/resources/COLLECTIONS-580.zip delete mode 100644 kb-importer/src/test/resources/CVE-2011-4343/metadata.json delete mode 100644 kb-importer/src/test/resources/CVE-2014-0094.zip delete mode 100755 kb-importer/src/test/resources/CVE-2016-2048.zip delete mode 100644 kb-importer/src/test/resources/CVE-2017-2617.zip delete mode 100755 kb-importer/src/test/resources/commitDir1/metadata.json create mode 100644 kb-importer/src/test/resources/credentials.xml create mode 100644 kb-importer/src/test/resources/plugins/test.txt create mode 100644 kb-importer/src/test/resources/secrets/hudson.util.Secret create mode 100644 kb-importer/src/test/resources/secrets/master.key delete mode 100755 kb-importer/src/test/resources/testAffectedLibs/metadata.json delete mode 100755 kb-importer/src/test/resources/testRootDir1/metadata.json delete mode 100755 kb-importer/src/test/resources/testRootDir1/statement.yaml delete mode 100755 kb-importer/src/test/resources/testRootDir2/metadata.json delete mode 100755 kb-importer/src/test/resources/testRootDir3/metadata.json delete mode 100755 kb-importer/src/test/resources/testRootDir4/metadata.json delete mode 100755 kb-importer/src/test/resources/testRootDir5/metadata.json delete mode 100644 kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz delete mode 100644 kb-importer/src/test/resources/testRootDir6/statement.yaml delete mode 100644 kb-importer/src/test/resources/testRootDir7/statement.yaml diff --git a/java-files.txt b/java-files.txt index 2688a881e..bf851fe8e 100644 --- a/java-files.txt +++ b/java-files.txt @@ -556,18 +556,6 @@ patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java diff --git a/kb-importer/.gitignore b/kb-importer/.gitignore new file mode 100644 index 000000000..768480f43 --- /dev/null +++ b/kb-importer/.gitignore @@ -0,0 +1,34 @@ +tmp/* +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/kb-importer/Jenkinsfile b/kb-importer/Jenkinsfile new file mode 100644 index 000000000..66dd4240c --- /dev/null +++ b/kb-importer/Jenkinsfile @@ -0,0 +1,3 @@ +@Library('piper-lib-os') _ + +piperPipeline script: this diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml old mode 100755 new mode 100644 index db68cae0d..7282353b9 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -1,243 +1,52 @@ - - + 4.0.0 - root - org.eclipse.steady - 3.2.3-SNAPSHOT - - - - + 2.6.3 + + org.eclipse.steady kb-importer - 3.2.3-SNAPSHOT - Knowledge Base Importer - - + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot - jar + 1.8 - - - - - - - - - com.fasterxml.jackson.core - jackson-core - 2.9.10 - + + org.springframework.boot + spring-boot-starter-web + + - com.fasterxml.jackson.core - jackson-databind - 2.9.10.8 - - - com.fasterxml.jackson.core - jackson-annotations - 2.9.10 + org.springframework.boot + spring-boot-starter - org.yaml - snakeyaml - 1.30 - - - - commons-io - commons-io - 2.11.0 - - - - org.eclipse.steady - lang - ${project.version} - compile - - - - org.eclipse.steady - shared - tests - ${project.version} + org.springframework.boot + spring-boot-starter-test test - - junit - junit - 4.13.2 - test - - - - org.eclipse.steady - lang-java - ${project.version} - runtime - org.eclipse.steady - lang-python - ${project.version} - runtime - - - com.github.package-url - packageurl-java - 1.4.1 - - - com.jayway.jsonpath - json-path - 2.7.0 + kb-importer + 3.2.3-SNAPSHOT - - - - org.apache.maven.plugins - maven-shade-plugin - - - make-shade - package - - shade - - - - - true - true - - - false - true - jar-with-dependencies - - - - - org.eclipse.steady.kb.Main - ${project.version} - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - alphabetical - - - - integration-test - - integration-test - - - - verify - - verify - - - + diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 9a0b62855..ab1c638b1 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -1,13 +1,13 @@ package org.eclipse.steady.kb; import java.util.HashMap; +import java.util.ArrayList; import java.io.IOException; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.logging.log4j.Logger; import com.github.packageurl.MalformedPackageURLException; import org.eclipse.steady.shared.util.FileUtil; @@ -17,6 +17,7 @@ import org.eclipse.steady.kb.task.ImportAffectedLibraries; import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.shared.util.StopWatch; @@ -33,7 +34,7 @@ public class Import implements Runnable { public static final String DELETE = "del"; public static final String SEQUENTIAL = "seq"; - private static Logger log = LoggerFactory.getLogger(Import.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); private StopWatch stopWatch = null; private Path vulnDir; @@ -97,20 +98,23 @@ public void run() { return; } //System.out.println("e"); - if (vuln.getCommits() == null || vuln.getCommits().size() == 0) { - log.error("No fix commits for vulnerability " + vuln.getVulnId()); - manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); - return; + if ((vuln.getCommits() == null || vuln.getCommits().size() == 0) + && (vuln.getArtifacts() == null || vuln.getArtifacts().size() == 0)) { + log.warn("No fix commits or affected artifacts for vulnerability " + vuln.getVulnId()); + vuln.setCommits(new ArrayList()); + //manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); + //return; + } else { + ExtractOrClone extractOrClone = + new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString())); + + this.stopWatch.lap("ExtractOrClone"); + extractOrClone.execute(); } - ExtractOrClone extractOrClone = - new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString())); - - this.stopWatch.lap("ExtractOrClone"); - extractOrClone.execute(); - - if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED && - manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.NO_FIXES) { + if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED + && manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.SKIP_CLONE) { + //&& manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.NO_FIXES) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.DIFF_DONE); ImportVulnerability importVulnerability = new ImportVulnerability(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index ebc357c70..3972a6595 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -1,49 +1,60 @@ package org.eclipse.steady.kb; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.beans.factory.annotation.Autowired; + import java.util.HashMap; import org.eclipse.steady.kb.Manager; -//import org.springframework.web.bind.annotation.RestController; -//import org.springframework.web.bind.annotation.CrossOrigin; -//import org.springframework.web.bind.annotation.RequestMapping; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//@RestController -//@CrossOrigin("*") -//@RequestMapping("/") -class ImporterController { - - private static Logger log = LoggerFactory.getLogger(ImporterController.class); - - private Thread importerCacheFetch = null; - - //@RequestMapping("/start") - public void start() { - - HashMap mapCommandOptionValues = new HashMap(); - Manager manager = new Manager(); - - this.importerCacheFetch = - new Thread( - new Runnable() { - public void run() { - while (true) { - manager.start("/kb-importer/data/statements", mapCommandOptionValues); - - long interval = 3600*24*1000; - try { - Thread.sleep(interval); - } catch (InterruptedException e) { - ImporterController.log.error( - "Interrupted exception: " - + e.getMessage()); - } - } - } - }, - "ImporterCacheFetch"); - this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); - } -} +@RestController +@CrossOrigin("*") +public class ImporterController { + + private static Logger log = LoggerFactory.getLogger(ImporterController.class); + + private Thread importerCacheFetch = null; + private final Manager manager; + + @Autowired + ImporterController() { + HashMap mapCommandOptionValues = new HashMap(); + manager = new Manager(); + + System.out.println("ImportController Constructor"); + + this.importerCacheFetch = + new Thread( + new Runnable() { + public void run() { + while (true) { + manager.start("/kb-importer/data/statements", mapCommandOptionValues); + + long interval = 3600*24*1000; + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + ImporterController.log.error( + "Interrupted exception: " + + e.getMessage()); + } + } + } + }, + "ImporterCacheFetch"); + this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); + + } + + @GetMapping("/start") + public String start() { + System.out.println("ImportController.start()"); + this.importerCacheFetch.start(); + return "Started importing vulnerabilities"; + } + +} \ No newline at end of file diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java old mode 100755 new mode 100644 index bf847b257..78e4262fe --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -1,47 +1,32 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ package org.eclipse.steady.kb; -//import org.springframework.boot.autoconfigure.SpringBootApplication; -//import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -//import org.springframework.boot.SpringApplication; -import java.util.HashMap; +import java.util.Arrays; -/** - *

Main class.

- */ +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication public class Main { - /** - *

main.

- * - * @param _args an array of {@link java.lang.String} objects - */ - public static void main(String[] _args) { - // command.run(mapCommandOptionValues); - - HashMap mapCommandOptionValues = new HashMap(); - Manager manager = new Manager(); - for (String arg : _args) { - arg.replace("-", ""); - mapCommandOptionValues.put(arg, true); - } - manager.start("/kb-importer/data/statements", mapCommandOptionValues); - //SpringApplication.run(Main.class, _args); - } + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } + +// @Bean +// public CommandLineRunner commandLineRunner(ApplicationContext ctx) { +// return args -> { +// +// System.out.println("Let's inspect the beans provided by Spring Boot:"); +// +// String[] beanNames = ctx.getBeanDefinitionNames(); +// Arrays.sort(beanNames); +// for (String beanName : beanNames) { +// System.out.println(beanName); +// } +// +// }; +// } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 811fe7b39..39108195b 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -38,6 +38,7 @@ public enum VulnStatus { DIFF_DONE, IMPORTED, FAILED, + SKIP_CLONE, FAILED_IMPORT_LIB, FAILED_IMPORT_VULN, NO_FIXES @@ -92,6 +93,8 @@ public synchronized void start( Set vulnDirsPaths = search.search(Paths.get(statementsDir.getPath())); for (Path dirPath : vulnDirsPaths) { File vulnDir = dirPath.toFile(); + + System.out.println("vuln dir " + vulnDir.getName()); log.info("Found vulnerability directory: " + vulnDir.getName()); String vulnId = vulnDir.getName().toString(); setVulnStatus(vulnId, VulnStatus.NOT_STARTED); @@ -129,6 +132,7 @@ private void setUploadConfiguration(HashMap args) { (uploadConstruct != null ? CoreConfiguration.ConnectType.READ_WRITE.toString() : CoreConfiguration.ConnectType.READ_ONLY.toString())); + System.out.println("setUploadConfiguration"); } public void kaybeeUpdate() throws IOException, InterruptedException { @@ -158,6 +162,7 @@ public String status() { int failed = 0; int failed_vuln = 0; int failed_lib = 0; + int skip_clone = 0; for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { switch (vulnStatus) { case NOT_STARTED: @@ -184,26 +189,43 @@ public String status() { case FAILED: failed += 1; break; + case SKIP_CLONE: + skip_clone += 1; + break; default: break; } } - return "imported = " - + Integer.toString(imported) - + "\nnot_started = " + String statusStr = + "\nnot_started: " + Integer.toString(not_started) - + "\nextracting/cloning = " + + "\nextracting/cloning: " + Integer.toString(processing) - + "\ndiff_done = " + + "\nimporting vuln/libraries: " + Integer.toString(diff_done) - + "\nno_fixes = " - + Integer.toString(no_fixes) - + "\nfailed extract/clone = " - + Integer.toString(failed) - + "\nfailed vuln = " - + Integer.toString(failed_lib) - + "\nfailed lib = " - + Integer.toString(failed_vuln) + "\n"; + + "\nimported: " + + Integer.toString(imported); + if (no_fixes > 0) { + statusStr += "\nno_fixes: " + + Integer.toString(no_fixes); + } + if (failed > 0) { + statusStr += "\nfailed extract/clone: " + + Integer.toString(failed); + } + if (failed_vuln > 0) { + statusStr += "\nfailed vuln: " + + Integer.toString(failed_lib); + } + if (failed_lib > 0) { + statusStr += "\nfailed lib: " + + Integer.toString(failed_vuln); + } + if (skip_clone > 0) { + statusStr += "\nskip_clone: " + + Integer.toString(skip_clone); + } + return statusStr + "\n"; } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index a4e267efe..5192bee29 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -50,7 +50,7 @@ public void execute() { //System.out.println("else"); //System.out.println("skipping clone"); log.info("Skipping clone for vulnerability " + this.vulnId); - manager.setVulnStatus(this.vulnId, Manager.VulnStatus.FAILED); + manager.setVulnStatus(this.vulnId, Manager.VulnStatus.SKIP_CLONE); //clone(vuln, dirPath); } log.info("ExtractOrClone : done (" + dirPath + ")"); @@ -107,7 +107,7 @@ public void clone(Vulnerability vuln, String dirPath) { List commits = vuln.getCommits(); if (commits.size() == 0) { log.warn("No commits for vulnerability " + this.vulnId); - manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); + //manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); return; } diff --git a/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.command.Command b/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.command.Command deleted file mode 100644 index d15cf97bf..000000000 --- a/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.command.Command +++ /dev/null @@ -1,3 +0,0 @@ -org.eclipse.steady.kb.command.Import -org.eclipse.steady.kb.command.Help -org.eclipse.steady.kb.command.Version \ No newline at end of file diff --git a/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.task.Task b/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.task.Task deleted file mode 100644 index 6925cbda3..000000000 --- a/kb-importer/src/main/resources/META-INF/services/org.eclipse.steady.kb.task.Task +++ /dev/null @@ -1,2 +0,0 @@ -org.eclipse.steady.kb.task.ImportVulnerability -org.eclipse.steady.kb.task.ImportAffectedLibraries \ No newline at end of file diff --git a/kb-importer/src/main/resources/application.properties b/kb-importer/src/main/resources/application.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/kb-importer/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties deleted file mode 100644 index cdd119fc3..000000000 --- a/kb-importer/src/main/resources/steady-kb-importer.properties +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is part of Eclipse Steady. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors -# - -# Time between consecutive starts -# Default: -# TODO \ No newline at end of file diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java deleted file mode 100755 index ed3dd3b99..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb; - -import org.junit.Test; - -public class MainTest { - private static final String SPACE = " "; - -/* - @Test - public void testHelp() { - String args = "help"; - Main.main(args.split(SPACE)); - } - - @Test - public void testVersion() { - String args = "version"; - Main.main(args.split(SPACE)); - }*/ -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java deleted file mode 100755 index 73d50412c..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import org.apache.commons.io.FileUtils; -import org.eclipse.steady.kb.model.Commit; -import org.eclipse.steady.kb.util.ConstructSet; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import org.eclipse.steady.ConstructChange; - -public class TestConstructs { - private static final String REPO = "rootDir"; - private static final String ZIP = "COLLECTIONS-580.zip"; - private static String destPathToUnzip = System.getProperty("java.io.tmpdir"); - - @Before - public void setup() { - String path = ConstructSet.class.getClassLoader().getResource(ZIP).getPath(); - // For some OS slash is not added at the end of tmp dir - if (!destPathToUnzip.endsWith(File.separator)) { - destPathToUnzip = destPathToUnzip + File.separator; - } - - ZipUtil.unzip(path, destPathToUnzip); - } - - @Test - public void testImport() { - Commit commit = new Commit(); - commit.setBranch("master"); - commit.setCommitId("b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b"); - commit.setDirectory( - destPathToUnzip + REPO + File.separator + "b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b"); - commit.setTimestamp("1447974481000"); - commit.setRepoUrl("https://github.com/apache/commons-collections"); - - Map> changes = new HashMap>(); - Set constructChanges = ConstructSet.identifyConstructChanges(commit, changes); - ConstructChange contructChangeFirstElement = (ConstructChange) constructChanges.toArray()[0]; - assertEquals(150, constructChanges.size()); - assertEquals("1447974481000", contructChangeFirstElement.getCommittedAt()); - assertEquals( - "https://github.com/apache/commons-collections", contructChangeFirstElement.getRepo()); - assertNotNull(contructChangeFirstElement.getRepoPath()); - assertNotNull(contructChangeFirstElement.getConstruct()); - assertNotNull(contructChangeFirstElement.getType()); - } - - @AfterClass - public static void cleanup() { - try { - FileUtils.deleteDirectory(new File(destPathToUnzip + REPO)); - } catch (IOException e) { - System.out.println(e.getMessage()); - } - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java deleted file mode 100644 index 4d2a19058..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import org.apache.commons.io.FileUtils; -import org.eclipse.steady.kb.model.Commit; -import org.eclipse.steady.kb.util.ConstructSet; -import org.eclipse.steady.shared.enums.ConstructChangeType; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import org.eclipse.steady.ConstructChange; - -public class TestPythonConstructs { - private static final String REPO = "CVE-2016-2048"; - private static final String ZIP = "CVE-2016-2048.zip"; - private static String destPathToUnzip = System.getProperty("java.io.tmpdir"); - - @Before - public void setup() { - String path = ConstructSet.class.getClassLoader().getResource(ZIP).getPath(); - if (!destPathToUnzip.endsWith(File.separator)) { - destPathToUnzip = destPathToUnzip + File.separator; - } - - ZipUtil.unzip(path, destPathToUnzip); - } - - @Test - public void testImport() { - Commit commit = new Commit(); - commit.setBranch("master"); - commit.setCommitId("adbca5e4db42542575734b8e5d26961c8ada7265"); - commit.setDirectory( - destPathToUnzip + REPO + File.separator + "adbca5e4db42542575734b8e5d26961c8ada7265"); - commit.setTimestamp("1447974481000"); - commit.setRepoUrl("https://github.com/django/django"); - - Map> changes = new HashMap>(); - Set constructChanges = ConstructSet.identifyConstructChanges(commit, changes); - assertEquals(6, constructChanges.size()); - ConstructChange constructChangeToValidate = null; - for (ConstructChange constructChange : constructChanges) { - if (constructChange - .getConstruct() - .getId() - .getQualifiedName() - .equals("django.contrib.admin.options")) { - constructChangeToValidate = constructChange; - break; - } - } - assertEquals("1447974481000", constructChangeToValidate.getCommittedAt()); - assertEquals("https://github.com/django/django", constructChangeToValidate.getRepo()); - assertEquals("master:django/contrib/admin/options.py", constructChangeToValidate.getRepoPath()); - assertNotNull(constructChangeToValidate.getConstruct().getDigest()); - assertNotNull(constructChangeToValidate.getConstruct().getContent()); - assertEquals("options", constructChangeToValidate.getConstruct().getId().getName()); - assertEquals( - "django.contrib.admin.options", - constructChangeToValidate.getConstruct().getId().getQualifiedName()); - assertEquals(ConstructChangeType.MOD, constructChangeToValidate.getType()); - } - - @AfterClass - public static void cleanup() { - try { - FileUtils.deleteDirectory(new File(destPathToUnzip + REPO)); - } catch (IOException e) { - System.out.println(e.getMessage()); - } - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java deleted file mode 100755 index 36e241d41..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Enumeration; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import org.apache.commons.compress.utils.IOUtils; - -public class ZipUtil { - public static void unzip(String zipPath, String destPathToUnzip) { - try (java.util.zip.ZipFile zipFile = new ZipFile(zipPath)) { - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - File entryDestination = new File(destPathToUnzip, entry.getName()); - if (entry.isDirectory()) { - entryDestination.mkdirs(); - } else { - entryDestination.getParentFile().mkdirs(); - try (InputStream in = zipFile.getInputStream(entry); - OutputStream out = new FileOutputStream(entryDestination)) { - IOUtils.copy(in, out); - } - } - } - } catch (IOException e) { - System.out.println("unzip failed " + e.getMessage()); - } - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java deleted file mode 100755 index 85b4abdaf..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/command/CommandParserTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import java.util.HashMap; -import org.apache.commons.cli.Options; -import org.eclipse.steady.kb.exception.CommandLineParserException; -import org.junit.Test; - -public class CommandParserTest { - - private static final String UPLOAD_CONSTRUCT_OPTION = "u"; - private static final String DIRECTORY_OPTION = "d"; - private static final String OVERWRITE_OPTION = "o"; - private static final String VERBOSE_OPTION = "v"; - - private static final String UPLOAD_LONG_OPTION = "upload"; - private static final String VERBOSE_LONG_OPTION = "verbose"; - private static final String OVERWRITE_LONG_OPTION = "overwrite"; - private static final String DIRECTORY_LONG_OPTION = "directory"; - - @Test - public void testParse() throws CommandLineParserException { - Options options = new Options(); - options.addRequiredOption( - DIRECTORY_OPTION, - DIRECTORY_LONG_OPTION, - true, - "directory containing mutiple commit folders with meta files"); - options.addOption( - OVERWRITE_OPTION, - OVERWRITE_LONG_OPTION, - false, - "overwrite the bug if it already exists in the backend"); - options.addOption(VERBOSE_OPTION, VERBOSE_LONG_OPTION, false, "Verbose mode"); - options.addOption( - UPLOAD_CONSTRUCT_OPTION, UPLOAD_LONG_OPTION, false, "Upload construct changes"); - - String _args = "-d test -u -v"; - HashMap parsedCommands = CommandParser.parse(_args.split(" "), options); - assertEquals("test", parsedCommands.get(DIRECTORY_OPTION)); - assertTrue((boolean) parsedCommands.get(VERBOSE_OPTION)); - assertTrue((boolean) parsedCommands.get(UPLOAD_CONSTRUCT_OPTION)); - assertFalse((boolean) parsedCommands.get(OVERWRITE_OPTION)); - } - - @Test(expected = CommandLineParserException.class) - public void testRequiredOptions() throws CommandLineParserException { - Options options = new Options(); - options.addRequiredOption( - DIRECTORY_OPTION, - DIRECTORY_LONG_OPTION, - true, - "directory containing mutiple commit folders with meta files"); - options.addOption( - OVERWRITE_OPTION, - OVERWRITE_LONG_OPTION, - false, - "overwrite the bug if it already exists in the backend"); - options.addOption(VERBOSE_OPTION, VERBOSE_LONG_OPTION, false, "Verbose mode"); - options.addOption( - UPLOAD_CONSTRUCT_OPTION, UPLOAD_LONG_OPTION, false, "Upload construct changes"); - - String _args = "-u -v"; - CommandParser.parse(_args.split(" "), options); - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java deleted file mode 100755 index c13b47714..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/command/ImportTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import org.eclipse.steady.kb.task.MockBackConnector; -import org.eclipse.steady.kb.model.Vulnerability; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertNull; -import java.util.HashMap; -import org.apache.commons.cli.Options; - -import java.io.IOException; -import org.eclipse.steady.kb.exception.ValidationException; -import com.google.gson.JsonSyntaxException; -import org.eclipse.steady.backend.BackendConnectionException; -import org.junit.Test; - -public class ImportTest { - @Test - public void getOptions() { - Command command = new Import(); - Options options = command.getOptions(); - assertEquals(options.getOptions().size(), 4); - assertTrue(options.hasOption("d")); - assertTrue(options.hasOption("u")); - assertTrue(options.hasOption("v")); - assertTrue(options.hasOption("o")); - } - - @Test - public void validate() throws ValidationException { - Command command = new Import(); - HashMap args = new HashMap(); - args.put("d", ImportTest.class.getClassLoader().getResource("testRootDir1").getPath()); - command.validate(args); - } - - @Test(expected = ValidationException.class) - public void validationFail() throws ValidationException { - Command command = new Import(); - HashMap args = new HashMap(); - args.put("d", "invalidDir"); - command.validate(args); - } - - @Test - public void testImportSkipExistingBug() - throws JsonSyntaxException, IOException, BackendConnectionException { - Vulnerability vuln = new Vulnerability(); - vuln.setVulnId("CVE-TEST01"); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("o", false); - args.put("v", false); - Import command = new Import(mockBackendConnector); - command.run(args); - assertNull(mockBackendConnector.getUploadJson()); - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java deleted file mode 100644 index 231d79769..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.eclipse.steady.kb.task; - -import java.util.ArrayList; -import org.eclipse.steady.backend.BackendConnectionException; -import org.eclipse.steady.backend.BackendConnector; -import org.eclipse.steady.goals.GoalContext; -import org.eclipse.steady.shared.enums.AffectedVersionSource; -import org.eclipse.steady.shared.json.model.AffectedLibrary; -import org.eclipse.steady.shared.json.model.Artifact; -import org.eclipse.steady.shared.json.model.Bug; -import org.eclipse.steady.shared.json.model.LibraryId; - -public class MockBackConnector extends BackendConnector { - private String uploadJson; - - @Override - public AffectedLibrary[] getBugAffectedLibraries( - String _bugId, - String _group, - String _artifact, - String _version, - AffectedVersionSource _source) - throws BackendConnectionException { - if (_artifact.equals("javaee-api") && _version.equals("6.0")) { - AffectedLibrary[] arr1 = { - new AffectedLibrary(new Bug(_bugId), new LibraryId("javax", "javaee-api", "6.0"), true) - }; - return arr1; - } - return null; - } - - @Override - public Artifact getArtifact(String _g, String _a, String _v) throws BackendConnectionException { - if (_a.equals("javax.faces") && _v.equals("2.3.7")) { - return null; - } - return new Artifact(_g, _a, _v); - } - - @Override - public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) - throws BackendConnectionException { - ArrayList artifacts = new ArrayList<>(); - if (_g.equals("javax") && _a.equals("javaee-api")) { - artifacts.add(new Artifact("javax", "javaee-api", "6.0")); - artifacts.add(new Artifact("javax", "javaee-api", "7.0")); - artifacts.add(new Artifact("javax", "javaee-api", "8.0")); - } else if (_g.equals("javax") && _a.equals("javaee-web-api")) { - artifacts.add(new Artifact("javax", "javaee-web-api", "6.0")); - artifacts.add(new Artifact("javax", "javaee-web-api", "7.0")); - artifacts.add(new Artifact("javax", "javaee-web-api", "8.0.1")); - } else { - return null; - } - - return artifacts.toArray(new Artifact[artifacts.size()]); - } - - @Override - public void uploadBugAffectedLibraries( - GoalContext _g, String _bugId, String _json, AffectedVersionSource _source) - throws BackendConnectionException { - uploadJson = _json; - } - - @Override - public void uploadChangeList(String _bug, String _json) throws BackendConnectionException { - uploadJson = _json; - } - - @Override - public String getCVE(String _bugId) throws BackendConnectionException { - return "{\n" + " \"summary\": \"Test Desc\"\n" + "}"; - } - - @Override - public boolean isBugExisting(String _bug) throws BackendConnectionException { - if (_bug.equals("CVE-TEST01")) { - return true; - } - return false; - } - - public String getUploadJson() { - return uploadJson; - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java deleted file mode 100644 index 36832f40b..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.eclipse.steady.kb.task; - -import java.io.IOException; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Arrays; - -import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.Import; -import org.eclipse.steady.kb.Manager; -import org.eclipse.steady.kb.util.Metadata; -import org.eclipse.steady.shared.util.VulasConfiguration; -import com.github.packageurl.MalformedPackageURLException; -import com.google.gson.JsonSyntaxException; - -import org.junit.Test; -import org.junit.Before; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.junit.runner.RunWith; - -//@RunWith(Parameterized.class) -public class TestExtractOrClone { - - Manager manager; - ClassLoader classLoader; - String dirPath; - - /* @Before - public void initialize() { - this.manager = new Manager(); - classLoader = getClass().getClassLoader(); - this.dirPath = classLoader.getResource("testRootDir7").getPath(); - } - - public TestExtractOrClone(String dirName) { - classLoader = getClass().getClassLoader(); - this.dirPath = classLoader.getResource(dirName).getPath(); - } - - @Parameterized.Parameters - public static List directories() { - return Arrays.asList(new Object[][] { - { "testRootDir6" }, - { "testRootDir7" } - }); - }*/ - - @Test - public void testClone() throws IOException { - - this.manager = new Manager(); - classLoader = getClass().getClassLoader(); - this.dirPath = classLoader.getResource("testRootDir7").getPath(); - - File dir = new File(dirPath); - String statementPath = dirPath + File.separator + "statement.yaml"; - - Vulnerability vuln = Metadata.getFromYaml(statementPath); - - HashMap args = new HashMap(); - args.put("v", false); - args.put(Import.OVERWRITE_OPTION, false); - args.put(Import.DIRECTORY_OPTION, ""); - - ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, dir); - extractOrClone.execute(); - - File commitDir1 = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); - File commitDir1before = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "before"); - File commitDir1after = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "after"); - File someJavaFile = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8/after/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java"); - File commitDir2 = new File(dirPath + File.separator + "d3acf45ea4db51fa5c4cbd0bc0e7b6d9ef805e6"); - File commitDir3 = new File(dirPath + File.separator + "e0de9126ed8cf25cf141d3e66420da94e350708"); - - org.junit.Assert.assertEquals(commitDir1before.exists(), true); - org.junit.Assert.assertEquals(commitDir1after.exists(), true); - - // TODO : count number of files instead - org.junit.Assert.assertEquals(commitDir1before.list().length > 0, true); - org.junit.Assert.assertEquals(commitDir1after.list().length > 0, true); - org.junit.Assert.assertEquals(someJavaFile.exists(), true); - org.junit.Assert.assertEquals(commitDir2.exists(), true); - org.junit.Assert.assertEquals(commitDir3.exists(), true); - - // clean directories after testing - Files.delete(Paths.get(commitDir1.getPath())); - Files.delete(Paths.get(commitDir2.getPath())); - Files.delete(Paths.get(commitDir3.getPath())); - // TODO: remove directory git-repos before and/or after testing - } - -} \ No newline at end of file diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java deleted file mode 100644 index a14d38c1d..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.eclipse.steady.kb.task; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import org.eclipse.steady.backend.BackendConnectionException; -import org.eclipse.steady.core.util.CoreConfiguration; -import org.eclipse.steady.kb.command.ImportTest; -import org.eclipse.steady.kb.model.Artifact; -import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.util.Metadata; -import org.eclipse.steady.shared.json.model.AffectedLibrary; -import org.eclipse.steady.shared.util.VulasConfiguration; -import org.junit.Test; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.packageurl.MalformedPackageURLException; -import com.google.gson.JsonSyntaxException; - -public class TestImportAffectedLibraries { - @Test - public void testImportAffectedLibs() - throws MalformedPackageURLException, BackendConnectionException, JsonSyntaxException, - IOException { - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (CoreConfiguration.ConnectType.READ_WRITE.toString())); - ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); - Vulnerability vuln = - Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("v", false); - args.put("o", false); - importAffectedLibs.execute(vuln, args, mockBackendConnector); - ObjectMapper mapper = new ObjectMapper(); - List listAffectedLibUpserted = - mapper.readValue( - mockBackendConnector.getUploadJson(), - mapper.getTypeFactory().constructCollectionType(List.class, AffectedLibrary.class)); - org.junit.Assert.assertEquals(listAffectedLibUpserted.size(), 3); - } - - @Test - public void testImportAffectedLibsOverwrite() - throws MalformedPackageURLException, BackendConnectionException, JsonSyntaxException, - IOException { - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (CoreConfiguration.ConnectType.READ_WRITE.toString())); - ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); - Vulnerability vuln = - Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("o", true); - args.put("v", false); - importAffectedLibs.execute(vuln, args, mockBackendConnector); - ObjectMapper mapper = new ObjectMapper(); - List listAffectedLibUpserted = - mapper.readValue( - mockBackendConnector.getUploadJson(), - mapper.getTypeFactory().constructCollectionType(List.class, AffectedLibrary.class)); - org.junit.Assert.assertEquals(listAffectedLibUpserted.size(), 4); - } - - @Test - public void testImportAffectedLibsNullData() - throws MalformedPackageURLException, BackendConnectionException, JsonSyntaxException, - IOException { - ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); - Vulnerability vuln = - Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); - vuln.setArtifacts(new ArrayList()); - HashMap args = new HashMap(); - args.put("o", false); - importAffectedLibs.execute(vuln, args, null); - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java deleted file mode 100644 index eeb403b51..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.eclipse.steady.kb.task; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import org.apache.commons.io.FileUtils; -import org.eclipse.steady.backend.BackendConnectionException; -import org.eclipse.steady.core.util.CoreConfiguration; -import org.eclipse.steady.kb.ZipUtil; -import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.util.ConstructSet; -import org.eclipse.steady.kb.util.Metadata; -import org.eclipse.steady.shared.json.model.Bug; -import org.eclipse.steady.shared.util.VulasConfiguration; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.JsonSyntaxException; - -public class TestImportVulnerability { - - private static final String ZIP = "CVE-2016-2048.zip"; - private static final String REPO = "CVE-2016-2048"; - private static String destPathToUnzip = System.getProperty("java.io.tmpdir"); - - @Before - public void setup() { - String path = ConstructSet.class.getClassLoader().getResource(ZIP).getPath(); - if (!destPathToUnzip.endsWith(File.separator)) { - destPathToUnzip = destPathToUnzip + File.separator; - } - - ZipUtil.unzip(path, destPathToUnzip); - } - - @Test - public void testImportVuln() throws JsonSyntaxException, IOException, BackendConnectionException { - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (CoreConfiguration.ConnectType.READ_WRITE.toString())); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(destPathToUnzip + REPO); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("d", destPathToUnzip + REPO); - args.put("o", false); - args.put("v", false); - ImportVulnerability importVuln = new ImportVulnerability(); - importVuln.execute(vuln, args, mockBackendConnector); - ObjectMapper mapper = new ObjectMapper(); - Bug bug = mapper.readValue(mockBackendConnector.getUploadJson(), Bug.class); - assertEquals(6, bug.getConstructChanges().size()); - assertEquals("CVE-2016-2048-test2", bug.getBugId()); - assertNotNull(bug.getDescription()); - } - - @AfterClass - public static void cleanup() { - try { - FileUtils.deleteDirectory(new File(destPathToUnzip + REPO)); - } catch (IOException e) { - System.out.println(e.getMessage()); - } - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java deleted file mode 100644 index 6c8ba8ba2..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.eclipse.steady.kb.task; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import org.apache.commons.io.FileUtils; -import org.eclipse.steady.backend.BackendConnectionException; -import org.eclipse.steady.core.util.CoreConfiguration; -import org.eclipse.steady.kb.ZipUtil; -import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.util.ConstructSet; -import org.eclipse.steady.kb.util.Metadata; -import org.eclipse.steady.shared.json.model.Bug; -import org.eclipse.steady.shared.util.VulasConfiguration; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.JsonSyntaxException; - -public class TestImportVulnerability_CVE_2017_2617 { - - private static final String ZIP = "CVE-2017-2617.zip"; - private static final String REPO = "CVE-2017-2617"; - private static String destPathToUnzip = System.getProperty("java.io.tmpdir"); - - @Before - public void setup() { - String path = ConstructSet.class.getClassLoader().getResource(ZIP).getPath(); - if (!destPathToUnzip.endsWith(File.separator)) { - destPathToUnzip = destPathToUnzip + File.separator; - } - - ZipUtil.unzip(path, destPathToUnzip); - } - - @Test - public void testImportVuln() throws JsonSyntaxException, IOException, BackendConnectionException { - VulasConfiguration.getGlobal() - .setProperty( - CoreConfiguration.BACKEND_CONNECT, - (CoreConfiguration.ConnectType.READ_WRITE.toString())); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(destPathToUnzip + REPO); - MockBackConnector mockBackendConnector = new MockBackConnector(); - HashMap args = new HashMap(); - args.put("d", destPathToUnzip + File.separator + REPO); - args.put("o", false); - args.put("v", false); - ImportVulnerability importVuln = new ImportVulnerability(); - importVuln.execute(vuln, args, mockBackendConnector); - ObjectMapper mapper = new ObjectMapper(); - Bug bug = mapper.readValue(mockBackendConnector.getUploadJson(), Bug.class); - assertEquals("CVE-2017-2617", bug.getBugId()); - assertNotNull(bug.getDescription()); - } - - @AfterClass - public static void cleanup() { - try { - FileUtils.deleteDirectory(new File(destPathToUnzip + REPO)); - } catch (IOException e) { - System.out.println(e.getMessage()); - } - } -} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java deleted file mode 100755 index 0eabdf8ac..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import java.io.IOException; -import java.io.File; - -import org.eclipse.steady.kb.model.Commit; -import org.eclipse.steady.kb.model.Vulnerability; -import org.junit.Test; -import com.google.gson.JsonSyntaxException; - -public class MetadataTest { - @Test - public void testGetVulnMetadata() throws JsonSyntaxException, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir1").getPath(); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(path); - assertEquals(3, vuln.getArtifacts().size()); - assertEquals(3, vuln.getNotes().size()); - assertEquals("COLLECTIONS-580", vuln.getVulnId()); - } - - @Test(expected = IllegalArgumentException.class) - public void testInvalidVulnRootDir() throws JsonSyntaxException, IOException { - Metadata.getVulnerabilityMetadata("rootDir1test"); - } - - @Test(expected = IllegalArgumentException.class) - public void testNoVulnIdArg() throws Exception, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir2").getPath(); - Metadata.getVulnerabilityMetadata(path); - } - - @Test - public void testMissingNonMandatoryParams() throws JsonSyntaxException, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir3").getPath(); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(path); - assertNull(vuln.getNotes()); - assertEquals("COLLECTIONS-580", vuln.getVulnId()); - } - - @Test - public void testGetCommitMetadata() throws JsonSyntaxException, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("commitDir1").getPath(); - Commit commit = Metadata.getCommitMetadata(path); - assertEquals("master", commit.getBranch()); - assertEquals("b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b", commit.getCommitId()); - assertEquals("1447974481000", commit.getTimestamp()); - assertEquals("https://github.com/apache/commons-collections", commit.getRepoUrl()); - assertEquals(path, commit.getDirectory()); - } - - @Test - public void testMetadataArtifacts() throws JsonSyntaxException, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir4").getPath(); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(path); - assertEquals(3, vuln.getArtifacts().size()); - } - - @Test - public void testMetadataArtifactsPUrl() throws JsonSyntaxException, IOException { - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir5").getPath(); - Vulnerability vuln = Metadata.getVulnerabilityMetadata(path); - assertEquals(1, vuln.getArtifacts().size()); - assertEquals(false, vuln.getArtifacts().get(0).getAffected()); - assertEquals( - "pkg:maven://org.springframework.security/spring-security-config@5.1.1.RELEASE", - vuln.getArtifacts().get(0).getId()); - assertEquals("Manual review(frontend)", vuln.getArtifacts().get(0).getReason()); - } - - @Test(expected = IllegalArgumentException.class) - public void testInvalidCommitMetadataDir() throws JsonSyntaxException, IOException { - Metadata.getVulnerabilityMetadata("commitDir2"); - } - - @Test - public void testGetFromYaml() throws IOException { - - ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir1").getPath() + File.separator + "statement.yaml"; - Vulnerability vuln = Metadata.getFromYaml(path); - - System.out.println("vuln"); - System.out.println(vuln); - System.out.println(vuln.getArtifacts()); - - assertEquals(3, vuln.getArtifacts().size()); - assertEquals(3, vuln.getNotes().size()); - assertEquals("COLLECTIONS-580", vuln.getVulnId()); - } -} diff --git a/kb-importer/src/test/resources/COLLECTIONS-580.zip b/kb-importer/src/test/resources/COLLECTIONS-580.zip deleted file mode 100755 index 856678f44de57988723609c90df556063fea4293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107314 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

  • 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 diff --git a/kb-importer/src/test/resources/CVE-2011-4343/metadata.json b/kb-importer/src/test/resources/CVE-2011-4343/metadata.json deleted file mode 100644 index ada53c472..000000000 --- a/kb-importer/src/test/resources/CVE-2011-4343/metadata.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "vulnerability_id": "CVE-2011-4343", - "notes": [ - { - "links": [], - "text": "Information disclosure vulnerability in Apache MyFaces Core 2.0.1 through 2.0.10 and 2.1.0 through 2.1.4 allows remote attackers to inject EL expressions via crafted parameters." - } - ], - "affected_artifacts": [ - { - "id": "pkg:maven/javax/javaee-api@6.0", - "reason": "Reviewed manually", - "affected": true - }, - { - "id": "pkg:maven/javax/javaee-web-api@8.0.1", - "reason": "Reviewed manually", - "affected": false - }, - { - "id": "pkg:maven/javax/javaee-api@7.0", - "reason": "Reviewed manually", - "affected": false - }, - { - "id": "pkg:maven/javax/javaee-api@8.0", - "reason": "Reviewed manually", - "affected": true - }, - { - "id": "pkg:maven/javax/javaee-api@8.0.1-b5", - "reason": "Reviewed manually", - "affected": false - }, - { - "id": "pkg:maven/com.sun.faces/jsf-api@2.2.12", - "reason": "Reviewed manually", - "affected": true - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/CVE-2014-0094.zip b/kb-importer/src/test/resources/CVE-2014-0094.zip deleted file mode 100644 index e322940085726da7b066b38ba923a1fedc330303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24527 zcmd6v1z48Z*05;-LAtxUyCtQ&kxuFE5~RDkMOwN;I;0y3>F#d$ahx*_GjrxU&T;1a zc)bD_m(RZUdiJ~a@>w@qS_~Kj65z{+Y>K$dPhb4}*E0Z20DeV5DtcNvMk-obHbxo+ zc?baDpqMwBDGx6@$EN^*AZLI803e7D|3doVI$u76|8$+@z|W?Q4?jwP1^~eL-F3|L zZMF5ZZMCV5Z7j@xx#*V*|K_6oaV_REv{1hLPLO=-0#>uOZO+ruJG5GU+8FjKeqNQE z%KlVn@KKDUS9@7VZ!y47NDZ>i1bts6-dzM`uK1yOPVbY8VegCUUpSgr+ktLfb#)0Q z7ES~aI#nwkPxQ0D!yR=02;Iz&+3^ysK4eYvxIADpbq04{%!_8Dl$aQYTLq25c*=DGG+IvQrAPLxc~rD=TqenK{>K z3z1Lng&4rk1XrBf;Y7CN7`;_E5pQge%<{;fUpDoaqm^Sz7Jm`-dSGPNqie_N4CBj+ z_`0&>ezUSzezzi681?CySs7^c=vf)rv{@Nh=-G4_7#P`D3?9DHr!}BuV9?X0V`TZd z1VbKHO409E%eN)?Wx(@OTA_r81zGv<68P%_{(h}~8U4%aH*1xsj|;{d7Zqe-PLnqt zLohwl{EPxC@tFh%h5#j$JWw(J=*fr4E&CoDhcpm8%nF<=AG!v*d^lzR?g^E%3axk4 z3R%5x<34Us^2Ou6V_4|-m;$|&H9*4(%~`Xmt*%$InM+dw+qMPSycy}fjI|aOlPzSw zXMb9>i-PoWG*jm4rz4Rs+beq5PUje#*HIQn!2kX}aR2qN=;#|*SnL0v zx8slRKmUI{uI^tS{KbzM+{Rk>>+D1S{bKy%*^B=;09$<<+rM}ZWPUJ(v9`VTUqn&( zJ5Y2j%>E*d&fkS&VX1F!<78%OWMS^~7ujC@BW#Wi7S<;8e-Y8{pG16RZmVytt8Zy* zVf}yNeyvWvYz+*{8|~l^--ZVP07U(-aHX}awI4PYeQO($Z@>SryVf%`hab{_vid^u1Tsv?L}pg35jte{X0Hlj_eLa>51->x9*Rd$@|bSZ zJG~h=(M-z>8$aKm28c|*AXBkVE?^9xjI0mp&~YeLb}hMe4B{kq3FSEN>tV!ANl6)y zyKo-%D&~n;jE+bZ>pC!8cnLB&rn}OJFbxJR-ZcS-a*q?QYjE9%d+^4IP`G3z3i;B< zi90VvAcPwjqj=iOcw~YdgT7hMcxE&XhDrK7E`yb6 zsCNyRB0l9u4kB%6poq<6xHXn`89?yp0xypT8Np}ccF#^vD<#=_>y{;^V*$=)o?N@! zX7S#Wm0)GunyU4k2Xx)RC1Q^`F_MgdHg(#9%&MLwvSMc-gte46^EMT8G0^Uc1YOAb z3U|`pHZ#1?4u@B3Cz96y1!$2;Vsr*B<1q@aZfvvS1G5N=LM1)C##gi%4K1mZS(OVc?O_gxd8sVb#CMN(Y!SJZjQ06v*S~m%>52e;E zx87d%rLdp9{7`G(&>Lz#4R~BKjI}>Lfqbyx$cuNdtfT;|+tox%!d?z+1h%%_NM~K$ zwLc+f&$a&X&Bu$Y42CAenvAXjCwv?#sVxhfg}XYV{=yhCb%>cU84R6w3kK4_ZeU9b z^l-9s)y2tlhUxI52~)A|P?{g4DfGMnqIHmx&uyWc>5Ki?wU%Lnt=zi}2-Z$JbxXXR z01H1BhVFD;?IkR3wWqTXh8KaAyTpHg8ce9z1HjxM*wn9>kxRkiUgys?qMv3ygZBN3T zT0BX0CA@APrny|#&yw>hCd3;Dyh0H?OoQLzH4FW2ZtXih5+`xjJ1i?&@K%{4X#{x_ zIsiAI8=urQrqWMLmjPF!m?hDi2T@J%e9#r0KFc>g{TNhUA6WUJeS#1-{GH(u-B-Qb z1B#mnVL57y6gQvVvLG1l2iFJeU zEQ=-;L{KH!6;XWt)+96cPf#<81rtZ`$;xjc_k+&xl)c`I9+C~Uwv5@lcNxKq*g&xmkJsC=*dT%5M=rggvH6W+4oYP(4&QOltuWIf~P$Uv# z1`Ab{ab`rxUKD2N#dI6aTdgh77-LTBLT!F(@jO>Kp}do%h2NXAM>>of`g4T#SiuJ* z4gPx1SUueI7wZf}UY=fg`fQWH!7g3Kn^tTpvaeC_vt_|P6B^~FdINtzCpNa|o-sKKe0ai2-6NFincDQ-QS*aVYHt;t1* z4vloG+t`Mzuc8=>VpZ${o5(miB9X_Yj&6FNR|4K?$)#Wl*es4(O3w?m3v&Bb3?=b0N`0Xm04Z@# z;h9hlh^`V9VTX3sAQrg|qF``MvGju8wIZRbDn*P@($JE$`mE0ZT7Fi^TG^oR+yj zfD=45IUrSApMNq`PWlAuc~MniCPKWakcwQ3b3vyzDb0fY(F zu}=7eb)MI78!rSn>!uV5J%RN8$@p&3+I$wB!ikd&l(-A-r7hGR+iO$<0qvU2b0Vp{ z?t0R#(4pp8J_>-?o1umtLr@F_&2{)t0JTWfXI@Z89mj&7)*7 zUbO1!tVm3TFvwUoEURHr@d^b?ID!b3z@dhf%C2r9);yNV{cU8U!nvz_({0{NaKBsv>D%j-HoEqEo(e6n-*OACoMg}~8JzzN`lSS_w z-D9+f1XUIJ*K;8$Lu+i8bL$udss##USBR`{V4sm~I$^k-_V&=hDm|{|Ig1A%^oV&E? zKdw?%k|;b~)jWOozWi9-5M+Mlm3e*hp1s^tvl`k&yA2Vq6$lYw2-U%XSYl*47FDh7 z%Y0KR!7YbfW}lo{9xt8qE0VV5(c{n9)HWPEKpN!9h69NKQ^Q2V*{IVUS#{*v9}UQ& z2xus|99MQJWHOqL;_{!o($rv-6|N0N91Mh!`^Dn z;F|#38S~wl@O4$hIC9F$q}Xu6PMM!9{Agz5F0yoxh3aAM5y=CB*AVRMo3^D73tGt# zA;M`g>-)KUMqec9bHoPh z7Q?VQTwx0X1u{n?y;sjfHWsBjlYHXDKhmDXJKYY(3v%w&A}tY#_gh%9vrrTC;dZfx zs7v6C?f8%86#l-16N=4CLi;*TkaQM4DEfEA0tkP?%h1c8jlEitWrtl!auS zzDIRDKAz(vZTg&v)?x>_m?(=al>=zxmMB-tfh2Rn}W%8PYH{O3#XoxNkbW`Mts>8Dz zClAED&8QI~?&kA*GBo7NqKhgT)-n6Ur!Zx&JT^&K?KG#8$=`_wC!V+l9?K!WRA|qx zMfe0-4}_4LsptK?FhzFbkO8jgRSs+BheJlooGA~p8-rlwMHYpNkeS(<{ws4i$4JNM zm8TTuaEya44rwDJ<9U-zm%~uR7g&|?)h8_D>xyr4LoDNp zz!y;!F$C3y&yT#g%*C)MHT5##`k01}DiYH7wjmH1%afkE9a}}dsl;5qL9zs1NnKYt zp+%vOAhUgacyE^TdH)krgH+Q(JzXN0cF~Ij=L;wC8tg-xQz&K|Q*hu6eOJC71*1=W zSp=i>-fXq0iOYHM@aKohvSd&d|Si(8qG)Q}cj#XR$rq$pK zXI6239yJV3OWXQjTHQ6dmYs*45s3E&iQc7e+IJIpqTzOt-(|?DuKbupMO1z&N$@xZ zX8JNOiNg4F*(`#KCkCvs_|;J*4*Ti&vn17ZJUOyzzbA|7HS~t!W}I_nseApnwzaJu z={K|L;4&R+VL~=$pJBre2>0xw>pR4XGAgR42ZkXrqyxAmgEKAx@&^oiZuHs0^5}vB z2uLGhYh+&qK+o3ICBL(RK~!keZ|UL!k*%c(`dhL%DEPJsy4HsJ z6f16DAY-ydK`@-{I_yAJTgRHX4*Nbqe0yq)~bL>MzjjTn~;Dc;i* z0?y9S6<~^#pI)`DjJ(`>mch0Q;YiRW#LEJO7xz|7E@|rw&vzGO{e*M6j#@m;=|3zBqCz#+!ZR{|NE7P#o*iXy z%qD%wHrwOO`lY8=ay}h?gmJ0N39|Pm8N_0!t!JX2i`PqU19lxZ?$SkqrAs~>dSz>b z!^kt6TP}m))L_Wpj0D~doLn=o#4Aa>#byf>ivWq!9DA2sFMDpOf0~Ot+F5CvXY;(w zViT7EeOIZ^rBGj$y|I;~I1>VF2sw)P=5?}w461A`Q*w*o`_d<( z?c`u4M8`VYE*bpe>4P^|lsL;t+jhpNQvut$ay8q)UCfyEretU@g5E7Zso}8`+8tMl zLE0VdQ{z*lJzNKG#Jd}Vpz;nzU39}}S{6yg_ah-+EJBVoyeiE^3PIqw>>Vi+6tn7B zILrfm)q;%R4;s(USEwelJ!c-2%7|Mwa2N#)9@rFi^7@HJ1oeTklpAG?D2lWlISH=* z2iY8Q$X0Wo$;P7L$)gg!-powo&|Av+(S}3h>T_iH-Q}unfcscw;p0i3H2eDtKZ}o} z=}TjFcylf`c(UOgAc(ca!*E2Ona@5v3usX=G<9~j%n2o*KaQ@+=NybJr{E#b25r~^ z*aobxG$}wEoaHrC-lEw~6zIU;YdE}C416lTJE$q_ZY8sr&?OA+4VdA zSbT%@=KOGk!W5ayc@;q;`a{2QPySmbzD=Y+Fky#_5mKwOj-#`1wr5!b{wI6$&N~X-Ik%d z49-JwK_16dbT>3G5bqjB0&qHsq0tykY;(o-7Q`+d+0VDjXG`zHil(YKGV6?%1z6&J z4{~IpFzr!j)vduz9yeQW;Iq_o6@_1m$kNHmu0Wh8yGId>7mMs6*l4XyFWIzk!3u{) zD*B%qKh=#47DcXv7pSm68p8OSn%CIR#_Y(zf+_(&KliUL^l?W3wCqkq}27FKB zu!LB5-740-vV;_)(WB3pbCl^$Wd|Sic`F6w(T{e9^f>sd`dpXzjjA2r3BsFS+`PRN zl56TUKx0}4G+GhJ9EGrwWHAP!o9-W_Wuxw*mcRw?7R**njhmvFh2S|XwmU)C?E)Qc zXfYpaF`El%5uiox*+F)SqFhrH_ z=Y4{E2G>;%mwF@`rSu6(gcG5E68rMwNNf$|-P(as9nTi_NKY(gVGodYrDnv0_cjuw z9E-a_2CpPuc}%TnEREh}U~cSTXB<~=e%^4*v}nXeZqlG8-Dg7e=CZOZ-;8eVt?j&; zXr@6!vJmV>YfAhQ&%iWcMOKu|4gmdRBBY=VjRh>LXzLX}3bc^eE~z}tYy(cTv@RK6 zA*}51QHhl&Wpcd7_LvG49(WLBEqx}-7l*u4^|9m7bMXM=BvdR&`jwF!2|5Lfj)DBL zA`6gAbd{&<66?Ja_dm5<|MnJxnf5F5ua8#0yV3CjTMR!@d}}d$H_8ueF?>V$rN!{w zI6tt(@EGU!Er#!A`++TnKVkcIi{ZNwt$*Az`~Mr!Mqk&?`jzd^9h*O4{nlS-dxol! z1q=Y700jUL^FLt~&^OSwGqn|T)HSu!)7O*MwtZ+cnA`9h>Fb*4TYu{?e3{Od*Kaxu zE64%U{R}{ zJmMxH;!2r0nVoMEYyJ0|nM`A8idA!j-k5@htp!p*;~eg7;43scw$4G9NQ1rh_cp!V z4DHuHAPFmFJtdx*eNW%8tfoPjLfYYwV=al{VcDqSwfSk&BOllEg?&c|Ad>DoLUq4Z zBJ=J_Vz~n+boA?CXgQdM5z#b@=Ef(2w94RcxWy}MQ8_K13lXHHt6<>vEn2pk?VN;y zc6#oY9G5=HM%sY!IzdgzX{)$JRtcE^pSw#KA$uB{@XpqcFT3)%8XFS}70;G*0?^W| zt9MXGXk5B32dq*lML*n*X9^LIS)p<_+;MZT@l$AG4qBO8w((&|eeP*wCTDUk<~6}v zZuI&fHw31XlD?uf7zM(Mhd(=(UWJERM;d}01D8LV?px^AiWCMQHs(_8SoI+USJgYQ zhWcFzxis>%HYzuKX9H%_1AnA$zv*;b5@_+*<_| zs#C4FP^O1;gU`L1l|jSHH82yfLzbwA@DjHS4X{5_Ii2gVad;W1-T;p|D`dI>+;jBw z+jd~Xb@f8(aZ7B~96^4RH}g~$#jvg?Ttt{I(}rWYV8{*Z(T}N4wEx_!IDbSYgYIyp zR7n%YX55xfCyNCs9%xQNKlO~RVaEa0wz$qp=hL$+m&(}-bqHrh_4O?A(c1#DWo)o} zpl?>kZ@n$9zn*cl4Ia|O*WLb$jrDIFo3Ay;Z-?dkZ-@QnbbR;NLO*2eUzCpE@148Y z4;%lR(ed37(mxjBTebDwB=Ua)$uGs$chhM9O*Fr+wZ0q8=$}CQb*c5;gtq@6;qPRQ zKcW4mn$8`19mhO;n;r@P5cxl%{SRD@FLU|w`c0*^%Qa&?BUHA36-ZVm3u1;IEj;5g z5i0jipMChf`3w1_xw4n}cyxqtuK|!zM1p(MN)*<2T{|udZ^K5p7y!W9V-T~aAXJzI z0p_^4xaPR#Z1~p?pE-%2VL2=&jH*1ZtFNESIXKOP*7P7+XArug#%fE;V1O{s?doN`u|U4S?i4%g}-F*|yC?D`x}-7U@td?-8&y+}z|XYq}mBucwI z5d0OCQ9O6T7n{TWXPd+3tIg2~W$@MJkosnGFv$QyK;yr^G(-m3>y=zzTNBDj)}K3k zhb0DZozmug+j3}mfH)O8J#%-UH6?_P^K8I_{qi!| zbt5h1G;9zCjNjT?=u9ef9xE9q8MAHNWrXLBDRz zgFaSAdkH+&H7=w-fXz4m(`dLPS_1oIUwMX5yZ-0dlTvLrt)b`iv1}~B@3GyhG?b+c zpRBn0*rs#Yb@^Ne)pFSE__(_)J1VKqRRFJPXK{QkNWoedKJ?;S=qk>~?F{9j%lX;n zxP7oW2EW=I(_d_k2!LC7JruU)dbbezG~ZN{Umy+8ood z?m$1;9BmIa2i8wEM_H~PyWSU@!>WDl!RF}tW^=%Nu{jc!LEL_2b3jI_cxlFdwK>|e zYMk<( zdxG@A)aYK`bkgrqSc^sw3^Cl}mR{0q5W%iOLwlnE+=pB(0G#Ko(~V}e`n(}HsL?Z( zvDB-TANZBcas9>SNWuDIb5wq{Ip}USv(hG1|Ip?jekVa?Eikw5xA3WypB3%)V`mEt zh$_XK7sVOX%@_&xV=v`0qBx1U??YKp!4^rKav}07Q9Zc<@A#yS6Q_23Zv<{to+*oB zUx;WzWPqvaF0pzT1_>oC&2L_(dg9*dL@~8TzvFBQk6K=N6x{+ zR1F9tcbR9RTi#8DFjsGpNmZ{LE_~8^1XB#GCFTqRk`9=rk-?@Er$z7tYNN1jo(2z1 z;!C`WidJ#&ITw5aOUbL0eSv7SsI|t%!i{#|iR!)iHi83-o~bwiYrX{2cm)ik$=6sO z)7hwqS*aq^lh5P;d!4NKP;N!xLyB66A{9$p1oPXE%-~=%(k_h1DHB~!TN2&d(`RTi zKZ~-&H^NqfRpZJR_6aUWEoAVf>gB#j1KaPW-5Q^VEY6TfCqe_?7+!rDfSaymtTNCK zyZpIS)%m4lto(wHa9;Fl7KmvT@Wt)q#)PuxcVnvT-d9HbmoeJTZxQoA zE{7^o!A&qIxHa-xBcztFY?mcms*0t~qDtePIK6__Gm>FnJo#GlYHm zx)-vHQCcP>>uN8srs=5)6vFrwfE7XYGf8lKi*8v;HU3cBXW~V2=zSFiPugi-cgA{e zWDjIZx<+g*1!g||1WYG|!YiQNXBh$(pHF4MdnhNb2!XE(8ML5pZV(s+NIU9T!w<{f zfIbl!XIb2VEhz=`?78hp zoqG-f$(IBuv7yev2RFV9)_@RF(x*_!>GV90z$L(B!VNf$FgU6w^L_rlG(*_NB&uLq z58)-6F|Uk+`Uv=})w_0&9O?}`=L8OWLRsZGrZ+Kr#v?lXYlNE`z9&{jDyll1oU9fx zPb6M0N@4Xb0lAy7EmIgYsCz1J_1&oYl^{^msKR(B?>-I#d8cdH9n; zt*ou>m#uJGYO=k&;UdM3O_bL!7w^fuBj=oXMbOVNlQWR3!Ewo}O5trCxM%{hJm$lL zC`m?o*ITp@AQLITcmSd5M}|D4{dzxL>ekLd(SodU?oBzb7dhNrH5{i=>KAT6ex+WF2B+c?W&vCd>;SREU7PeeNO(>EJ;ZZ`;^vw9r0}=7+v>bE6mglbUo8gX34q@_rfzCA-(}iks)bgwYV$*;r zXMUW#;=V+9$oIxKWJ9m`c)`gqQZ(Z$bf(JvE&rKZc0 z6^TJ2Oc$g(gf13F5iWzf6Q2G{EwPbz8LU>UlqrxsabbfTrXN&|l$}K@C~Nn14}!zq z4}|5Z8TwXJiPFq{1S(ZmvI8dn9{dD}t$epin4x`@i zK`jaSNi9(?eNanO<+PYSZ11^GVzoFh^qav~k_gxjNAT{`4WS1(pCelKgIN-S z3u%m^LwJ~Jh2lK8$4q|3Df9sth6WzLOwtRoI6>5a<6a(ovIt_b0OGumc=kBalICcU zndzbqsv0Y3F0{k_nnAxZ-GzdeM-AfYQgnzWzs{_Qd}X$UjLY1F`J;1X=#@4@Eo+^o z>Y=qvg}lfbo@#UAsqOVjGGlc?tV=lo8bj9 zXX=_eVO_UFM9y9m6D7i2MC3~q`?bg+$-@r_VkFZT{t~77n1k>0=47BP* zOT;v80g#Zgi|(B?1+hqxLSop{)U8H%F|Hvc_r5!m`l zxE^=|3ncMKKDR1`6FWq8q{xdPK6to*j03TCY-|s&zN2x$wMS zOs288=F&T3j8CECbmsLZt`4^6<}Y(9rJ@PDy078H#JqRB8)c9D1asS*aIf)2ElFMm zAf1~d(jAazM~8m?Ic%c{Hly>9h0ruckx*!`!8aeAZ6dSL>+N*HVX`w$bW#$W4?8AN z-?5pIsw2HGPvjki9Y>`Akn&hKWoYJZlNZnYdi3+ua4yHQm7b&SIG&NbZTguZ^lD?y z^kCi?^A|5ZKa;o)MC%yflENv&nDSZE-|y`&Srt*a+&kOCCbs~#;}vv#0jTp7lNaJi zS^1?i&~&`dV(yY!zkj}~*8%9XyXA{X5qYYi2%!FP(&!@}h;y*-zJ%eL51g zSd9p*b0bV-i6XQuQL}PxPt{X`Iv;4!E0H;EZnDX1Kc#sEAvqVvoD)cfkVVXuwsaE> zs)S_qYEQtv<$W_qzEKG;?gX~%#xVom&vJ?Of_drv^i@Ap$WOS5#FDP_B(!#BzUpG3Okl z@T7)0>n5*V*jUe?yTE7|kaSsgCqi)b>9$bEHVB2)IFoM-K~12OK=cLYbYs$!+{^I( z{?Vcs)1noMQh4`HLU(M0_b+aeMZEj5Fj}7*p`}S%W2rJ9Z**7mY4MsHtT__DYj@*( zr}QyO+CmQ~u-cP*zWLY~bo?9^Pn<6-EzP9FGZC5R0QsCibu6}P?kf23_|0ux%D_cu z1N}IG58ay*K7%loE?T!{RaeSya?_?GUJ{RuwM12KM>V~9DQIu* zF~-YI813u1XPPrB879BjCGX9+=JFrx656kJ38wK^yTnBI!7iyF+LK_k4~kRee`Qgb zl7+;a4iB7+%6|+fpE4MESzwJVr;Cj6q70wPDtiPTqsGpTO=20!Rin8^&AM-ah^HCr zf(YTkF6krvVwXG==brC^oZe$NEL^?h98L~sYu{V@MJ}27NiG2s2`WN;kV};QC6|~! z$R)bpoG(qL^?I^+#*ZUjSy3WF%2__>)v{{c7#r@V>WOf+kTZ%kt_gao6ph6wrC|_Yqo5w# zyXTUbq)>UY=#npqpbsFo^cJp|4Kox1?%RQhbdY*fdm5(JG%RIfP7*vkS9M)&8YQ8D zIjr1FAsyT{rhIkdsEC%0hHYTY`o6@~j_GBY$uS2T*oD#Yr0*t?n z$;0+0edAgf$8iB^6DaI-tV=e}7EmF_8c6nx!Y)4(cSpf-t{&Zu3WlPBlH7Q6YVe4w zU(LeG!2)lXn_2zIMRhx0;{Dx>%KnGDBMB#T`Q$q4x93{a0+40#p7`g`?3wK|op+OX zbTwPS5`!>%<1(u*sqjiM>z}OcR}BdZJ(aMuxbz(C&6t)GTsEM@ZuQlpa+TXt;y%n* z=UT`4p$`-fbojjIF)v&@n{<2nnO-Aw=FVB;b=(K913V2Nzy8b@#n0PhqSbn`6UL~p*Y8xWb_=XFo(?C8Hoo=ndOEm0x8^v)&((L z^iI~U>T-=8#@4ekR(dWm@Q`yR&z|PSyLOHRaRnK}ntb4AjvBSH1$~a~wi+~vyiS|e zr4`Xta8hraVoV%eEAmN}VxA}`8VDA~nkZbeVB}8Mo6N;Yk-FBQAF?Crltj>)%skl2 zHeXyedsfMrpOWe>(0R30FWI%_&AVimF}e9f zMI($UNe&oA-;|<{gw#u_s)BT{OAP_w=IOzw9v7;nAg{pPvU<%jrW+9}G(GUbJj>f{ z&H9XsiK7*7$&tBLPUF=PIR_v7pulnEi>9&)BI=;UsIOv)Hx--mC{e5N2mGQZlN5;0 z<}MO^z}S5HCfCSSn!;BpGF3Y-5==iDe{?l){{mE0_KkhXBxJJjf?*CsS`EiYoZzTUe zG&&yB{D0Nx_!G4Ms?lNf!&(RbH{oNYs>C-Ul}EbLU;Qd6WZIB@7#_gv5zqw<*71|pMbR%0@P}htcz|Ef#%Yp`z%&G%E)ra+GohtH}Ey;tr zTcsn;(RiD*tq{oK+8>lokbSWhKEQhbGg-hEPY}6W4+&Ibh%$>RO(!HeqEGsA$@irR zJy=>!M(O?>?P)Vb<;f=GteP}PiVrN{L=5M0S%4O5)RVoSc)z#Zq2h!0 z#5mm`+V8B{Z&|ClCQ-6FT2oW{>6ZA-tLm># zOx9RGun%|(ZYJ?i8SC+3`7N%kTGS_vRv&d7Vy;7iB5ye!2^mc1j%|p0Pw;gnc-_l> zF-mY(ahFBB(qZ8snR4yGeFsFdRkGjgFm~fnh}A5?X$7*|1U2rkdl^9(uhgNo=08{2 zG4rtW9Q?cnv4Vetx8m+ASaEcf4sG^PbwZQO!NwESnTTr}E6`@se##UZe#7mP7XnaG zDr5bD?Q*UHMU!tR`fkP3q+|keuNwu|RNMYG#FD6fi{uoKGQ;wosiwUev~YF5H$X5& zuGq#UTe*|6jvSopCeosg(o55A&zQFYzdD>UPo;wGe!M z@J#fD52Yxb@anD%o%n*HfR>%fD>7Vgia}pDLE@6Uu-dsWLUee2CZoVZe;jV!Q$W(& zgUvX)gdx4H5{M0aaZJiGtZ?c-#iNLO{7SYf#!%YV7`R=2I(&u-Z!_4oQTrK<^So`6STmL@(m0H+ zm<8~h?Nib=TPddOd9!^EX)!<`Y~VlMh@SzVJ{+#{gSr^su!&zIXp|7=Aek=Fg(>#|-?B7*s+2TZW$vqVETJ z@d#w{$AEm*i5_77K(PGvyXv>6BZ)tPQ3m}XQTYP%vs?82;gNYn^!W!9{VW=NKbFEH ztXE(^Hc&rdeJ#enA5G^G+Qr|6_M6K5`#E1d;*5UsH-+#K=PzaY_v6|g^bzl4aIWxb`{A>R!^#99L`m>4saT0%=uIjOV*gg5_|4|C^4@BRYKp&?oUhE%B z^etU|C)VS1)%SN`{gSS}6YX)jQp5QhBK8ICQ5yIwclL3*I{!yFf1R$rGpyE+(p4hv zKM~fSaewuQ;m_Vc-*VOC-&y%}t`frgUvU3N&l~=1YG1R}Z!LAMN4KPg=r2$0U#k2A z!XF%5`s@1cw+MWX5NL@1ON4Jl?{{(tJ>n?%AsoNdynmp&{#i`K9Ecamv8BJ2K}$bP?pd?%*SBTQYgzbAl?Fn_&& zd?&5#BU(`Me~$Kd)$YF~|MnE;v55cc9i;q!ME)NXyZ?4xf4qG>&Qplbf7BiMR_lHz z(BnLn@MD2~P@W=qcr^GIA1-~}Wq;b@zNGWVt(BiD$nT8T<2+URH<3L`0DlGZah?+A z`+EZT2=l+lQ&x}i)ZRZx`?$>gw`<{Bl6u@n`*o5^;Q!}>{0sJfTIK%X%s?L=D**ry QKm18R0RX@i{_@@b17T-EvH$=8 diff --git a/kb-importer/src/test/resources/CVE-2016-2048.zip b/kb-importer/src/test/resources/CVE-2016-2048.zip deleted file mode 100755 index 3aed4dcf8145f4e22895a0515a619a99993ef701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141723 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�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�zze1-?*@O2eAQ7HQ(H6%O+oq%TMb%a#8OH&m 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

    getInstance.

    - * - * @return a {@link org.eclipse.steady.kb.command.CommandExecutor} object - */ - public static synchronized CommandExecutor getInstance() { - if (commandExecutor == null) { - commandExecutor = new CommandExecutor(); - } - return commandExecutor; - } - - private void init() { - ServiceLoader serviceProviders = ServiceLoader.load(Command.class); - Iterator iterator = serviceProviders.iterator(); - while (iterator.hasNext()) { - Command command = iterator.next(); - commands.put(command.getCommandName(), command); - } - } - - /** - * command executor - * - * @param _args a array of {java.lang.String} - */ - public void execute(String _args[]) { - if (_args.length == 0) { - log.error("No arguments passed"); - return; - } - - Command command = null; - try { - command = commands.get(Command.NAME.valueOf(_args[0].toUpperCase())); - } catch (IllegalArgumentException e) { - // skip when an unknown command name is passed. Default to import - } - - if (command == null) { - command = new Import(); - } - - Options commandOptions = command.getOptions(); - - HashMap mapCommandOptionValues; - try { - mapCommandOptionValues = CommandParser.parse(_args, commandOptions); - Object rootDirObj = mapCommandOptionValues.get(DIRECTORY_OPTION); - if (rootDirObj != null) { - String rootDir = (String) rootDirObj; - rootDir = getAbsolutePath(rootDir); - mapCommandOptionValues.put(DIRECTORY_OPTION, rootDir); - } - } catch (CommandLineParserException e) { - log.error(e.getMessage()); - printHelp(commandOptions); - return; - } - - try { - command.validate(mapCommandOptionValues); - } catch (ValidationException e) { - log.error(e.getMessage()); - return; - } - - command.run(mapCommandOptionValues); - } - - /** - * Print command help - * - * @param a {@link org.apache.commons.cli.Options} - */ - private void printHelp(Options commandOptions) { - // Showing import help - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp("java -jar ", new Import().getOptions()); - } - - /** - * get directory absolute path if it is relative - * - * @param rootDir - * @return absolute path - */ - private String getAbsolutePath(String rootDir) { - return Paths.get(rootDir).toAbsolutePath().normalize().toString(); - } -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java deleted file mode 100755 index 8da0a0ea2..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import java.util.Collection; -import java.util.HashMap; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.eclipse.steady.kb.exception.CommandLineParserException; - -/** - * command parser - */ -public class CommandParser { - /** - * parse a command - * - * @param _args array of {@link java.lang.String} - * @param options a {@link org.apache.commons.cli.Options} object - * @throws org.eclipse.steady.kb.exception.CommandLineParserException if any. - * @return a {@link java.util.HashMap} object - */ - public static HashMap parse(String[] _args, Options options) - throws CommandLineParserException { - final CommandLineParser parser = new DefaultParser(); - CommandLine cmd = null; - try { - cmd = parser.parse(options, _args, true); - } catch (ParseException e) { - throw new CommandLineParserException(e.getMessage()); - } - - HashMap mapOptionValues = new HashMap<>(); - Collection

    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�ga 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 z z4;s5lj+QFmO}hzCykFZyu}$kIH;myjGnjI+q@kvvw4NL5=K3Zry7H4UlZ&l78V)m_ zE>VgJ_ZO=O&q~X+lDz)ME+T<48OSOcHx(v-{dY?(g{AOa>~EFBcEKW~vUpV|x3zBX ze60IwPNaoIM++UleonRF2Y3>vHITZPTdBM6?ydaVt~#H{%$lL$X8~W(J@4KfME*gG z?a=04cC>b#_VCWk+Vfctj+SC-4mCI8!t327%3o`SWsUOcYf3uIaYb%OxKgax8?z za`FU6xV39_rZ7c=v1DwkOV_iuO|n=8&L%k=equHwY2L@HJgwl!tFX?Z(oKw80Veow z$e)qzbk4ZXB+sOIs+Dq3W~jui*!kn&08D@>tR702p(HNL3la?A)@X+8Er6|3EW5Q9 z)?b=$ER6kbYn&T5gt&M)dHnyWsPZ2>c^viMS$tGod9C;CHS^Z)MM3)QS2R1Q+s58vAXDot~ zIeGa0iqikxK9j{gxEXd zOg$FqP+NXq;sTUtfh_twOl*OKs&T)TQjBVLGsG{tDROMq7S3J-7UQ|NX?TA#B0eMC zP*)j_(NbfNg9r)ChN4%M)9cG4u81AcrBG9bTeMgR^yj-Xi{N`d@47Bau@DX?wP?4F z8>_mf{E0ZTXxUDr=R-wLCw(%WU#$0{!ajGNHs~I$?MylKk;kX8y7}cwokDwT=iP1k zXECK3WPQ9$hWvp%+bL$4sYgR6Y2y*&3;2cNv?&_tByX$9g+3BUG83@{lg+6^gO8(M z>%vFAa}8P7)fGE^PyStj3U^%-XRo?l12U@Fg@*Dq3PGlpL2t3r^G@KjhBO-XqMTp7HpKVx!eF@!b6^$lNa_A z(EF^+ya*U&j&iWAq5RPze^X;zkqH*a9$+g4MJM^1PTL^(Y}5g}H^~gIde9pTneogM zq407;(|%xeYQq?4SNSz;IwSC?VfmVGVA%pJ26=Gr(#Zf(;U5_&Rxcj|-Zz~%(yYi) z?WcF*+ZcWm-}C?8pm;#T_AG6U0?A!`(0|5k@UHeUzs<9F`qQ|a0tchSF>zZQ4$M`+ zzJ`tZgPe!T11(?0gm9=rF;1SfHwiAlD4D|kQ|3AW!9?3fwFu6@YLbC3-@h3xR%q?7 zM}2nP9ee)G%(s4nb2a^PxE%f_*1VM819&OF_djv*Ki6*&dJ$~?O#dqY{7=S~f5qYX zTXm(M#{0QI%WI6~4`KoO$&vC$nDO5q?{A@LzjFUMrTVqV%Ma@M*SVYhPq5jq%zsWZ zea#;FK{n8T2l}64<^Rah{*~v?sim*Ma6hOX?yq?MIbHQv&Oc`_zNV)BAPo4w;{20! z?N>|gufzPDG58wP|AXLP(q;bF{`vEy{4Fu^SFS(j1pb*T&`YxXKj-=*_wZM)KUenp zGgs%o%srw9FcTlAs)71q~n@fu10E6<;6oBbInI{IJn{E=q#E7zYBKmL60 zb-whW_~*0w=Ns|wVg5Ps<24-q2kl_~756`-lKcw$XU2b?3{kAVV*DeEi#=hw5j{bbk%5_(AY5kM#cpkY5q}JQc6b{U3z*Qd{mnf#8Sz=T|I0 zyJ%m1%RdN@`5$8WlUw%x;A#F9#LvFFKi{us|00N=&b7bVh(BBHU)_N}=ndPy_KANQ z?Ekn2e>Mcl{{ZmvYK-guIfh?n`)6CgtH%F>0AD8mA8fxrE&0DQ0e=fJ`4z^`TEm}V zxC{S>V7!_k{wSM@4}cGl4Fdo$EB^ZVU)?u9%BBXICq-er2=uSl|BptizqbtebMKDV zwi&;5tN76$;XbQ3kg5~AZTk#_wFUg z!{N75)lL{~nt!`op#cDYYj*J44=Y7k=`H~T&xLXp#(8?}wl7yIycj%gg%Cs`!C69i zcsy1Mq}FqW!l_|TG`tk9r{Fg^-I7`qQVz*|%_-~`#utwlx1g&S_h?WWtcv0}A*|2` zvkVnxdg0l&RKS>-jD`!~yg`eBcu+xc)WCMUXZJ*n8=j&vQ&YfY?|I@R`G_6Pa&VYc zba36GT(`Xn103*zaH(!}z+fW3`*W|$FDmk!rd#6-v>)V#yKctT)MgFqIbD%pg-EB+ zymWiY$sGvt{p4$f%{^;WQ68Yw=vGe5YKb{pJuVVn@_f;$kYQ857u`+pB<%FIxAJt) zi#J=y(_GwqC$YJEQ^GbAX9{f$Ml9Jd?6{;3{bMNF`Q`aQ5}@>*s%aU93Oo_p-wO^3wgWjbF>rznXRVJ~cL8GXU_ta-v#> zk?=td@q8nU}$bm5pnDC{Mt857TT+3GjL^Gv4C$k{U!ZswMe8FUexxlm8 z>5A_B{ek&MZU--im=4qpaQSe@=FyL1XVXsWdfrtemSM@?0TaSLIy6Uww@7W9m!dM> zT{dXkT##fbxWrVrD4hD{^G%O_h@)=!?v!6vvdN|9RAQd$Q?^~kF_H!~&h^$6@9geQ z<*;OS00H2-kBh~-0>I8ov60Ujl}7=!2sN|;l(Wb*BSBd!7P+&(onWB5oggfKqB2W> zo|C+?o`ZdC=DxyT;OOXzEU4}>=i25G%Ya&6xxr7kD96)xQi(HdapAKYyK=gT)8l02 zRN+ng)4MaouN1K5>zIAl!z|C~-)~QLGE3k|yu$57lffG4j~TYSJiGLSjfJi|foP2f zZi6W6=ByTuYX>K|^m34h)mD|SYc7Q) z8Z@wJmS!?q^0cg^mg3*8K-Szckjrmx`p!rK=ovB4do=H?kIlNO*4HWcl&%W!*X; z#|JWg`_v&>8tIYAzETY=Wkv?5t1)71C+ZT_sgU&Us)Mg68AtPkFrmEqy}Jkecz zTf8Uh!JYkLXo#$YMZ4$0T6sS_?@PgSru)EE{kXc|sl7Z;&i0o0Oab%)C5zi(nj`C8 zVe66GhUN;n8Z`|kQQO0rrCSO_4{08sDEZ)vLDWK$|INcLOu_zh_nu1vI_OOewl7R^-MfNIC;l5tp5hay zCHK-k%q8Ru`4-0-xjWbUT}J!7;;q1ji7 z`><1EOYoy39D{JNrJ!~L{~|e93x4Xae>sR>FZ=(_k!xaOWB6iG{8z<>-=!RLZxZQH zM4yuvQv|^41@eORRV?|fjY$1LiRMjg`LF$vjNX~r5RjW1xe+*;nmG`>eCrduzK0y@ z^%;i;{Es-l*nVE<_4)MsGw%0sKmmYX$N8ln!_SX3sh4+XyuS69IqsgD`P-;J&Xl&wMk_4P@9w<^ydzT{Myrn+LcFAz2Lnj_&N)Yl-&` z!*h+~E-J~&PkI?;v_6vWKJ)l|5xpyRk?Oqv__gm+vy8O;HTjw)%r=# zQQd~vcl+5}T!;1S-cFsX2X{JSj5_3(rA-t81+`fNmtVf#CUWa%F|qBW zW60!(D|+{v7LK_p1rWu**Wv9k5m7xK^Nc-guPW=Wmtx zR@YsZUXd9dkFI%DRPv}IXl3zTsE6|SX33-rE?irqP!sRrrsa$*1CnlD2=O9!M)5x-`KZLFmvqgDc}@2XP?+2^xhbwA z8ISA$G*cGiJ^IqIb)B+PoR-t06T4#7J=!pL3OqMSgFvIRB_4=gbsNzTxc16X%CWCr zkQey+{2km(oLcw;K=h*yh2%YgfLV;0OBOzfyH8}8G3{ZblW6vye<)@{opKHC++g0uRzFF-nL00AtZgbVXpgbnHn z({RbGSpMUd6WH)y^2~0dT0w(NGbo38r!4P^UA+pxb>0g?Gq@112;?uiRd~#Fgy;dn zkGBI#-YZ^Tp+ft#l-{F+9#4;T0b~O}7B=sVyf3%jd7Rrd&!z+^XK5!Y!)LmE)1_6( zuVDiE@J_SIFR1gWS;Q$F?49|o)jK0d{d;U{kHb;Un;P(N_*7fo3QJpzE`S5=U51VE zT<+r~2Keq-C|ECdc4O_T{R^y%{j37r8xmV$7=fZYbWxUAEfS9a^*unFys0M z;!K~?(#My$lvSJz2}Kn6XHWBxcOs;YoPHd6qjc(u4NBOwQG$AhXrs?jtJa8nIvpxy+UwO) zjT4#iW&&CH8d~1*K=El0?AhI!jGuuZBDpGpAwCf*xd?HGZ`%9$;3Q{YPx4N{AQWgT z@KOlv6Vxyy%>u@4GVfOWS=K!o znI#Y?x|ttIoc0*`_s%;1IV_-42u^Dexfx4sgcVx)i#D{My$2Mnx3aQ#p ziI>f#hD9U|!;COEgT7w*5qwHtCGykZ7f|Dd^V*b%NUMSAPV|7)sK)ooV(;{~FQ>|D z^yJ2hMw@3MTBsPcn6^u#lo=KS%Y(4)sogZD&K|Ol5(pV-tAu+F|Cpem9!IW;j9eL| z{a#T`@Cm1f8d%c=KOm+7Fb9c2GqPEYbj;9mQ{I3ixTpUReVX-FcqY`c3B(g+ryNCE zzbJ(iJ4psC!L()Ilo&~OCDQUk7^~wXRvRK|yC{)OUh26#T$z#|<@r7J`jalx1v*1n zRaH0F6V>`R=WLbLa{XdCVAfD(Ma<@msNe)_NwP!Jqk6t6Q3bs7gst|d%dCZ1ihL5L zJPkwj$=lr^P;Bc3!L%!I^_CtBDpOco-r=k;q#;SFM*lHK;#im{VsLdKz4VH=N?-Np zy>8cVfR(`zaF``)NEJp0F;rFQQtFtKQl3_-;e`6xD5&5Uh?JQCX!Ptl1RRC}z7&pe zf4P?K7hwG!BvrS(Y%~tyngA@lPN?w3H9+?=BK@tgZECKPWR5T1J}cH5+&L;1qHGHYcOOBGhjJzTUm6}GcLUWpjPxz zt$IT^4fd>)*sfGq&m|QorA9=VdT!u9py=0nTn|?>=xlE5NOM08BUH0;`ys1sK~F4r z*}|XH73w@dw3n25NdeOA3thp5}tfS zt!z_b6(E$LY2QqG*^JslZQAFQ2^rOe1yW`Iy@S0AG>buXYFQVlyP!q-LG;k)K6sk9 z#Tz8(4wR~h-6JSX82MFT4WJ{0*=UqK=`P)G5}I=}F{6gL#y~*DmyQ*$O_!v+if%K# zA9C(@C@tmJ%@Py6{3kS{^dhXN`c6UJO>Xr;fTEntGRqytS0(WA*qSuUC*8eIuFsJ7d5!elLVQI8GE zM~3;-A9>8HvF_|o95UJ!I&nj%3!kFxtJr6f%-m#Qnxs>=;gE(E$R7^&fklK2x64Uw z8mp%H+6|oZ#hqVhsPX0PrmRABb?(^NF_Cs#en=iJSs?W>1Ez1IJ)@%Lhx&00j0Ap! zyH9Mx7=1k#q!(@obNT{Cc#e7QdBf(I$GoF49aZZ_=~V%ulnsLB2WSopNm%?QRdKR5OG3vs!2>w-!uB_ zB8?(yuljJVKKUC7%+zK-0fj6?q;mk*?YJDc-8f=j)sEL5Shs!)Fj@x)&Q7zy zR5G^A-hZS3V?L5;LV92L;Pqmjxi-N4poUZs2aod^9N#}bg^CsszIU2?k!sS zFS-Hxli%v|^E5QvWLkhr6-EO~gY&}(4Y{&MZLquH9^wKoWVM!pkFj;@`zQ*4s-=Qf zt+A1XC6tx}H?+r3fR=&fCx@A~e;_GjH?{L@b;8eL2*@H}ethY1jy<}avnQghwxcZv zS(k_NY&U(|#;48{sR3xo6GbV9Gf@K zUNeW=XMY}>YWy{Rz!ZnfLr%pkoe^8AS+bBR=NFn^$jO4SR^H2zOb&tyIfFT5 zg?&EDu_q#HtM_wC)qdX8^6kq0wAVg2)+Sq4`J{nB+qaw2m`9gbA+yR?yw2&fE&)p< z9tZ`A1{jU@?f!`P&bog?n6QZpq!5qdvkvB9huC$4?^&NeG`J1)x1;FFkHt_v^mVy9 z-P7q2-z1@otJK^H-|h59)Gqe~9pHJ?wfGAq4Q`nX;D1V-%0A0qV(!UaZHX$tg!2p@ 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 Dp_rIK diff --git a/kb-importer/src/test/resources/commitDir1/metadata.json b/kb-importer/src/test/resources/commitDir1/metadata.json deleted file mode 100755 index 1812e9a0e..000000000 --- a/kb-importer/src/test/resources/commitDir1/metadata.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "branch": "master", - "commit_id": "b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b", - "timestamp": "1447974481000", - "repository": "https://github.com/apache/commons-collections" -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/credentials.xml b/kb-importer/src/test/resources/credentials.xml new file mode 100644 index 000000000..ac46ee919 --- /dev/null +++ b/kb-importer/src/test/resources/credentials.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.3 + + + com.example + boot-app + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/kb-importer/src/test/resources/plugins/test.txt b/kb-importer/src/test/resources/plugins/test.txt new file mode 100644 index 000000000..e69de29bb diff --git a/kb-importer/src/test/resources/secrets/hudson.util.Secret b/kb-importer/src/test/resources/secrets/hudson.util.Secret new file mode 100644 index 0000000000000000000000000000000000000000..53ab71346f705b0e2a28848822610f76129fa753 GIT binary patch literal 7369 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 literal 0 HcmV?d00001 diff --git a/kb-importer/src/test/resources/secrets/master.key b/kb-importer/src/test/resources/secrets/master.key new file mode 100644 index 0000000000000000000000000000000000000000..53ab71346f705b0e2a28848822610f76129fa753 GIT binary patch literal 7369 zcmX{*2{@E%)Yi->%x8%h#*88<%dHq?sWD6?OIIOFNRbFLsZ4f8^T{^d6h+h(Zi(tj zmL|(JnMtGw$r960l4XWs%JRQo|Ns1+XCCi&_H(}Tp7)&hOLKLmD9CHdOGrp4?B7TJ zQ$j+L3V!9NH2`8xD4PQR(2@I&o|TX=)krFb@{V1<|9?}ULRFx(R(?g1IvlQ46HGRx>#*JvH{Peld(1(;|9B> z3L#pa183Aleav5;# z0=GQvUkVc-lJzmv_dT*p{fs^r-W?r?>C`O;NL(}FmO`3jC(802f&Zu^wrM*_@!ESA zta_c}4+r*669_{&3Tdekp>ZAZF>{inj8NcCW-U(UwlrHmt%95K5k<$J!UwOGx~ z=%3^(#Q8^Bkpbi^FPIqhNP9MeRZJvg{fw0X)@{BF7aRK_)?LQ)|0x?t7nlV9e$wUt z6S&kJy@Mdg!$K6g84{#}fcSwYg4Va=9CB_)R9)5OZ!RAAZgLv&w(e@C1ef7;!cI3@my;%Hak5|GuwfIy?~*HQJSg=0#7}Dw1#9~7OU8vL&Ztf zB(qZBPg+%CBdKtCyi%5dIW@gIdh4f`uWxIl727pc1d?@BAvwu~6qX#BQ>-^Kj1l?g zsbt^(^;hGjk#IALjtrCycSrxNE08q3rK}*C&A4|>0*>A&V?`iMW1;NiM2Z7X``71* z5GZ*-&`uG9%v@_*ysJbIE zR?l#=4}Q&Lb+5XdU<@X4uWKmNLhD8AyXZtkc@BZap&xBv?( zfCVJ?T$7mPdRrm@*7)8}W^&d2gc9+Qpw9 z-pr-$&5eb=j6s%-mOmu=P~ROLpS`UAWRi_LMk10`L_K5sV^VgQlfua#eb=Gs+puN& zA#IDj8tz||W%!`#oUxsy zYGuNGUZlnDQ;sO+SJH~}i|TiFylZ&ACKTE4DIH%j;uU_*CAHxV&GH(CW)Ihz10$6G zE8d@rQGC06Vh;~pCr|cKkutUifW3&qJ)G(<4XD0m>0|NeQ4CN+k0bk}40J~~C@mQ; zxu5wzpf8zip5^xH8K&V#4qLsajoAof2D$P%HXyj7kdQoQ zp|+@h>EuY_;cZt2beKa%K=-y~bnziczyx=d=N+B!T zu{+br51$>U+4=0p8hy#e@)+B{nLa3S?P`t^#;Y%FU>$uh@vQWmE0Sx{A@T3I&b&a}sdk0-1{B?aC--KB zQ@X<9+GKvV2=`Zv(h_Bt`f(!}Y=gDgLz4=C_u+>#9>vy4me=$J<*&*n%5L&dbS3v6 z&TlnERf&?F-n?U*YuEeL$DKr3;%(s)g-1IsEzuu|+q1)KSUt%gooq9zeb=2!wd&2h z*Ef~D)Slpy4WJ*3UR0d=o*H|O{%z4Q_j9A4VeNGy60>E`As3&I?+z@K%$@fPpHpcy zoBIe-1}}Ja)JByQ$m{%2w%)#BbM4JLqMtKb112rC#)5|_jcXZ8P_N66w;H0!^Yf=K z3`N*9C4K+s73FqxIKFMSD*of&=Q&)Bv5 zB<~qBAgg;~`a_(*_%;n>oH(vf@j$PpDE~*)!t|>$>fzV(X`2wZ@38Z;zF%T~)%C#^g$2gz>&wv7+}JjgPp1RtJ31Uq>g66gqv(UI zn5^heH-55S-O9t2;I43e0viq_?8R>XdH(B!qy~W~k zroY?GNW(?FT0h*(CZ^Q=uJscu-e>J?d=f8ZVtn7~!Qw7czi*kpQ=jvB>f}t09V9{p z&DBh0_g>iP_iZvNyV-(d43Ttp0+w5o4YiHo^eaOx{$?bd2~_hLAEp%_C?QQdsf-8R z9g3ymD7-+bmgozlPMYS0#TU4rwCbO;heVz}mkQtusJe4ZIjdKA+w-eB5KX8-BgCh( zyn8D4h(nv|Pmy%e%ULSIXQ;ZJRpM82?ziX7)@snoKR0DHJMq#M;~0aNryUoAIOUmY zqVVj(55GS22?zr6QUJrJDqOa$M+fY89^Mu$Ja#_2RE5?8FP>-k6o+rxuQH1>VAmi0 zl@pw!EkxB#03}?A=2Rb&m5=aTuBtY~TWHY;4O;je=y-aY2ZU|(WdJib2~SHFI>p4F%*^uh&g5ggHrZ}9ONxLd@^?W)*A4^t`E zj8}MaZK^zq?RPkc^g60-6cp}okJ|?yGa~=l7xPyUL|ZP}3C%EBE+wlvn>Rrs;=6=i zGTWA9W3DCHS#NS7LmPvx;{!7SP-4$Z5yy|TRP8}3WC`AY-vWv51kHII08xTMT)+Wh zDj>&V8SIDCj>2ah>3-?!MSfC6cOM!9uoYto(;a^Nh}~V5-`$EZbe$AA)`t;`s}dhd za(Zz36e(W&gwa4KX?XgipEiWU;S&z3*M{nW&@9@#DHOc5tK^p%6KoVnE3Aw8p4Zk- zM5cYgKg@z%n5>AeQpe7!ly`yl>N#`UhqCtf^y0z&Fly?b~kGqJ%`-eIa7~z;A*pk!c0^g?R55yL! zaIQT#bDpiWlzey@&ZQvh{n7=Lzd{&8fv%$#I zFa@CHch%nwPRD=c>?-km@NSxS0dHf2c@fepcfTA7IJiK1y>Cznz^qc2Ruo~G!K=H0 z_69^dLGBnT@LTJ_FRdFnoIP5kEAK8rI&_ycxNQle{qHM;OuD2zmo3S2=lkVjXGN3r6>--$f-qpZ_mLqtndO;7}nDR z?=%4P*!sW|>{ARi7ReB%HW{mgyzKyKh-;3Bm2Tm?gz-CunvsNH zfL1Uyka&l5AZ{KaCC8p)W{!}IVWuu1gck@pFSVVSd$tENrCA*O> z$V|J`%~cB63dR;{4$=<>#*(p{kj&ChhbSQkLn|1Dq!AJ-hWhR|2^g<#A}ZGb3=*rX z6_~gK5%*RJVy;Jc6e*lLXav*pNOJuX#E8eX=1s{C2<}Hql>8IK-N#xGGYEm`0BUW7 zdI~0PMdS!g35rIDhCvD^;J2J-F!2E*hMEqy5D+i535w+i1sF<^ok0PFhzOk<*Wr(w zYuCI-wmqeU!2kSe6U21|TIl41WlhK~w9+IfMxg2**uDORk${*KhR+9yeCx zsL}Sk5(V)F{6Z%DYr$|f)Bq@b{wvsP!+*k4HqVKE#`#)4Gg6ImKw@3+)V`(II<~H0 zn!Ot!Ov2~H4eM59^$`{?7trN<*xZeLSaMrM^aWM7`@%SwE!H|U;WE@fOS+9T-S%87 zpE3BP0+~4R5fIHn$LAJ_=k#I2?AFw!vL=^#Pjc2W3!EPPv?Px7i^0auRsjAD*56Y4Wm^5W*9;h7eTEB-*K_47i;YR)y~mI# z<=PrKs{s_9V_0zm_JP3g(leYrq(VDlldT5yveEs)>N9TwkQTDT^3;qfsq(+iJ5K8i ziD}{sKdaGnFhb>|STqp?N2(=V9^aDr?Mk@ALu4*dyNcWhFxd7yr!UXdw&6|gdp1>N zvJzb9jC1UG+rgM}dzpi#LocKYcQyvsCmrB{Ep=bPMm3q`a^I`T0$AhB`>r{5qDWsb z5sA*A*n_Ft8B7q!9CG!3Vz8kAazPUW8}J?!H_nEa7u+?a3uSFK!JsGhQ6p5Qe@zTd zTG(iS5Ts0~TGN`G1~=*p7zN1Can4i?Tn(sz0Raa+>^#v_)dcFKD1+r;&zbx~dv@!r z;a;SZ?!gEz`p8(VjjffzccSQOWVWKm?-yhs7=wf&pEUq=0E3_ok=g8;WB+deTZ3?H zcm{IzRAL)gB6x_*&RSp$?ku!<4T>@xZOs@g>nxn1&y#otC5C)x^$lfh-9kl}ZGlNH z_rpTNJrD&4H%{?Na|9{AbYz#l+DOjr3lrZ1v`9ASGkQW;ZqB^W9#yw!?ZdbK@VELi zjOgvXwCGut-c(lpy9eS`!zo-!93(n)um16VUQ6nr$Z)S;mqNRdY~OJuJT9}o$Br(Qst1RtEyUL}cDQYTL{*y<`E zr-0nPr~|IU=6Q*^B%V@G5XdH-Edou&Tz}aE+Zao_rRE@y7;F|hP3;-fOX4jAg{#|v z7jDq1@9u>WJ>PpeY4}C#S(tRR4#_JqN~oWlHFw)ln>)qiL<%K z(Rb{@kYEuUwuWdKlU`f0N7p}cW%M$}+`73$%+ zwTc#r303s%{&c^Qa}C#f#vWB@2F*2lTQe@#A}51cNk`XB=3Q{Rac#aRc*53VK~eO? z?W`%KN@1qD|K30SOBL|aF5wJ`6AA_*tIInwd#yCSpY6;Y!%n&lII+hn>v(uzb>|asT317&=?Qz;zN9N)l<7G9vR_8H(wjS< z%UF3Ujskd1Kif+cyIMN zf~vi%Roqx6ePCX3jeBl*OM!2uPg~9f>v4yl%m`m{`s-ky2-0MTq-|r z^(+RVi$Qh)BWiBOtGQ+OCP9_|_pNq2knu)>)SyU*ug*I<&V6*hu9S81>Ep&a#a5Ct zM~Muw`h7uX!i>mk>^kof0LADECUGff@t(cojWr>P1{;>%i%(=Q3g88V)^*}}`X8&y z+qB9YHvrRdi7XXSL)X)a!rlbjf4#!QHalmI9I#`_wJiO`0IBS8=!v;lj~Bo?JzW9l z_O*T$y(6;kJRO(0?ROCOreX(hXCot4n|4c1>hM$Q&#bX!m!GGl;*XCJLSlw9s>-H@-sZ-0HgqX#8@clqS&uJAZ04!TlSDQ&a<_4{|35Z&k< zY$dz2C9=sjoo6O#!h~HiST!U@>?fH**ur#^>=Jnly^sY7rBL+A=k>*P4mnTVp37g9 zc0)y5li3*3@WrdsDz$&bw=Je5s?2J_(R+by?QXp8(6o9fdsKAX1Lu2*M~o_zCQNo- z^-SveV|l~;@enB-Osh>gdMJalyx&j5L7+wv$i!wQ zYVF~u5d;-m@WJR&O-Yl$+3;+#k0EJzize+l=IJ+Z7yR<8==dq#4Hb_pOHr@jtbpCQ zZM95zYG=O1Gk=|hx?K+ZHZwxRPCZfnjvll6C-%mY1|#3sX|BBcdW2 zP1SiFs}%CeFIG98e+eV%-Q2u??pp+!DCrSw9ud!vt)DpwQ3Fx*P}gWrQf+HetCu#0 zHqOZm$YSqwEO%Ed)U);7nuUr^m(JYj?Q352>V=I5Z{Of%2SG)OgTV0T+gyx%nNZ_j zE?jV>_D}}TJ0_cVRJy^TXiwjWCVE`-R5;VTm8vCN*rAr$-?*Sr6pt1#g^I)f2rzMXOec6Cf%VMc;=V$E@o%%rdK1R+LnN;oTHo zi|)u?NGO4-i;=N1CFscDFQg~RaWgyoYx^f!w@k^#t1V~3S+E?L*8#5oADG=z#<&@k zLXm@eIVl8zK3Ldsr1b=)m`E!amZR{T77sQ(Rsi?@{Gc+gg4Ps@nKC6EsyiTq-3?J6 zK(r$$;tvvsDu?$-N(_u3V;3-@`@}aIa-*&KPx(Q?RP1%iq zqok1U59bMjtAr5^1{`R@h*g%srhu;mnXK%uvXWd4n5anNQJO=nG!!6iGfJ#0gDocT zzofDjNKIzD2wB4@@m>^BzgZ<;Bg0@f?nP2-o+`xM?5v(%M(E1e5zHgsTumRlN)8X{vnlh940#0^U%aL0$;;-gk{0B#HvK*a0-a}Dq&d# z-O;YHdenpZZ{UK&VogHUep!^IB;^Phd-W`qCYALSCSH!z5M|3?H6sI6>@Dm1Uj`_; zrd%OjrkN59MqE?jVqyy(ESPYydEVmp8w!hnTa?PK({ErZ_#rgC|leb_B(I#*O8^Xxfy-0!f! z!hv(=0|#g@1)sB?r;(hSMx`JoT8~*EojJOu+|9oYRqjsAl&dsVW*SO^J&B#hQ1iOC zgM~3f&5QB}As8g^O+!0bXK$PNd}`Hij}ZhJlnI-x9r&gZuYmu0G7kL6z(8{R-X=&E nVj6*x{8mh(x0GGRkOixff6}gz!suf{3Glby-kDrU@=yLBJG`Fi literal 0 HcmV?d00001 diff --git a/kb-importer/src/test/resources/testAffectedLibs/metadata.json b/kb-importer/src/test/resources/testAffectedLibs/metadata.json deleted file mode 100755 index 08fc3d665..000000000 --- a/kb-importer/src/test/resources/testAffectedLibs/metadata.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "vulnerability_id": "CVE-2007-5712", - "aliases": [], - "affected_artifacts": [ - { - "id": "pkg:maven/Django/Django@1.5.7", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.0.1", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.2.3", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.2.4", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.0.4", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.0.6", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.2.2", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven/Django/Django@2.2.8", - "reason": "Manual review(frontend)", - "affected": false - } - ], - "notes": [ - { - "links": [ - "https://snyk.io/vuln/SNYK-PYTHON-DJANGO-42158", - "https://www.djangoproject.com/weblog/2007/oct/26/security-fix/" - ], - "text": "The internationalization (i18n) framework in Django 0.91, 0.95, 0.95.1, and 0.96, and as used in other products such as PyLucid, when the USE_I18N option and the i18n component are enabled, allows remote attackers to cause a denial of service (memory consumption) via many HTTP requests with large Accept-Language headers." - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir1/metadata.json b/kb-importer/src/test/resources/testRootDir1/metadata.json deleted file mode 100755 index d4d028a69..000000000 --- a/kb-importer/src/test/resources/testRootDir1/metadata.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "api_version": "v1", - "vulnerability_id": "COLLECTIONS-580", - "aliases": [ - "TEST-1234", - "SOME-OTHER-ID-1234" - ], - "affected_artifacts": [ - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.0", - "affected": true, - "reason": "Test" - }, - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.0.1-SNAPSHOT", - "affected": true, - "reason": "Test" - }, - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.1", - "affected": false, - "reason": "Test" - } - ], - "notes": [ - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580" - ], - "text": "Arbitrary remote code execution with InvokerTransformer" - }, - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580", - "https://github.com/apache/commons-collections/commit/b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b" - ], - "text": "With InvokerTransformer serializable collections can be build that execute arbitrary Java code." - }, - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580" - ], - "text": "With InvokerTransformer serializable collections can be build that execute arbitrary Java code." - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir1/statement.yaml b/kb-importer/src/test/resources/testRootDir1/statement.yaml deleted file mode 100755 index 7ffa4cddd..000000000 --- a/kb-importer/src/test/resources/testRootDir1/statement.yaml +++ /dev/null @@ -1,26 +0,0 @@ -api_version: v1 -vulnerability_id: COLLECTIONS-580 -aliases: -- TEST-1234 -- SOME-OTHER-ID-1234 -artifacts: -- id: pkg:maven/org.apache.commons/commons-collections4@4.0 - affected: true - reason: Test -- id: pkg:maven/org.apache.commons/commons-collections4@4.0.1-SNAPSHOT - affected: true - reason: Test -- id: pkg:maven/org.apache.commons/commons-collections4@4.1 - affected: false - reason: Test -notes: -- links: - - https://issues.apache.org/jira/browse/COLLECTIONS-580 - text: Arbitrary remote code execution with InvokerTransformer -- links: - - https://issues.apache.org/jira/browse/COLLECTIONS-580 - - https://github.com/apache/commons-collections/commit/b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b - text: With InvokerTransformer serializable collections can be build that execute arbitrary Java code. -- links: - - https://issues.apache.org/jira/browse/COLLECTIONS-580 - text: With InvokerTransformer serializable collections can be build that execute arbitrary Java code. \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir2/metadata.json b/kb-importer/src/test/resources/testRootDir2/metadata.json deleted file mode 100755 index c88e88154..000000000 --- a/kb-importer/src/test/resources/testRootDir2/metadata.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "api_version": "v1", - "aliases": [ - "TEST-1234", - "SOME-OTHER-ID-1234" - ], - "affected_artifacts": [ - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.0", - "affected": true, - "reason": "Test" - }, - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.0.1-SNAPSHOT", - "affected": true, - "reason": "Test" - }, - { - "id": "pkg:maven/org.apache.commons/commons-collections4@4.1", - "affected": false, - "reason": "Test" - } - ], - "notes": [ - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580" - ], - "text": "Arbitrary remote code execution with InvokerTransformer" - }, - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580", - "https://github.com/apache/commons-collections/commit/b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b" - ], - "text": "With InvokerTransformer serializable collections can be build that execute arbitrary Java code." - }, - { - "links": [ - "https://issues.apache.org/jira/browse/COLLECTIONS-580" - ], - "text": "With InvokerTransformer serializable collections can be build that execute arbitrary Java code." - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir3/metadata.json b/kb-importer/src/test/resources/testRootDir3/metadata.json deleted file mode 100755 index c2c7e19f6..000000000 --- a/kb-importer/src/test/resources/testRootDir3/metadata.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "vulnerability_id": "COLLECTIONS-580" -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir4/metadata.json b/kb-importer/src/test/resources/testRootDir4/metadata.json deleted file mode 100755 index 731888b06..000000000 --- a/kb-importer/src/test/resources/testRootDir4/metadata.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "vulnerability_id": "CVE-2018-1258", - "aliases": [], - "affected_artifacts": [ - { - "id": "pkg:maven://org.springframework.security/spring-security-config@5.1.1.RELEASE", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven://org.springframework.security/spring-security-config@5.1.3.RELEASE", - "reason": "Manual review(frontend)", - "affected": false - }, - { - "id": "pkg:maven://org.springframework.security/spring-security-config@5.0.12.RELEASE", - "reason": "Manual review(frontend)", - "affected": false - } - ], - "notes": [ - { - "links": [ - "https://snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORK-31651", - "https://spring.io/blog/2018/05/09/spring-project-vulnerability-reports-published" - ], - "text": "Spring Framework version 5.0.5 when used in combination with any versions of Spring Security contains an authorization bypass when using method security. An unauthorized malicious user can gain unauthorized access to methods that should be restricted." - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir5/metadata.json b/kb-importer/src/test/resources/testRootDir5/metadata.json deleted file mode 100755 index 3a90f2fdb..000000000 --- a/kb-importer/src/test/resources/testRootDir5/metadata.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "vulnerability_id": "CVE-2018-1258", - "aliases": [], - "affected_artifacts": [ - { - "id": "pkg:maven://org.springframework.security/spring-security-config@5.1.1.RELEASE", - "reason": "Manual review(frontend)", - "affected": false - } - ], - "notes": [ - { - "links": [ - "https://snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORK-31651", - "https://spring.io/blog/2018/05/09/spring-project-vulnerability-reports-published" - ], - "text": "Spring Framework version 5.0.5 when used in combination with any versions of Spring Security contains an authorization bypass when using method security. An unauthorized malicious user can gain unauthorized access to methods that should be restricted." - } - ] -} \ No newline at end of file diff --git a/kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz b/kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz deleted file mode 100644 index 5582d17829854c1d2676fa4ed852314b9d7c9a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151640 zcmaglQ*16y)G+$mw#{AJd}`aay=&WUcWvA5uDNU5w%tD8|NYLzNlxD6By%;BjBX}t zt@#nhz<^}V78`k}FO$0tU(GUtv-v_1eYvOj z)enY0@4A+8{9b>5d|hh+c|yBeYhT&T&W{z}*N)9J?troP?7pu1?~jYJM!oq@pAYML zxA5=N9UG6cTCeZr0h{teuk7sI-xBx^<(JQW#O|D2l6jxo1TH4qKz#h|=jrFZT6fNs z)fJ+T09@kF9}me!Y>njLhwr}5#%jYoHb0M@qBh&Z+g8coMN3Jw=fl(4%`h z;=V6u_UoHCECdXfW)+xS0$kPTMm`Ln%^!IJhFzZ01V0=GT)%&W0NYb%!9IaPH>K5> z|IMt}(*GFoV>oI#|4kffiHl3K3&g)fe(XE;btnQ_XDXi=cxsBgS(my2>uVhZ1I~b@ zz8iGcY57PY6YGUS?`{BlVQ9y?`o|vyAmyTfI#witL$c7!KH`3{uO~1<1m!f1&O1O+ z=pPQSlqv=}zto@T2^jLz=l9*0v<$>Y{_mXml$SuOi#X!ge!`C}f$u(%XW-D+fBWVu z1m=4*ee``60RP-~B7WaW+=n1`kmo~x0}FtTx9)<0g z?X?y@*gqcBzjgk%N?T*+y!<8bl&}b>`DY-ouj9w?{iX4-wi#cp9ss=JckdD-6uM0Q zaXxUJg&hY39K;iPNQB!;`8PW%XRC!|Mf~(de#|zyu$- zZB{FQ!!4~<>pW5hb|6{Ig!x>{1+Qg_69w%{&WscL#J_s&$(xSlbBFAi@V@95(dN(z z368nrVDt~aV~3zVnUY1v%l?v^s87qIYa^E-G_u$h^8k-jZ~6!yQ&{c-vFS$ens z-0r?EUflVKa{ZcF7ZBXI%zcSZ7_SGn{5&(95%QMwVHhK)C%IB^f+-myvBjPg{VZo2Sw^I6fSMm?w!PoMW)>FDCRZZsdyG?42-Y?mto3zMG19 zRn{1v{d2;*basRZ6CP^9G)4Qsi6CfLeQVh$@`%%+9$!Edab|m_pMqEaKg%1w*fCu&1gLbKMEMJOahlWb4){qu*-S& zhy=Xd19N;h(3+*cDCv1ghdT5^sE_h_ye0cR0YoU@N>v8z*`n(&e7wTnvh_O1$6(DD z+)L<^&G$G6q7KqkEJcyAy$3F1-#`?#os@bpAAW;(tT^Qb-6-!JK^{s8H<*pBxTxG< zv>gg6yp2xbU*l{yj%?X4=xkS;Df_L>d@qbrUhnUhnUYWw!|#-Lk#O+$>PI2C27vC4 z2T$Hhbo4WXQN~7k+WI`LoV9EOa_EnjNTU^Ui?R2Iw|jEYQ%Y1;laqmN?x-L;OVM%v zOs{q1;6};Vy-?f8tB!x}j)mW8+Ya0rP+E0{+GT13A4*CS8hA%cj zP~k7(84zNs2M8FYD%B^>g^o7v@Km5=Xg`)Sf{7)b7(*D{wfiRNhZPhd3I}WgkpNlK zSr{UHW{;P&L14%dlm%)LTK@$83O9M?!_~YdtbN#}7_{g!ls)^?fi}0Z7<$V|aejQ% zUBnNH7uK*CQIub{VkjQr4gS*HD#U0nqO008SbL zk_BR(Crx~~JreWqP*H34O#)KUC9Gqx(i_yGd3-|1dsI_-fDNP=l?}zz=n1zhcNq8J zNW#wi#QDqojbQ3m)}7;lKFdBztVpV=ex?P(b)MKI{LBlCAL)5Z^wo5R-q=6>br%R# zwh{bs*hzy^G?tWT>}Sv=`M6OWdnW!Cu#%PZ#zu79sNztcW@ovWs+#GB5^-sJ>9w+m z13O*{d$VOk@g!Jq`{dtTnmnDkdRzJoiE@P#1f8}z3J+W3FX<`AhUn^#5BMIb7a z3Wby_Ve8Ma;~P~v`LkOF={#D~>bGF1&s9w> zjN@fxC`@M)jQyn%!KYwwDKe~5Z2S_Y_5{im!jIOfg-#rO&_h`thG?kRQJ@S_)7*)s zMgewF4IDjCG1Al}5aVVUjM!d8(5HvKLc`iEvKz4zo-Re1$lS_08%5`f{kYyNa;DU7 zAF^d~Eh#!~nB*fsx&VH6sZU?Of!u+b^hFVDygO1(LFd> zgK=VS73!8;Q^zjf7$>>=__vmEN>kO@yk( zSx|dLC`bWW5Snw15Pi}DC!Xlgfx;b5Mg61-HooyH5P+bD-QxzF$0$7{Kcys^LO(6N z40(v~;V~sYy8Y6|fxw|$VN-aV7S~D~H05xlq8Jqj$p_g+iD5`+t`EubAVdGR zd-aseO>DJW3~TzrB&?#u0{G}9)bm_)CvnS^>bYEnfnqs`&m1=(4p9=L>*oOF+~i-S zj&En?x2KMrj)#SD+o37+9^M0zFqWXb!w{+^iR$;WB=%*yTcE24kfA2iZ_5W*=kfG7 z#`Rg=M{w(RMfmOA(~Zca6U8-kLC(4N$B0Q8JM3d_4(7{b4qtvoa{b8=>Su0VYtUp! z)(gqvJnG=$-%2aJZWFyR!P>SU|CiJoSljF2{mkX}_F{tMSUK^;;o2J|zCrF~KSNCUbJD5vEuwg!|r5Mm3l zpTe!BFfYFx`r$$Ef(r>HMNi(CncsB{cPWZc14}-Vb5fm?ZchAYp}uzk)JMwVkOU+t zY7Z5;_gu7WsziLx5>8dz3j5e{t$AG~ZDC+&9VJ_awKbMGGH}{#Tq_#H(YJbF!$nuf z^?2tu_HaB#Gi*%4ZuV8Jl4wV5d<2|J=^|IS$e!Y)>p92^Xih$yo&CQp?&d%{!yyc& z;F@DFXxq6iPd4Q6mokHSqvjN_bUx}PD=2qpFTB_3PAcwp=U8w{DhAb}IYNQCRlD(D zLPk1@1o!ce0l)~AcM8==5W5;q^C26ZIa@05oC=eJNrc`ccyuvU$kR+VgnoR{)3b{$ zz%0ZU2+rxS582W?U;@H50?H5f`a{K}#ACL1fSScj^`FA|I}F2=1;q^TOA$|DGeIHp z_EP30#lu<#9$ya%4$_mhglE@Ml{P)XC)%W!oQeT_LyAy_3Eff#=X>6T9x7Oil|^e3 zKiO)Di#AAQAN4xLhJU^66xfEHBLe|)AqGY5C!Q4gl04WHCOcmjUn=p^8kp?q z6P2NBmytz{-fG_{6&Ry}!XQF_JWR@q(7PX~joTQnT+gGJVx9h&I#3A!fpBdl%>ZAC z5fWB@M2PLF`8KenT*9?9I%(BC+ES6{z+2}J2ph8Kl_7Syu}^BWtt+sv&di{p(wh1} zI%Z(|o3s@V9wlTa9u49du|c#p#z8e#dn1Z!1BoMqrt6lx_>VAA(*4sDK&vEDL+;g; zjP}7dVChIRPtuwf*~di%xR3>%Q+qT-KcBogV$K@{{ciGenGB8j*~v_j#-&$&S@#w9 z%8|=P9jVxLFIRPBwOhh#9nO@JH&IQ|_d=QJ-;uHL0d*B>nHgIKC`&NkzFs z(PAy+cb-U?JmVxbWb7L`OMh|0Q6O~mj=R(D9y}N8D}Ri#Lv8YtqUTQ0 zP)!XeQB9<#)2chmqQCl$5*i8xwn%}_x_7h2NrGBfaWsUx4&=ohl%xX-{ z4RTRe(kA=ZF7OoLTWXALTF}2h7*cDK(JAbm!6Suob2mn8RfQ`oojvGr03D~F=x347 z4W{TBid!LyQ2`Y^_;H2#rrs16=+R<_XJg|kzv<`;5XzbF{gUJ@l<@I9k?%>=5}V6H zq)eRZ?68A1zd(?XMR|pcbUv7R8a2J0B0QWlKKQ#755^OiQj{Tud!yFl)W0cJxZtZz zQ=Q49jTt46?}cf#5l9^kd-eqF=*b~{bcR0>_>cAVp>YQmCw4<@%jCB!KGhgX(wSKP zm$f5=t<-`jh+7>3xwCIx#TjiiQ%5jbL+{@;O0fC-5d{p8E<0!Q124eVh8Khu#N=X+36w~iX@tnTpoo~q-zC3+7RL|SJvp1NP6ALQwMgy=vM4nI%o^kxL7bvR7 z;hPPD8L_5RFF3?S%+AT#A$9buxZh&!PVucxc=yfuvuZ_ z?5S``Hv5Zh&nh%ue|t#Om;gwqz7n^BH25H{^VL)cG1m=_4zLhWKb zM6E#2f6bigW#)nM7oGK^z&FO8Fz0k;Z(0E*zvo+=Iq%X`)a)$q(+NfP9XAq+P zb*wC#mMb+mq^Tk|W{dfkwt0t5xXpcf9=}_wvRY^AL{L31YlXJnmOodT<J#F_B(HilE{O@f`;|H46zigQ6uOJe#uj5xD%t4!= z2MKWKWaDvK?kD1A1Mm}J?o0F_#D5g<#&#M&Gc|n|gP+^yTt3=^kU6IHMyfj`Z(+MP z1B#5=8*`49EPq|K_A}AMm})YFSSqu(29cuH73$%_8Va+@Pb!9p>ds7($z2#DozQQP z)M@-Sv7Q|i#QoYUt$YEI0)V=w6}nyBo2YPk>z+7ZQ>EKE~CEsiXZ0zG~g*o@q_&PFdd$D*2B?$JB5E)5ru|*V=3<_$D&x7fk z#7qUivS?;dcu(fN@&0ieS`Zyn)>|=8?iw*`uqM&G##-h6@t5{mPFf?DtT>|;Lg+d@ z3GFAbvMyAxK`_wB4eM4oqe~X|yhw&1a>##ASFc0$s?L_B`GGcyKOK|`FO^_VyUW>H zK68ZLh@^f^8cl^Hw}}Hj6hw5E^ZN}BCA>ZhJ>_a?mONwB`#7|AWWWXI5%z|hC@Uw_ z+Eg!|PoHMjZcSq2Ykv&u82^1{ZPX$O-Uu(q#gxC80>!#k6}w{wN|B-K;Eaef^W!W0HTnw^ zAEKq+T;j}#x*$#jf&$_0e);dELzmlxHV>p%p**61tCgD+T?JYGIy?Tx^slEq>(sStQ|| zRLJjCc0_|y>^R6rI1f8f=yc9k`f{dPt6?Gu8U)dZDe4fYKH<jb zzJ(2tlycrM9P#>Q&o+e36E7d29WaLvy5xn}<(i_Wzfm${F8n$LY2CZJ(u>lIJEMTp zg59q!04kU6y>kvmbIMY>%OjW0|7N16qMAFp4s8QPP#-i2D);=w4GEnp3VU>Ko~NHK0FQ>Vn>OxOWsdTVhS<={gKI=>^%E6RIE9 zPa^$7<{-&?%jAau>agpo1HhqVd{>aiA}#4pNj02uzxF3fBN8Oc&> zkv1*6`aUYt|_DYU7` zio10DYKYD9j6QaW*Q&DOXQx>Kh$ht{o*L5sb|Y@@WY$6E2Fc1#j)#UXg~avG%9I!u zLG)$@c?sO`RAR9Pq0%cMCk=2NM}l2wX>Y(4%a4odXhFI2ayk}S;7Z@mLK~Oa<3%ol zC+VHN0g)p#CNE@JmkvHmLgOrXB#VASCPLh2gF)FOXSR~S;QzxH zik^5y;xRsJOy=9)fC$^Oy+4O--E6#oCsPEJPY1Y^s~8iIAZAT$eqyN1 z(i)NnS&U{*qqM+V^fT>&Y6@hioF~&H`haqKk9$%RV}WR6S>Rv5t1cSAr+~fNmsE(- z0IQ3&BGROQ7BQVQa%W>%hQ8{61{DzAi~eKBgW@_^^-FRimXZkC3|i=QVh*)vief2Z zi+hboKkF%c60BHOJaWz)!%rq^b{MUf5{|c*s54n+GfUmgA`NPYiw#q%(g}Rd8jp<6 zo$@6ul`XmI0YlQ=f9k?Dk3Xz*$v^Wj&)ExwCc|Ai&UYY4Q%k?TZHR)hBpo{e&A|69 z*O|QN(~kX-yaO~Atm{2wq*qFYlG>)yi@^DJRCG;$aCCwXVPmOzp`iKp0D)GT-Bjkk z{gOv}N-ZPBGBg=7OBKE-enR6CdeBDwQ3h#xw8PYMDMXp0MPz~3l&)XoP9)=LL}Ep0S1UC9#XzmBeE1#A&PGgdTSRZkI-aI5S)CS9 zR91852ASf#!d;Rrr<<{6XRp*F^$t*J5I-wQEO<-PGIwOW(oVM1JXL6e|8ZI`=q@7- zB-8a`Qb^}Xq)=7zAO2&3lnx%k01G1cFSe}6x`mjI_ z6F5j^cTni;m%(X*S z(I<>kR+Fx~{mT;3lbNI{sHYNWW#QP9F3H)5OoeoYklBRqXTNaCVCb5u!Nu0a%9e1a z(vdi%LD0>#pu7ik48#)fKsXybcS@M;VC8joDN8I<2F#+4HQ3SFEcX}}tWK#xp}Y;P zXN+D$`&m&hC~G@7qjP6)Gm8F}jBR86ISfZFy@5|ZW38ys_NmXolLX-yiJ?T?Frr}G_k+`LqFS7u$88mw4()A$+-&MkZ^xwf>rv z1({tgEJB?*)=Do72~yDEUXFJ^l6b(L5Ndw$2umc7vbL{iO-0Tj!uY9-KT_HJvLm!& z&139`SXx+VP%M;^#l-_*g!bpSQz|6kWUpk2-|ioE$9T^dBD;nTG8>TAWhUf4(EwU% z6|r(R9MAkp-`jKp;06gjfLbUs*lM(QNXy^j`o3V!C8>=26rlhfa}XDV!-p{~K@N0f z6KEqjh7S~;I2-s)OXve9%bxd6nty^6$nmqd@OM-i>5T$(3CYPNo*x9#C9olxF{14(8C8Y2=i7MVF43QNd=swBZB*;}}g z*6~BHznl^uSU@<|E)WHCDER)e&q9ECQBwb3XppwA;XYd?QY->n2sj6GAMNAb!^^@| z?g2`BLS4DXz6@rja3|Vc{|0Yw8q1Ppsmr#=IntBgX?wmu8OH@q#n^DP&mXdO(L-^eIpo>20jlDX{@!lzyK!>(=*VM3B7d&%MS`g35 z0?EN@6lZgrSyxVhl}{#jm2)%RJaI zctjCzA-X zDMaOV?KLwE^8D5rwgjM4B7z=lF1@?T$b>#&I=X0tE}4KBK({N7IgxuLmPTE&Bm|vZ zqfRA7dG{1?A_&`zB0aw(x8@SI=}IAsgeXSZq`fQClSr=guO&3Y#$7m@UN}AqNTME? zR33<|V6JJjA?sR3{xb%6`yt`gx<}fc3*W<4YaRZ(=K@{#pnGFt zVJ47U(lphK{3!#hyj!HHicrB(N-rZ@RMVFK!~=?NHKI!9{_UI_qs20qs}c)}gr-BL zP#Pze7ar*7MB(SmF0gSZBul!=h+xTpTy%dgzTU>Gee87P7mwQ5wn|F}3Lr?u!N*)~ zv8)OBKfZjQ|BP{M0{N4wZxq83w^4k?R$=v|A2Oi^okcZug>j|n7#9YKL<_+b4I1To zMehequADfH@Nv+s3&EF2M@5q_;7qf={JE#+_70!MyNed8Fh6sWQUpVC{c96Efgjwu zSo*w`)3N55zGu9b0wYU2Lr#MY64_J$@fcO4{>SR5&t)>=hJ_b==)mLF7!BG^$TT&n*4FC6K30zwiDJ}2V1)Ia%Th!!;JdGGMmfwk{e%a`uz`p|MhjOZerc9#4 zyZ;Q+EG|2D!g(h?_$gIkPkzaDP3HX;P>(W?$)f4N=zZOT38IQ)A0ye*(0EA5;ST<- z3s))DwzziTFmzIcumA1|^4n>K$?SJjQYEna=YT~>_=y5C!AFnRk)G#rsFeretT1iu z+dSZvxOB9kT zr^5$|CYvnj#Z(JRXRL#0-+CQ3KGpdf5dS(28T& zlGb0U5z7-PEbnylFI|CcDakFlIp_%u{LVEx<`-6e4>Z9{XnxcZAK^RWxp9Zs^j!je z>$JKCDKlV2B9iFxgsACuDmhYP=5!MQ6^Fk!PLJ|+ddspu2ogn8*2VKX(iyPePec;c zaZs3`+`BVOhedI%l-I8x4$Za|oPETw9`Rk<&+=p@y}C?iR#91FyNtRpK~KUfNO7zdR`M~V$KPIEu z5cs_(KXc@~qOjgP{;gZ{bTgcqd4-b~8^u|O@flN(f<0<0sRr3D`y%tWd@znOFS^l5 zk7ur_1w{!ij#cy@e+k7f)3C2A6!KWZ_$(}ChC@_7xI-$afu>=~{d+mmxv~j-x`9Kw zb%M&K`qGwFWj|jfx|RQPasr;!?@>OGy3<*UAnVyj$fc3uM$>b*f`vQl==No7FIuj0bW+)TLp#WFOMBqVT6fTl6kgkPN`2*Z*!B@p z-D=-oXXb87#LN zO>B>24X`-R>ri?R6`QA%CZkLQCBvpvP@b-b}*D_2Yb)QVW9$8vNy{q z1zfh3FAM7E(N-NPIopB1p)02xttW=1))O*BTvX(Q>{K3dbG8y~G;sOI8rTD_THabf z&@S{u9C|nETg`;c8`zM3b%TnNgV#W-&j;cSYg=r;WF*f(nT!gvc+JJtfOb>g{Ee+P zv~2^39Sva?Q?PL++qGS#PWUv#D5nHV{_^xRe(@xZ%L8o`MN!$*yrBr!HC~@5d5DHo zZ*cXwkQ1Q$EvMGxauCXBf|uXTPQe9_&V%5-vOW4wb@O#-}8&DgC)= zkd>;Jf)Yl`$V@SW5g&GDIO*~b#DsjG{c45TBa=?(p5m~X0vPAMGP9Z9r=#TzpiBY2 zocHbASmM_Mbym&aFx1!ck}KVr`ZzZsxR!rB{Ouc`ZL0dR4T;@j<OAVd{i_`sqafEMflBvGx*Vxr9zxG3L|6<R%Ul9S70r9>o+BmlE?Og7u^8FRYRAHdE9>F8lXKCv004BvQ_h0K;Up zY*>F17*NtGwDCrDT=+0@^}16nS?-fk;Z4Y|#Z6?nn|S^yir8W$t{TB=qI&pP?N(UttnfvdNq z;t57ZxW%-U$C_1IyRklVma7YdvD5AIP(Tt^R?A_sVQ?Th3*Ei$0U6Yj zIBCX0gw$oa>%PARnk<|`9|fg<;Of!8#qtL<-b?}-jwFmRAgi?mGr-u2MI()ys}LxI<~+05T`XGaERUo^iL|>t@f6D(H7WyZlg%X zI%3N#scG(O^D&fpjB&f6@92ENu#c1r&f{2>n;V^E;%sGb)@GVW9E^T{Q0L@O(#>^5 z`7{T|L!F@arJ`lfY87O$TIzn864u$Db*tUm7!%+$|@9E+2Qh)2UccV!(d8a!ZN|$ zwj^Q2q*@Cqs}6%YM5;#0BQd%_8AQIfQ&cGPb^Z=xv^36dBS0Xr=0PzJ+Pw6iSvSdb zR&48(#d8VsM1Yl2cC?*N0K}St$odZ&FPudmCL%`QH#{p1z`@Ed*v9FcBH`j*Hc{@; zq&vxB|4Mq&pp^c2Q_gy)V5angd8(7z`!ewWELc2EE=L{gh}`~W=#)~i*#JSfO^x<{ zgca5<3XM*62vq%^wOUCydorw~Zjk*_smR75vXB?9NW-3@Fw2AQ&GRaTqA#x(q${nj zpAl#aok*!?UVkP}e=z8hpTd;3oT*TxNyjQ{Mq&IK^h4Af$CP+3c(C}RAJu}JVIqm@ zA!xSLuhVfkIN14ne`GD+_W<74Q1=Uzk=*aM6AL(TfAZ2Qn6;%6Qt(}5vJ1bx5~<~Q z<)ZXV6GZ?Qc%Z-^uPB;xLr|BIMS0D7M1uEd26q;5)?3u_1oSW}COm0Xc)gOPDN9Hi z@7rwNv00}S2`xxb=bY#`>qQRKmtp}vd_8q0PN|?KZrKr%RiHi-yp&+gaN$*ISh4`t zu*h{fWE!vg(Ee3gSTT|Pz7f)7uyj7jexSEGD6LKcz)K%1+M6UeghzQ`uX`{fwpbVs zot%i~S6p@x%KXzi7^-Wv**z+*ax+mZ<44MfF`f&=dI|Ke2ce^8kb;tZ`d{)Eso3S2 zTe_)nqcs`UV=Y#%6nxckwlPb=%9FLFbmrQ~oI(n`$F64wzE@Qtdp&BwH7VNq!M7>C zBD0~MvL2eqGa=^~Zv?SchAYUI8IzOX)hsbqZXyi5+1hk~&?D;KSsyeMLw}?ADb^-+ zy!oX(oELl~E9sc;dq}snkLh%mnz4%I!$ZgcxLS5oTCu+bsTO&(YoHVD8d-k3(KIQ6 zqapx{Skk)SE=Hl#d-P1ZVq~~B+<5O4*H7jCWu;QSa9Z#hno&2ayKJyPN>0Z`aEQ5M zUS~RPDew{PYsUp}H9IWH{zKm@&9a1UI&SmGqMfa-*x!ajq_ZqJUh&B0O{j$l>xHAC zpw2jcdCkJ*s;{^Yfs2b78gbc#o^G+#T5_uwU0ldC?7TN%yHvvB0CtH!eks*$y;LNg0cA?EHqtgW>-x=}I`bt$l^MC4ii~ zoPpi5q0ls@=t^!nhcm2D7#?Ph=KaiJfFhh$jVGrSpdF#a97wD0Wsi*H3Eg6~c7{e4$8CgMy8XDZ|p%gee)PL2C<8!)Qs$Bu+3Tdjhkk zs{e+`^{WGpa;5Xlf(~X44->bMV70ne&Y-UOPbNp>->fsh(vEQ}acRAXhE2%!;_^;w zm4Jrgcg#k8txbsE%JL6~x^CAZu6Cob$p}rFl&CO&!yvUx?j!cHA{@#FJ1M)I<*ih@ z4!p1+m%9g5KwRLvBl(nF9IAf^2Y&;P{^D7u*Mxx z3n)dtn7;`((zj7+0D0vAt5Tg0gF?wcQ{W(>WjZK{08ej6kbVBRKU!nKXV~qZy!WHp;g{l73hlnB2bj?Xx?I&v) zncvfrG8M$AJ6=yF$ph3`ZX1fDifDvnvQS6b@n_GNW>QE3kvpT1Gf_<=w4Bqb?R_aT zDgf7NIJBbiCe{33kD&fQ{tJ-w5Cfr)<0B}g4~VxyR0eHAS$V49bboUGl-gQ_$>v!M z`IQ?pE@Ge{g87r=(C-EqLjt{2go*a;y{DO9_<*{GnU_efx%K^LDAU z;%Iw;+xqY}O3kHL*oaSWMO9B|K5>kL}TRi)H;$jWH#x^xKR!^678Osv#SX=v1xK=n5 zb-ACOMwEmA(ArLBuqBTFs7z0N)Ba+JrA)VhDWn{;I0Rv;b=Hg3K=&wUszQ13hn1wp zY?cj?!GXX#X4LKfIug&?w)H+XxJl=j^3v)KsDN6n@nmi59H$`m(%jVhgYzX|Wxz4p zWL4@XQ31&@%&MoccNEv&qC3iAD66Nttl_4=@ORWwHJj}^zP^ULPxypEkjGrJbS_@Z z9BfA!pK*=EWiQ;a2kX8`(DzJ)@F3jF6J?dOPh{Mv@(plXs%4+VN@pEjDHiHX=f}4n zO7p|snvmCrTOX3x4(|vl+>Bhe4jQqQ!u%6i>;oDRz5f#ln)yA4!kc5Xcw~t>%L$u1 z@Zd`g4SqiiBY;|wNjU#0iAGL07O>FxHuQvPH0aQ7eGlcyjlXg#QUlBsw)=Pyrj1XjXW&co)xL4^#>p4!X<97Bye~zG-ksIzYH(W2N9Krsh$NCQD15TE1GF zq@6g@GaJRQJ~y=$hktESC?pI@Y8^91V~seU>Tv?mz=9Yv2@w*{B3;CdB`dSfOP#Pz zPhBp59+stN)m~ocZ}O&rT%{`4tt?|co>qju`jPfP03(dw3Zka|Dpx$RWlEG@Q@qHf znPdpmj5@*efNxx;y5v00#%PMelZ&fVUxb=RqJg&d3hzZxsg9OBK(>X$@EPqw5$-L{ ziMn6>oLZj~>;0^O4O{YA$RttdRjo}}SmIk>7Y6k9)xwMAZa(KhJfO-+7cS>rbm2&j zl4E4lCji~~@?T^u*8*;8-6M9gRt*Vj+15onJ%?f;hj&^QDqd*lwu6ba~6pTBtF8FRy=KRM{*YEGk98mVX zMRS8rC}`H>Oi^%K34d-N`|`4`q^s^i2MP3c?L>o03G?yfabpGHNfIZE`Me)kF)>m67dtz{u1cm!B!1i z{SQX53bq#l6~~3Tr7iNe_ZHx{*=|!oqBcN|+cF=pKeoDlcJ*`(4KFR8fTJI~Im_nE zdrWme&A)yKBD(`myu+&V`bF{izcu-G=LtO@=JGpC$8twb8(4^&{$Iz51mK@uafK2@ec|W7sY||g~hZv z($7Q*1pU+yL1J#~$`GZ5v-iXqqNd<*6v6r{XYBrIWO8zOS$$JHc9W#rREJZC=j!@~ zIQL43T&r2fY9mNHqwp+)9Eqb%7D~oMifg%WUd3w4+br0__g>A4sB25 zhmY7q`J-9O7;h{okr5k)`J(H8H%kLrfBt{K(j&`P7NU;uVqgEB;L&!}DJ@N82;*0c zkX`ajWU%{;u&Scd7+#T*^B3TvoHP)32&!DxREX701VEQSj4l`eCLFqWotkb%{i_u5 z|1nC^Qi~AYrPt8cJB@3<{VIFFzcvcF@O(l#;`Tv#ZqKRy>KI{t9&(2B5Tfna?p#Be zRv@%k@BAD{oH}k*?oUURhgexjAxj_!Lm}rt<@ZDZBe1Cuz;AvmIqwfSGt{2FvMwFm z<~0uR3{KM0KdgK}=1JFyXe-)~EzvU8^M`j%*Sd<{Y;?f~HNtVg%yq$!;+-fQ4mn`O zBL8vy5++bYR+QBQn?0k!@fKj^m(>)cG+jijmt78Nu>^1tw4vuuHDd+Qhem&~_IqB2 zD{I?XiHfmu(hN@?gwOTY;&wG|`pe2`F`vuFizNIlm7&Mgq@Se5b>Bn{Rch^{6esCI zL7*=&h$hJVr?C6qCn-N?7SxzO_<`~23w5G;#NEx%qH^K%0FL&4A(qV^0bB#V?x#6W z!31CCKbO}?7Y0~Kp{EBq{Kz>OQ8+VOyqhTO=ST-7fU{2~9Cm3_DoawG^u@zoQ*Tif z(Jx4h0h8IB!*l$A!DhTp{^f0)!FJEcV+bot)DRXT(c*KY+$fI|6JbQU9ryp@Hd!*c z`iMJ1OT4!foM|?p90@z%uY}S(qnT+zl@u8XKuFdszkB06+n&4A$W5QK@))Y4Wf(IF z4giDzaTrND;8T^`eZUueUQ;-XTjUfy;XImipumx@AWh7()@4%%+%ZplWwtEziAo?4 zvS=ij;rlu@JkK`5u z+Z=&2-EB6~XGB}vboCV&vjZ_nI1;Bu&WJ`p>q;Il=kCpN?m;!|`IEMD$9R(w77D{| z49=Q=8tb%o4ao;1)hWH$2q?G-^$%OLaB5dtG;V^vTQ?^>FcJ-=xuc7PtacLPnaD_3 zLuHF63dTeAunTosLsg7`?q1L+3iX7-aczj$Lr+G9BX+M-AsSF-ljN` zAxgMo;dqU3L)b%y;ZF>Gj<^$mF5quEXG4|OB^xM2Y zpqtHh;@`@ca_2_gMSC8yeWC)NsRSx{UlUPv*DLdxv$S5p ziDEO{3r_os?6%B9v{69pH}Jxz{rPph;A1E?%br}M9)#DpEa%`>AzP0f8vr|Q9{G0X z1By%R-^U{wZHzBX>M$I!`#j#P2`{mUW!c? zX@_2d@FV;+CK9vwX~gb1>c-(bsX>N3ZTRicG$~CX4AW4Debqs zm)mjbDTEY$c{zOqKE+z}3_^#Omx+o5t4O->sn5gx!yLA>hIOE|V${)p2n#JFjn~8f zD9I4&Q{zG3n^@V`Bi+^%D<|#nqjT-lX2-OMC5|t1-r!a5aUc|P&%BM z5)p2Z!=#8Sf&}8j`^(i&4Eo{dc|yBdtbw{g-CHL4%qxX|xRe<2f#sa5xEFK61>?>B z0$|(43g)vG{0)jOEeT@JJ?QYa5y=EmW-Gxx4?l=xjj@=*^4xO^iBuk>)ge|1={Tf& z<^5Gmfk3DDkB9{;BTIuQJ-TXQO8nt({5J%X-C@4jNUmJr){oKIGDqmjoxFSkK`ewY zysC{G-gIiHE=w?9f&n}JSU1EN9Aajpg^}!ndC_2*!}Pb#pal@ zfq)O;fm_-g^E6o^5Ma%H^4T~SBVfB8*^@Z{Y+}k`$#s)s;_g}e9*ZND=_;!&0GeG8hp%P*}9E;g1s@#lvlSJ>pC!Oo&hwKKp`b0D=ftKiiOk=O|?a^d>|=uZA>dT3Pu1i#jDVEVa@Afw_V%5bsoqT_pU8} zJTV!xn~UMuO%b;2B9CT;WVov7>)_iA!-Yeoz|tY50M;XKVjX$}Rbf8xXht+@*qmDB z@0SN_v{R?BDN+SEE5iaBs~_1mXy-0mu2%?DO`qP~dXenuv+|K_`T0qq4X&|{p3uU$!T^lM8)8Ot)&r9*bb6zF&hq0juClO~# z$JQ@gClb_(+eE~(qu)w00Y0DeE!y6tCPPgE}V!ISMc5V4{%dX$$dM; zzeJ@_rowlxO#2r&_zdnWkiXm0%L9U_Wh>J+-B&o>y=R=@-IuVJ#!dzANv{JF(fVy4 zND??lk##@PZ(@&Z_8Fvk?EZZ-AJU6f6weKB{bj`p5xq{_N_)G$?|sFynUQZGZdZt1TuLe`AABW^2o2Udset;=W-)Ne zzNO^2aaTx`1uE+y=GK(d%76&paLv_k@OXmw3z#`h5y$D{4{D9neFLp@sF1JQWyTt8 zF&niz{kjKWs~3rK|HOIhhs3w3){{$rr)#c3E!$jz3&Ai+zhn?bk7(BCT2;Y8_W9m)r_AzB}VEPkyo19stGs1rU@q*rM+4z zBQxvY7;RK^l{~GGAs=XjNN?dHD}T8!@{i3W7>62V?PR^0=peA=UUVp)oTM+OgdM5L zQgBNzZc^;BBor|HjUZM&et&auA*ChHN^q*$F1>dQ{9~?ljOsePTrR<0&yG$2^^hiL z={mwUfm584Md?xRTEdrRvRt`9C^GpV#`5HQUYl?O9FZgA^amkd z9k)JU*IBjmK8bQi|LwXU7W&pZfE`ol?e#hCMhUq8=lEcWKW-;$2&E6bA;fHtYpLsP z(>NMA(El~E3({zK@+bV{3L*VNQBPFx%|C`WE4SZCAO24DS7Ft&uJ{Eutm%B$qRj&W zDPdw^%*&7q#)1T=V?~;6&^<9WX~n8bbw``-g!5Xhllta!#8k_Ta5U5-5yCq{9}^M= z7efpzhY=~EvN44SgLkdd5Ng_bKURAf-rS$+=Zn@wTUl7N*+$_`*;1WE>ei{?wC9X? zHuj2;KM!Y-{HzsMp6#tH(B%F&CIq@C65#*wy%|)Mcg8jocg~s$b#}H=2R&RC?OdEH%%*l1^n3%bwzSmh54u zKfAb_o+G)}v#F}wT0`?2lBRdGH{U(na9Yad=jJFH&=b+le<5c{@q%hP+Qb|*V%&_= z%o*!(++ZHP%h}f1BzanA`8@fFvXk-SU@v20ILB>1_hjb$!>}!^`Pd!?l1rVwb=>iw zU@-fdRzG*S+{)eE&t@Sr|FBXD^3Kzy5FDqPy}jTK{RzN($pCm#7PA-U9FtuKv{ivS zN?NpH?0zd&voQ|cRt_M*pji^Ius4@Ph@3RiOnWR8Cqp)~$&C!% zKfR>E;J>3sreLn@-_OUJ?&lj=y|MZ9tV`zfv(p)WOq&!XV+}@NMj3M`jjyLTm1EZO zjK*b^j4H)Rh4#G*EaMSx|oKj{nZubEM*Z zr-FwYE4&c6IQsUYxUKknY|~_s7F$9qy)rpI)NuS^O_7vPc!bpW8;_R|4Sp{qzuQx+ zv}xmHJ{^(Z9%}I|Z5s{>9m1HH)*FiVWD-M;{6ibn_w`~uy*;$e*40dzQ0F=wkxV~W zgN2L#$0}Y~p>q}`a-IWe3uLg-5M(LN9cXF!eP5g(%Bn5;ZHGNRJBzmsF1@xD}#UXvAg$&Gi=YxSzo~5S65YGE@ph zxm`#v$U{X5G5BId*%|0hB^Q!y-_P6&hf`}cl5udPZdH|4wi&Ouk7T1qbuZ3>z}_Dq zj|uX&K8$DcGnY`=qz~{9j)P(W1FMO?DRob#8WKr|ee{uDX}^I!N_LGqrZX4K zGc$2wGK}$g-|Y+G9JROZTY$1pY~vDEyAcWFR@*ieSHD~TP&B+Y3)FT`)(2S#sd_0R z1opT6y48dyKZz#DP6u7GHzaZm7%1q(Et&lx7{rvjzmvvvakf2wdrg5NBn#JN~{38!J3MT zrGuk35$48l&UHO2uIhlU<9?2Vg_RGRTTz81CjasnF|Ugq(%42nnXzpnjKM~2GRKzT zXJD3i9f0tl+5mRVGm|Yis(d#u;SEd?J>sAzaK5j5b&$46|4%MP`dXjTfTXWX1~L zh6)G{X1L;QXK&B$9!Q>IOibd6J`QM&HM;piPn?wr5y@U3*>H0R76VZkI5qQ6&Rdvi zw&blBpb*Xiu(cAS;2;z>`zmV+iwX+dNTTHNDhpG9j$~PiCzlEOOi^j2ftuk%PjLx% zw`V<-IBXU+Xr>2xNLvGOeHj5?UL~{r*S%r9Nq)-*>SR6GYU#FQ0SAQ1jSA{;8hCB-+cE6%K!jvsv3@qaxamUvyjyHdCIiQ@JQ8Dt&u z%l3kIe&_HFhX0om8G`MDl6Q+j8_-BH?C0`kl%~gj3Zld|PuhXg6|;7JPV%stsJ8o1 zpC^mrDN+jT%40KN@KB-^1O{cxGJ%3>#8+v7vF?sq>Njz889sAVAbG}Qb0)@Nmr~O_JkL<{IPsWp*;kz_P`jYfvQLy&2$?H;D zKlC_X68E0rp17tni5mZI{MLX?MM9Yk2THe^ArO4e!H7R{mx7Cb%lofi%;4U9;QF1m zC)M*mWvkCm{%w~h2sWU)~}&5;HaOgucuuUdy9uE#U3t!r91i%P9cpUT%4+f^d8 zcYGU6^KycOj29fsuMs8KpjkQ2NUS7|=N##hEpUQJJ5REj&5{|8xr_-r@|W(aEY^ec z8vkNGZXsy9H^WsfN1D!ApblI8DHLLS`|U9XhATD;>+P$WiQc5 z_p8*;4eAc^4DI78mZi&2E;6oURHU=>hS=0q$<8N8-KZdKE=Fs#6W%T++2}Xf4)oe? zB!+X`Q&`ovdAD@}7OSVkX;vR9y!4lwY)5PDHU#H70oK%4n0N$0nysI6A5JeT`(?99 zKCFii0IV^ADi0gesF z#6@o-c1AkA7G}XvyRFV1@C|iMP_*gAXk;$0u?G#v)P$i>4 zebnGiX_nyhNXO|4l|{RD0f?Jpyu}v+&-uE9-^2 zvJ9tDraI~%)UpFlWNmGWVQhXvCXF~Gyr7h~-)^tvSh>3BW_~@~Z-{36*!xj5Rgwek z#Grn!di{1uM7!psIXsBfva-GJ_0nlscW-C4I;Z5RL$;>0GVJVP{+Gx-|xuO027Hl`zQRqsiAl z3ml!?KkXO!JKJs@%>!;Sjrd&1uy%+!UFt^Of?9SKHn0deqZ_;5{|Y65KABaBdKf`9ATxt>mn zsK?f`h7M&ICm6qfzZi*s8fz<`sg-p?2$S|w@wBo1$f>91B7jGdb$|e$i1yJCNJu`7 zqIXiXwOo51d5`q=b^I)vBLGTmv2I#X&nni^gFQiBcyYyT>T5k^G3p#2&MMB{eZKkM zyr;>kwz*^j8Hi0k-EuI#?kIJip(~&7sqcFxk!M>rm3ZW@MVrrzhb=vC{!^x8hra^E zK4z;bhU_5-O*Lkdhwd4pQm*A$?pN(RKi9XcX1p0f1NiPmx?lHsBRUXH$c)0$bfP%B zZ?CTB71Gd=pkyHvF&%1umW~|!a5j1pecydup}uPU;9C}Z4#R?Zg!jh$bUfmgA%;yB)%rdxd=XxW)2#wj@VN2ADf z?jyWL^#2gVTlWXXH}g}A6x`;L3<%mE#=I<4q`WKmifiLb+PHCB4_gn7E!`9{{u+vN zm{nA=Ezg@$r?x-SG^#cCof_cnjh=3UW%?Od*PpqX>Y2btmmVK>B!-GZmj(KAh9kfT z%v7UV1j`Z{lfvXWC*XSU1~1v32iHk|$rh#&@2B1FoozVTU5D3C=R76yeW^$IN0M~J zPNOBj6u7NmHGjpvb2RvrPBb3d+W5>}Ex`|3>?6UOzzJI`78^}Dw5)b#NB_Am-BQ<^ zq0ol(KIJrOT6ENX=L@tc+Zu9n6pE-+m)>xW=`3h}UqE=D;pl)N=9So81iQ6C3i!=! z|Jpt^oWPCh*gxz4@CG^dsOfK|pmfMS9LCmHuNV$iPQxd&tCOdTc`HDK^AhyucDKLl zddT*;Uu^J1-c=+eeilsjV&SUGEb*^TM=S5IWS~LhxCOn$$VSge$!xWL1E4K(;pR?z z!SJH1aOMNxY>xNqy2#m&vdl#7!*1w@Q3T+^wP&vKWm+5#`vx-c^*)Hl*7xb!;>kXj zhA?R;w}aO+%{qkv7NuD(w>N3#+M+hE7FRB-FPhba)niqY0zMP|f?17@_n>gsqPU|* zDICoGpys%d3!4rJtco9dg@f9EuHB`doq%KGaBe~i`=6WXG9}tXfN_jT@k_mZ!e5QQ zo6Vk=>j(@#)|lK)BJ~g*7aTREOY-)RhOzC4Y9zR@rG*7p5s7-6M3HDH{TS zn$EdDR^6; zf|{%%YO}`Jh>{6tWXM4bG%`Sj0ie+EqV$SXusJrWichu#Zo zD(h{cv;N^Izu@|Q)@)C!bD-)$TTU7bFs_b(1;%y5gKOx0j7I)~Iw>Rd#xkCY_+@ch z7N&{CQ$}G9qNs>30mL=H_X34iOT)CWJj%Y?XJo8{^@LU^ja5t+H>WPX*fzLpkGCEN z_{{u#%d5JGe4NjFVW>Xx{|Rw^(nP(L^@`qq#V_vyGoEo?kgGKiREqUf3iQ@(Fl4SW z43GotTLOxJ2Nr-N;DNb-=$Kumz`z6-c&_;vb+^@p&{Od$<#urT*c^IDMQ8RjQ8)PO-rAM zbQegWo5pmPnV^Ca&@FGhx}GcS{d``?=vX|&BVu*&R+hKdsVr(XK2uc-x2BY6Lxjb_ zLu=`+r!K%lGd~TeCo{k{I+j%iNYw%r12nZj`7el!9UO0o3r)(poKPrY!t@;`RgLEj z*phWhW}0ZWvP~Q-i)z{!Hu6rE_V=#kd|fIX^?9cNfLcdsM5#JJd4wWqMs<;)VtA$$ zv0`+p^nCol^rb=vYhAixL6@1n9tfI6m!$_`scV&$m(OaMKmlR_5;7OK8XOoEn}x)=8oFSa7T(L+Un+mT1q%D(G}ueEcws(H;I1JD6>!gh1N+dv`hKwrzAWAu zh(2jqt0~W3CT&XDQ~o^}&|e#`21Fl~VY3)%V<#^S|HbiAM&pk~S)B(9Oz4pj(U68O z3pe24DW?j9)2s&YBfZOVJswjzfbTO_+$x%l)?G;t*=e(&{odLnef)jZZqE59z1b#X z6oSUp@$S!Ksr@nQ*1rE0`%$$$hsMI+!HVQA(hYaM?O!q0_%!xaa9q%V*W7S#-pUV7 zcKpbvld8qOSiyS+x=!0&zfG=PYz!nnFZ@*$ucC3XVMNn@Fy;Nk_q<`qz(g1Ke}|T5 zcMeC4Q1(Yn%@&=CWNkW?M@_ZJ#UFsnoK8seCK?EX@9dGXW@JHcI;Hr zAPB1GWF5M}S)H2l6{(QFs9`DBBL>Pe8aUf*J}1O$vSc%|BOF?u7|Wc6PGP4*)oBal zVo;QOHy$&jY?S`@m>1!&P65Q8GKHN6eW&@t|7E1Z+-Zi0eHodscbbKA{~2(1E4yq8 z0&@o-ug2!YFpr$`n{)Q;6;mhgMP0&6o*cQ-Vf?9#Z!UYZmJi{CNO{%61<_E`)-&(O zGaZs1)O?wJW>2g)`%j^se>GH0#bg=asDG?4P-l(Tk#S`wzqFO39%CrlG9gdsD82X| z_ZiTS^#P}@^(Tu4PVm>_VHPQ$%4ItnnO0O~4l(TH+c-`Z6SXmH<(q!4@J*?7fT76) z(Utyg3J-XCVV!kUYE&hwRtfzny{Y@oNAFno{RjOmTQcYX1@N;Ef;%0%*xXu{I4pi3 z{j$9PlvHckQJlyyui{#-onR~9!m+dHyq1uOPYfd$%s`Rz^*tr+J}?xBYFCvf)eiiq zDBSlnsZZn(q_3^}&PC5w_np~EQ}gwD{s+H#orQzeVB>xOjYVMras?<6aQ3s%I5)mF zeK0f{oq^z>|uY7niV!eEL zJfeNv#NqkMRnUm!^ku~3BXq<5xtp|;jilaaBk zT}xB*;9+!>u1XyUq`Vy+E@k{tc2oPEp5C$cJ30L=>qLBJgrS8dGkG!}0LrPj)c8^j zYa%nE)?#cng0NzAy7XW9=%kKqk^q09NEuB7R!C#%I1p>46kS_czih;c!=Zwv0xP5; zuUzZytF2N)O#l-;f~m{PTYD{A$p)?AZ3K zy>8;Y$#^-GiEe@-lej^z{OA&1+o87NEs?k_3dfnaEdocCxGju_eeRupijxAbB_lDA z1_QFX1XRAXI!@@>PJq9Zj;@WCSB$TWMpcY2fj1^?>3v|kQGOGRy~(o7viBq7tIn{8P{DMG9(Au?(e5Oru2p>a$3p=~yVb zHBC_`+^BQ@2js{b_LSSGMNK-qt4uq$j zS_Ngz*x~ce2&11rTP{OPL0NIH3FiV7NrzKIa7iV4S)5%pL%2t=C z1O3GZYH#W3lCXZI_Os1eP5iGnT)HlIXHr}mwh9~{K2|Ux+xW{+$Ojs5E-uZ``q4=D zi@vUbO`ZM+M|N>xQxCu%K-pXhrk=Dlx~r|}Sq5(>zEVNc3ZQH%-3EfRy=;qKR5Zot z$IM;GDwqlv2I^}wfLQaT@miW{^kbGL1^_8`yBL_hmA(nkW80qJ*0XKZq89TeSObH* zzP9~Ta06^pj$vL1+0|;FI*Zde>ydQ zul(&Fv5YDo9I~`79~|JPO4?eWy7d-1#j(@T!sg$GitK;}PRkIiux}(FU|W*Ym)e9k z7Oo^2Ye!VTDMbHC;dN&lc9q^zW*gw zjd|0)p258vL5ntDRNLhLqRpuP4{hS=spi%kfAw~D^w@>NGI36#y~jBOJAq<>+NBILIm}@O3|+Bz0x=Y+iGF`$Lrp8M zY`rR0Sk13X#4G@ZVZWD->-yY|-J@|iR~>fJT=40itlu%HHj5siA?tv->x8(HVbK%V z3cStg}cy zeDKNtlPd#;ep6*Tsj_adW6TwD9-=Dfuc>* z{eDtZl7Cw+AXFi6s_np>-7~vdFO#?+5d5gQU|kz{-J@`&{^Gh`ivA*_gRJ@z@yD2) z?uw#Q<+<Ro9{BU#d#)bi{J#vB1Rd9cZlxm-u` z=bH#zq%Lrx%$Z(l6k^<;3A}C-9$y-Ysn0j~I!HKfa;rDo} zoYOtC-JC$XSwzU!uRWBzVHQM`A>p*lCnb$KQzPUvwk3m}4qe!?vw~HgO=9`;oV)U$ zc=_(MARoC8orPR6nnyuM?vEe~^}ETir*$L1?)64am`2r546yV4@rL|J8)mS=2`-1) zVIPvb*Ov{LIVaJ!VaqEvoIykN{zD@bGQsS=%qd{e+5{guxbfN3WZ!Eq7sK%kyW!hy zM30z49(M-PE-B_BDyVz)?uu6q4po{b7fHGM(!ZOcS)MR?dqEB#pZDfrevTK@x|vcG zoga~3;b-K#!y5~3vweo==kZbB<_I&sTi&6(B{YhVfQ9aAUG?v=&?w2{7-@iJaa8X% zI7-TsnOQK=9BI^=0&@}F(v9TvpP8iU$j&1Bz3xnk&tgYk5E~RRL)0ZrlgNps|(C@zKiHBQ%EVo zBIaRz7c3fu7E%d=$SV$y$Z}T;B{$3{I_6J78%co_lesSOITohT!}K=~{HG#>c=t?* zl8T;EfcRIm3XBRgtO6VDbbJx3 zM!+F@4(*C$56E_VCV&#b7U95Y*Q0MZ0HBvmtXQ9j8i6$T#%!a>Lk)2hn|aHah=T%t z5Qe%uEl+xt7=_wFf(A$S_~W~$vmC|Y?0-(RQ?@K^$k~Xf6dzNg;mC~NM?oTT+7_WD ziuJ|vtKbgsOcqJ#_#+v|@_8r_nm0kaluBUym?sH0yky&^ti1LK=C0pjgms%}kALxJ zeTsP?tm0&`_3UH37JUglL6f%F44usUuIlwy%cIf#R_~vl+E4gRYt!t>P(}{^hX=#o z(O6CxD9o4;?(E8HJps;cYowD1*)P4Q420SptKB8YHG1}+-D+Hq&+dh=M!AnhYS%*K zHL7ZvHmosJdD?K!N>sDM|BQ6la){n~Q;QPGQ?w*tywvpm@t~DKU4)VH$I`_fr%n*^ULvEqS zT1T@xlZf)gYsqm^e)6dpnde6BRO?P~{R}ON+*e{^86`_u@CbI_pO=RfXH!APUdMv_ zD|JrjSZVou?47H2;;&xpXdA8zSyA|9x!AgN!fMHWn_BtB!jLsgUowBw-7)~Q4Ef=} zsX-e!HT)?zx}Z<@t&i|5j&)Pu^0U}fb35%>ppFc+AYsWKOZ8iwPS^$ zy4ix02`~3cD53D=it{v|w4~|OhpU`xtzSB8(y#&_4qT<525WY{A_AWlqMa@pYJP*z zf=g1JSei?0N*=9l@wmRVqJcjmY_*vz@0?6Mmp-{DJ@5GN_(c^?cjE%(v;t{afH_f6 z1C5D01Ea#iD z#B(3dI_iF7$7=p{!o*Sj()_+X>%>Gl^|<`GKf}JR&Sbg@d=e+?d7RCY@wD4Kzj|m? zd_pjiWz#_08AHGtiI}e#702_SQ5KI%+}y`~WZ7&DQVe$gEuoIbZHdMil{C_CE6wDZ zJTmAt085+?o^ZcjAvQKknWQLJ>=)J=?!B%RxZ4Qre~XL+%+wfb-L%BJcromNs5D&; zL^XhcA9kx=#|SpNFo$QBK#g?33eH|dj|wX(a?RUFfzh< zb?3Hq|4o>W>@SEHWhTn(D5Z+yd;ZIF(dybzn68H)DS5Gtao-wY(zssA&Xbpz8YGv? z*&4!1f2q3T1|Hao?MTcN(6SPot-$ZkWJ#fzrVtw-^9%;H)~QUfZIkE|>D`ySKV|7< zRML}T55j&CUEY+wj&i%m_}RSwp=B+pY$|6!E*8e#uR^Iz*zDg5##!NZ#gR|^la6sP zswvkG?(KA02;mUvA?50f&$nFJe2W>F>+`EF1|;pa@x-b7zww%g%&|>YJe$fCphSoS#SR35Yqh~HDAVTPkya47m58;Nxh-ZRKQY|xgR1r z!sjN?hN&Myd?YOthgQnhlfmBZ&u?R)7*&IXz_X0KLOP5JGt|SyLtnsVws^O)DmQ4$r1o#IXan2}Lk+6*Aj9cM&E%#J@bdAjZL@rA% zID%<#)0EYe3!{NNqVzU>)17c1_iyh#`qhL?CTp#5w3Z9feEYv<=cA?OGj~(4z7+hN z&fh6lASCYHuar7c^bi6(;D!v3$+vEYzu#q>J5ONW zu3kLufk5#YiYSI)O5H9E(U{EfuRQBY_^gd&PS&h8X)qie`2!J7Hz2OgdkwY0zyW8B znFl*1?gQ-7C=G@8Jld;u?gOG92V$s!;X~|vNYhnC7kf^EI$0uKH-@Qn@=IDtF$w-z z?f!)vrPJKh0~S4&b2_k8`-+>wLYx8@pmO*lV>pVC9-Q8Ze&h;FO6`K6lrdxCd`vMrkj9A><9g7ozCspRf-Yf;bv#IgfKlmfoJGPc$ ze^7W+Gvn4l1ZUDleEOZ5q)Y3V_VygOE3EPrHG_ex-#L#hr0>~zZ+gGueGCatk3I`R zoESI<*+2$JhYDx%8RhK4e6iTt@;M>*sb#KL@SiaRUyv}}#Gu2Jy`$Jq@@ey;ulXbe znw`9Czkm&aI@3aY`nS|30(Q55V(vP_jF!FadutwT0t=cXV!2*3cq!7HH2G2|JBfiXcXl=GF9nYQQn?pt`T(>pgOVTbNz7ORV|P_+vp+c@l9Y2WN1(Mh_| z0ZUjpS#0Y!&Tri349X#btB9cmRgwPb>(eKH9X8m<#W8AULG1k{wZS@J#=4|3zP+BA zVK9uVysbB$m8T^Qm1aJPeG7(}_S_ev!6!o;E9Me!mT0S|!2bb0w$>oItzpr zaQ1ELTAZwkzoNjwmJ)W49&aoiFfTUe5B&F}=H40q32n>I?Zy%=>NxrHWcoi|i>Ui! z27kYir#*O>RDd9vEx`#Mn_Nu{nO}rIDSrH%7%Cj}4@Z3e?hr_WJg{37_jEQGx&qK{ zHPY~qbNdVeZX;pFH%$b%hZOVL6Y;X(dA0Hk?NQp*ULIN7wurUx;`sg&`G1bMv2kndEiwm>go2B0q>G`=BIoAcfzR#+IT^1Q5~JJ0wwTXLyQsYe>fO(i!`{ z+O=7w{RD*&+WIXs8--_OoI}RvNTOvkQ}#G@sDFatU%k;i6YUAIA-U*jkSC8tavIZd zIJ*3i1L2}&(26llO<(s&(I(26zcu+eMR%pXXekk z{Ct{6ptg0lxmDO~o+Bv%9oE&UPeR=(`#R)*kwPL|Z^XTLBf|+e@bs3n8jhyA%2GXZ zmEV*?4Ij3e8n@~8NcfmrANde)BG)wZbC_0h-Guui$*NpxCl-*-51Z&$U~X(JUH@=` zz|v&YJD|wQm9#6V%4UDln-rZN^P84unAU>5Xdp+>ikI?H&ZV6uy5cBW2n@>&#XnKj z65VgWz5H_VlwS!t%Hbj@n5{c7&-`PCvp}o+i@y+x)TW`g%6I?iy@n(R{sUZliP~=K z=b3Z1;1&O52R`YCPD*vUg3sQRCFkWGcUG4B&cSlzmd9u2OutVT1`R%DDTklGz z`O1F+xpUKe!2|%$b$BY*ml5j-N?)fwIO`Hl%R0E*9)iU*tvLO`Wn<#_j(;WYB-w*u zv0NB>K>n9m8=s}u4|?sS*t#%&q70?c0FVn#!2 zHzaD7LC|htxxYjFuVe~5!1eciZ5pQp{8AxL+LR0kYDyk|Q&Y5#Kc+H~$0hJLjoaKC zFq9|IW6iODim8AxmR%}MYoh!8SBVtFPZ8KT+ue54Z;=4lrr^Qw%?3(OF5J2@Fw)5N z|M)T2F2o$}m~}}zUX7c5dQBTUu|-Ie0vAtjX~nUq)4soCr*t4Yp0|hDgg6u+Ukj(&NXv-g0&oLv zvokT_sKN+NWHFC03_a zuM-4NL=DM|EWJe*aG~G#`5gdqVMLpV;R2$u;(?hsKtb*+CPTZ$N`67Rk z$Fcil*q7p%oS*Z?^bJp>dY#NKrh=Lm=N!f=M5~{Dg*B(p%W8%!!^n!?pU(rL_vyt$ zP!YoZ{ZmcF|1a>&6fb4EIC}lw%(opDN)ss=ml8v^fQLuRA zi;mZCSa)>qdCE$Nxkd?kH+&q|GJUez+-pv{HKi(0Y4R!A##pD>y(4Xm+Nst5V9u~x zSpLm7B9=EG?K;P@1Jz~xr>d!ddj4m+msmL;!K5i!&^WjHX7rz}0u%F#- z6^OIdne9bzgb>gq9^liU9CcS}r!z=-4_ex|Gt$CJKxg<+qSnCfw_hiXIkGS!{$a)Y z{3A8)v6|z1N zSi~YN03}`0UfzAf5X@siM=Fs}vP%_S!>!H-XrCh%H1Wc%Q*FEoBo#=D9s)T9EVHpY zC3Oh#KZhGlplZx3+kn5!3L=!D|h*_MUa>i zShH_S6(03t8`oru1C6Ge`(EOP6-|sSclVB&zbqI8Xv9#0_+!v2TH6a2O2sb3PWdS> zbB+J zN667L>-eq*r|v6q%&FM3=NM1RAH%CWBS?g&YK}4!93@LS#ma5QrwlB+@)Xf zf`Z(cfalmN#cY)^xlueUDR?`Td;0gjG-Oi;f_pRmEOvZT=L|DUv$35TbEa9R_Kc9H zG%pXH7E+WSg!&(NY}Ic;$413%t({tfpN4_&#O7>GT7MTRD*@Wj&e_(i#Q((cNGbI1?8ykZ+p(~%Ez=oCf*4&e z)g(-rXiG+)UnF{xY%%|Z;F3}Z5kW2Ruq?5Zj0S$?2B9jQs>>AE(d`R^f*3$)tJXw8_JM{7JGc$c7?}4=5WKpzO?;xlifY>cjz>)#y?6cBPNyqS#*Wd&zSDV!q*E8RxZR@$4ZPXm4*J>5Y>1>kHG zbeU^=j6dmw-KGbKvTYdTL>Y6vF{s?or5Yicdv6Kx(fMOOGeS-@@_U{{95aT_#qq0* zqzRu#;@ZdUhvCD>gk1SdqLQ@EpR}3c*R>be+StcVrL{8`xEg%0CP?+Kqw$ zE6TFtc*j=FlZ^PUT3?(61%>X%7tVzx(}?}voGfxp4f>{viqXa>#C!bvPyg?mSN|^+ zoXGVxBr5VxYwX!J{5;yJ8FQK$cf@aPx9<;jfw@bU9UgUEOKSofcA2zIf;&s1vna$U z7-~kQ76=Oa@`a{zRRoaq<>~egk@M5*-ABTrGcdavy3Gk>e8$&@X*Ej$%fEcPg9YcI z>JK;1z=UXMk8fYl0$_wem+n#Oy4??JsKB)+XnQzLri*7~N8GqgKVi>tgSc(X+1UH< zIt}t$wUoJvn;Zc_!mZNp&}0*2?$FKy!_ghOvru5MYPsFG#{EaV)R5f=hufLxaLw1B zIX*<$ZLIyzaY@t(Vv*N8VflMw6Vi9~p?k1i0f>G9zzsga}?s7<(kBPr43|_Euw@iB(% z+$!czhUzrcD3q(Hs01tIRYs_P|v#(sr+sTnw$i{x#gZSK5o%}s#EA0)Y|h5@5jT6 zpUwie?VD?hi>onKe#kJkzNY*mW`jNp|HiV=a^#2vU_lgWJnPMNDh>M{vy0fN^a~pw zIkqXN(@_vyLtQ*O%r>*ZeaQZ&FOYV&vGPuVT^oPr7O`)1xqu{8N{fVEhEp}67HX6Z z<$IWgA1wK!<0T??r#+KpiOA!aX+p1O>dg0&OU`rnjXsjbA`;%&aC(EtE3GhaDJA0a z_&J<|LP25Rsp8H@_(ldL3;887UcdWaL$ZF{=YLD3_vph4JX|Jn@8g7W*!B3suWSXu zfW09kL-@SuejG(g_UAkM{}6T#L81n2vTob9ZQHhO+qP}nw!2T;wr$&|eY$V|Gk10q zF%jS5i`vzy>aEOtGDW_Bfj8a6x%cU@?!ClKx_@(My_#D- z3sy>iO1&d=d@N%TY0#M6Y(hx|Q|QSOlqhVh<%7ZP$nkWJP3O5t;@R+%NiL|o$C8V< zpBR{T%2{SWt{`$AMHywv*VGpU7&0J;NkjAl9}g3+E*B0<2}5rd9!b~z#)C0fnmC-N zm-Ic7#|ssvcW1Pz$$EjAf|r7G#=gHP?nNx|+`^F%q5oU1;0b>& z0HV|`76X)CLK0?7kSBvs@{qtH&l%t0U|u<*py*Rj%7nqemSJEk(lVkCx0)_5oS$~1t1-)LgN-$khDtjuo5rFogBqqw zbJYRN^4GM>(l7YsX*_bsTGJ`FKcP0Z(kei0%XJLndsP2Xfo-Be%8bKOmjO&~4&xzlA4ANF*etHV7oJJcZhz~+$4^vgkgHBhPo$C`7t5W-^! zgjm#M{^t`LBtc8$ZX;dyWR4^V$7>XXX*F(eO)319KhdD2TLFI#hhuw`qMo#-a8wAe5>9gv*;e8}DWU{kl7~Gez*816! z$W(jCL+3F|e^wZ*#-8!8LWRC%gqJyFk(ITH?jNI7I1CfRkmDj?R4!di23906G4Xr3 z!7!Ji;x-pdjD%qnNu0)?M4q=Hf0BqpN1yh5A{IO#>#GhmfEpc=@nX59Wk@Xy@!2f;jw7_{urXdq}ZPovH_-#4Npzz zcoh0kh&rTzu=xr8vpt1L%ehI(26I!3rf~bX@1tk~SbyDmRP`&D!UD9J#Hhvqcn5K- zuCdV5CuHUo7T)`QobxmccV5o1q=AZYXFgm&3l}WeIHAzfZ=}!d5$bkHvRK^wH}?LG z-M&m%PQ~#e&El*cI0O`!92n8zQwwtAL;sEQB4SCEhIo=fd-|lC*+R z(%a3SU%6pV%G-frdzcnB82W5V9$4cW9QPd+P8N)?W?~G`6Uoy7$$38skzEAB@@TQC#k<+5yisT8J6iwuy~M4!`<}*gXJxq9uGZe?~~crG|sz%!9X@RYrMjw%+a=a`C@(XcZ?I0+&P&ISIH;hE!MiB`LKmAbD^22 zkzTwTBh_I7-V$c0QI9I#a8nQ4t9VnIcIskT#}Rcn2iEUVQZQDJczA_=2n~-cO8q*l zl-kV|wM+9XBF0(!GL(Z{?B+8d61&^k3nq8IZUQ$i$-uy;@X@+t4}oA zT3w5sc}jd44c0~k8lByc#Ap^Nt~Kn)U1zWgWe*&26r6B7(eyy{;M;o8UFAY(J!IT< z?j_Fvb8l^NRg?*|_)5!S9i3pwJkb0pqAr>+O&yE2t~wgihV^n;GefbQd11$&N|_&J zOn`pF7Jc4Djqrw#l zE7RU2iQf{O9=3NGQ=sR96B_SAq73YDno_LREW3vZq1b9k1iBERZZfi#qcF9Vr%179 zGiA*`!kWawvL3>8YaAxMLSw?1m=ENBAu#KZB?RrbF&-xhBRi8= zAWj*faADku<~>H`zdV6YE%eu5IdNGH4UT#_wI!`_UQ5YBb_tIQ)mVisTodD&wq=R6 zHxz6YjbyZZ^#~cBPky0Ro&xSAVg}h`;J*djNd6jYy@vB9gmxaYUu%FP zvW=PhMWkvM2f=ihSHI|&ptgplW0R}JZ%N+43Axf&PFdkEFJyr#l(iXkL%R;UkZ6{# z(5>VMXhsJN^NOj(S0zH4mF1B z2mT~p{7pQ9-S{_5|5y}-koMP2|3m@9_Ir~GBa6S;Y89f(X~0H_fQ=OxjHlS$5(W)_ ziH2d%#30QQam|Lnbjc;$ouGa%;i3?aq~R|7WD<*_!5~x8+%)2_E;MLCB-&{VM-kG{ zrHWtjz%j!@3?fk)}yZ5<%gG zs`2=K^yLKkYKrm0=qyy@o9JqKE9EUU6q6~G)bFZwKdovK-TYDuao-oQNOHUe+Eoi* zmXfFCdrZE%X^_J|!elh&QQh;Hk7aheq!2rhb}Y*dg0;%ba=tqkE;%UIRN7`0HD!6+ z0l+ZUSK(P55H!FY$d7%`U_e3I)urZ$R!0amjCr~iS9R$2Tn=bF>KX-X1H^;~?k`Z- z$*ZtdcRvR%ohX_wUo3COvS0lBF$PJ0B|Hae8SDXguG(QYIvXX3k^fS6^-t2+N@i#< zJa%1MMVpn1dJT666+TCFY4}rYDHnlyUCIv&h|&TUr>dl~PxoVr(cnokV>}?6RSzAX z;s1V?qtda;{bA`oePe5E_8g?j*|PgI9I=o`;K)cBmeGgLru!zTc%8`tj zNYU;KlC-~5R{BhdBMP`EB2mHTBT7fcXloKn-9u(xkh&z4A<1!adZT@c9(Ry31UYcr zZGG(gJTUCByeAY$oZ_YXjVSG3k`tHstTHUiI*AC{2=Wf020bN+)l7WnaMS(73mxsE z)|LT#pRfSnGqg*yAb;)iLSU~Dj zC;XK1L~zkfwS?*QBrO?e$~|ZE+H@OMYULmX(K0k}jC=OW+HNf_``lFDtI@N}3>hzq z*V4&aeIB=siG+MML)uT4xRka8GQReEg0yUfsW=ut!^P2Ao(Wcb(rnTUv2Yb6Nh&TP z0lxF9bG|DIp=m?Y*Kdq*JID+(H**N(9^%T4NOv)loXZKhD$KrQwuMYd%!=>f_@Yk* zRNI&&^byZQATmuSpFH0F#51k)`!x3~%V9gw;S~`udZm7(;lG*ur$vUenmHZn-TLWY z-R~pfPLD|DvJb0iviLQ3lGTyMMfX*%Fgx~qV-}#0Qb7;<-AHW=yTu!##8=u&wDs$_ z(L1=5J875Ki$?PA!|Gyy`X_&6(GOEc{3C^cv24(8%`uqp>CQi=sJ})s=0(4%A~IB8 z^Vq>sWw_$q4g?YO+8gD3pJYvF2w;C@Dak2!7*Mu#4O}IRXp}7EFT@2I(5m{%?#S6t z9_jc>gfhqUtAns!Xlb&uQB(mM;G*pmCKcADFP1GIK@}Gly>^O@*sID);0BXXF|alGH@O+oA$d{|#wV(DY(z(X>2uL zdW#>Os%L5aBa5!6XZCfav>pxSwHyQQBg5ABhkLelnU28Mb(vX@ET5s|Pp?y$-8B_? zH%CBNWy>_%8!U7Ngvbr6t}6$Ra8y|dQ>AU%WH7<}4EVheyXx@4EbCB3z~VMWbS(xR z3D#iSiFby_b!Q@ZJ-?6d*Pp)O@}5P^mwfN)ox(q-f7QXObK}lz?flj-ZQFC})_(lf zH@0y+Z{4YV<1--bONFqjkDtEYo!_=RdmE{KPV)O)SI3iMV{boBKlaolljqpKPi<&& zv}Vl3e!clQeec!Sd-e5pSW~DyedYO!|L_lp)|yEuwHrlJZht}IH}4<9KlDe<0pIb1 zg1s;)S3k0gKi0W3;SYT&b3q?JgMVkD3clX-?`rt`|AQk(+xW@Q5nK{`|K8Kk)%N|b zrQIJvkF>NvsDFJMo*4gwKo|TvE#!Z95w;Zox38;z`j-3Ay{WOMY7#JUa87;m|D6Ei z9}oV)vzMHuQhWK!^RqL3TV^Vr>v^aPzEw`XUti3e(zAc&NKyEl68|qSUGQhG_j~Q_Cma4huy)fc|8|C}0f_C~x!`aA`JX>^ zza01G5C0p%-<>*Bf9%B`f@3?d^SR6a*em?o`(>_Ay={a3+q<#&`ne7M)*n4vedgzl zc>M41fro8{&(`!Cw4a^+PkpT|&z{7^&n(rOfAy3>zrM~-z0c?R`|1X4*&5-oqI0JR zF8@{1_rQ`fpl5{Q@NG=YYQmS1{?LZVW`^swmU;)9=uVzjUI1{W zx$iz)H|x0Hn}S&qzz?uv{aL%>Hu{gTT$$D<8dl9&(?0}AD zQQZ-{4q3|XdZL!xRp7E0eak9ys$^1~X0Pl`iv|(2fFk;p-#b_nQqNJG3~Dqz&$ag0 zj&Tc%gW^qAwv>vLCJ0&T1Z#M!xB4|MV1VwGQk6bSw$SDi7uV~%RJ}IbDNxfD#|og` z4oAh;PO=L6KJ4+(=^1Cm`!V%Abj;xnMUR`*&ICQm{qr~_V~mh@P=p2{rQcbLjz0?z zN<2%mIzMCL*N9!8tLs%K?f30 zF@~2vYyzJZhC$aj!2nIB>Mt)-&r1#$W|DFJcShfhEW+eCJRxJ6G=|T~fGa{X<4lO~ zI+kAWNJ+COkO`AadNfab@RK7G-XY2wsjZM2EqT^^0CLx(CW|i?hj4q&!(je=2W95p zc{!^E(lC^t`mYC#PHd3s;R`2;@3oV@?t`_zM2WuR?NH zp)F3Z#kwyEKPiO6noIBQdr4V62hJ90pjHk#QI3L2(mY^FW4M#8#=(+m2$m12lsc8+lE*puxnTY5?UOUN&{ghGENKc8(TWlZ zpre)%FLIF`M9q__$Lm4yOo`UdN;sE3-ft` z)Wva17|0NOeC9(ouk+k3+tzn~&ThZ8HReCsU%z$l&d=iQU*!EccRwN00q*REqSX#z zn?E9Cv-MwObWz+Ac`Qq4^;xKMU(?O7J^l)eBB5dHO*%73%cH34x7C?$B$+}U_20f6 z9EcC1H}v4gyX)QE<@xb&@%@v)!~bdP8>3pZVPqkMoO%=@#RtbY39<~a>>&O^8cAn< z>ly6;W(e#F@Z)+N8`3TEir|0eZlN^A2*TlpGdVz5*)q0wLd#Dsm(M3t`X2o!qDpVG z^sudM0lZ*+lAgtVi>U!&5dhEJy)shlN%O$BZ*oAOv;%PoDQ~{eF^h`k_c%e2;dKWz zPFvJINi*?>;5hiFOZd*i8a@EnBuNUdmHC^@)NInYd>29vb&T>WsB%>~{V7`Fot}b@ z@>QMs3bR~El7?h1wsj>Ld$0o}0(A*rk9Bcp3&km68z&4jqE5E;MIvb1Eqo|!lPQAt z2(X@lB>PEFE8ljG480u!29Jw?T-P>l8mc)Oh4K&k)#;`T_Ht$rSLD1Ln$}0%WCiIi zDA>a4M!3F*;d98PqJZIYt0`$n3&OM|d9O8z94Mvc+A{QRJe*x}dQPsu^czw?l{-Z~S0&-AjEh5^$8g@AOStS4W#R3p#!a*9=M zqeZE_*yX}!Cdaan1$^2uBZ3H08Z=v6{ud;f-uX@Vylv0gR$$D%@uYWVlWnWQdZ; z>Fpgsv7zF#e`fJAi<&*HtK79+`VUO{F@*{GQT3|HVDT&u5khF$vc(%*j9`)Z*F43$ zIerGEfk)Yv?s5w8kz&TyYyp~!oCju{;ap{BNNQBbiRA$%!i-#Fq5)*)OoV6x1@)+jpmkkGAnGOMS*luf)v1vC=bYXt+T`u zG%*|F6ze(VlP%MpQU)r8U4Wch2^WD@qxl6CpI~5ajXrx;r7D}FaaHioo?MN#}xN z&hXXyY}-(X0|H5gELKls0;!Yn)YelsvuIQtNeGF@N^?1dzs79|mj_`$8ZI$_K_l$D zPbPU{>LUXFj2Y_z+=WxE9MHqIyW^5%A^>EX$~H*K!ep&S6bTIbAIw{&K2uBaZlV|1 z*n&39fgInMm1NTc?U+?15MV}53cfX!ag05fIo=>FQ_bD1vYDSkx%SdcFCh7?s$!)~ z9#L#aYeONq`v5RMNyYp#doT0&kD0G@VSfWo`N4K}7@Py28JsZ;z<=WT=Uo^BlH3CC zym`d=mez0r$$4<18ct}TRDcByeP5uyU^LAKxwY6}Sz9+sZrI=DJTOAzU4&v^4yLm` z2pbU!zOkfiQk)$(khB&sW6}t2p%IRT+h0c$9z0{HEh9PWaY3D02t^qanRGh*4+8$m z7ABQ^u}xZ;#VLszEs4p4X0cgB8Wl+<@7-G^jsJp0DU(faOBt@Isc}1-a{q9A!0dKEf{EJu2yrI@W29DA63~1Lnn0P(1L@p z_hrlV)Q5O-F*R~2jF|AvCOiGx7nmV)b!NF*f=0y3HQV~Ui?O&36OdV-OgSz{TPGz( z3N3Skz@n-w!BW;NPsVg=>H|;(FGf4^r#2l1gh=<5LW>Jno+om)SZDnh`<}RXv9wQb z2YNpH|5{XbEl6z|iGt0U1gR~87s$+ilqe+c6VtC-GirH~e-LXg;`7oj;|QUETTnAWfL%VjR@gY%33#af(hgYprWyjbo9*;rmrz6CMQNBD zC<4T0N~l0J7Bf;0sx6m5gH;p+p476tgN$TDYaz@JFqfVC)z1qwSv34T^rGs3&(|ix zDfBkg%gx}G_gP;CwK6SfiE4ij17r};9vbdrCvJ?WB@Hpg(c>&PC3!OTgxcclUq(_H ztB>2)K1w@TzCG!*2iB3zV%uW)t6|h<6lixL62j})UWn3}ICbR2!BnTCw@8a0Z8Tcc z)uu00D3t6TVD)tyQS1=F>nU-`KD;p^*CoUT>4) zs(;?`t1wIU-4LM~<$J&)8GT~$$rCku9r%T@GZReZ&2j|`C2rv@JK(Jg_+`G8h-p)g zt1@cKtJic**nE{`tx6~tAlwh5BDo#EyFR}Nf39eK?QXu<`}WT{cmk?(@Zf^>X3ywy ze*Ai0z7D=#X?^i#{rPi#zM1oX=yTWQtb{H?Vl~+B@E0%mG+>rJ>Zy7Fjr3ef#r;`mL{%IlqI|bfQZVhu{ z;&%Pg;&QI#)vV1KTkZdCqUe=d)f^sxpZUEu?7O|ReGDRRb?V-L=B=g0aXx)>luQ){ zh*uljbfk76$)RtHKtB5XhXRlumeKmp!W#{oANl#W{Goay?xsmjMH=BqddKom`>4No zdjEj@_qaMt32F zk@Zf!<#WWn?`HJ2h4$8%&D>slsV$i#4+RqxPs#hG+aHRqi_FVOIj$?<2yxS`vyjTJ zltenKkwA_+V7$Rl?vdM0G-mw#r13wahC~7rfO)0Z>1YufXdJOu`&&XnP$j``W`PI- z=MQ1{`hbJ?s?HWspx^vKmSyU4>smN8;f(qFRpb!Eq3b49EegFG4X||u-;JX0V!h05 zjheea8Da(77;_@`^0{11u59NIj!wfSj4_j=;921Yi|R4Y;uCIEpKT{4I?rxMH&UB% zhYoB28tWR(vQ#e_4^jbYH^^=%LBW}Q`WE>O{u_Z9M?t|ZEM<=y7$y!>LHXd<)#PTo z__lXAxBfi5-|esU#W(D{91vgi@m+T>f8<{`1ozWa+uXSaN zHQYl5IlMWZgvgS=WH?qDF+}dZNH!ld?7-W?rU&MgIAKC~u#>GF zhr=iZ{U&v^GVTd0CqqoZ2i|s;87W3;Q&2Qj&DHhDETZ<)ar)GpeUOQ4PS}(K;+q%9hgOUW}c^dq?+LqdWB4S3U3$dn8rsi`nc{mS&{*23bfDRK>r@Od9A zlqa=>fhC;`@e5u3+>kblUI8X!2}szkG?|0 z`3e$3Kok6DTybZ_gum#@2SH);kJJ2{bbQWc)9#P*ZFC`VNyA?K;kaGaOg+e4(b9g( zep6__D{jyowiz0lI|WmQ!nbpPmV=wy?4n2mk_!@O4M{Q5U;Zi-o<(7e1+$Hix(iO6 z&gamPVVtb)+sAfpqA? zFCPbtP?JMVjHi?z(WuWRW;(MgkWhD1(hf@R>LSjYM2Mj%(D!j_WkbOvJ7cRhqcif=%^j$!zj)UP1oICZojUd+h=|JNNloM zy({Mvh8Zg&fpkSW^gqjn4pE~IUGd;O|Af5=upNZ*6HU7kJxavx=KNuJ@Bv3LHpkM+ zyFy7z98JmESZ69DRNRy5OQ)@Wo^W)q*ZRf49%K3L`a-3YTj9QMbnlia3`utqmg&Z6 z-w3OKgASF&-Yb}6#ijgr?8ihdvbZlZX*R8X)Y?9?7hCqmJ5qX(VRu6sN?{5ZX(dlo zp`@1}q>S<*Edm3(EqO_?i?SPp^<6&;Gg|>hvQ%0mP0I?uj%63VlGBt^Z88^plZU!4 z8{}&Lp~X13{TiNUE1Op$nbcJ}Ij`WCCglJMO)9ctuk62$qqDrjN}Xdh+BBvyiB^S$ z5*r}T^l7|p@c(o$WWjL&WaTHxO$Rm+48@NxMzB^07JnJSSIAx`lCuIJ(=8?@46>Fq ze6l=|+JG&X8xzsdg81O+cqY6?l6I7WG$FOm2A=~-+%`}W6q zBg_MX)Ok##0W;E;R5_K*XdF5U1noQL!{8E5$_V*NfCt?yluFuH&@gnWgh1$uEtIFc z$g&L&77nR&yl<#d5keh zYyuf}!~8?iC=sJvM$Af)D9``AEq_@R)1O#I_E3C75fr>3k^?`uFC?Vf6p99;Fip(v z0LBPa>JqH={`*K-c=OPnSco2NIuF$oy}!t;KHe`YEV1Jv0Nuw@rZzEw&N8RP!ylkd z=n*Miz;X?ooOMCNXXZs+nw06TekfT=K)1!iXs^l*B3<`v6hNYnGJ{How<6sce4cn7=%Ft|yR7{!0UA>TU20XPAra56=qKud=hEx`Y zKB+T3b33zWX*?ih$k#ckX*oD)V^T|z4FXwp>MtFhg`${2FvQdjwfacpwG7Y@IPz2` zZtx^;=@^obCmWqWnr3@s4lD<=EsAxM0%K61&f*LfO$Krq#GQ${67G?P^5C%g*~b6J|NHa(bab=I<=Z3%lDf73Poiqx^gtH$Plye0jn;zt(Zb_OVpXvga22 zZOF3$N$viUsa-Exz!8xCq9%YHapDDG`#&AaF9zSgv)CX92yJKv`s3Ii88Zr1K@UR? zteE|m`eVjkRrLP|b1L)|I3z(b}wGXEwagFp%g672rY^HSt!46Gt! zik_9oEfRWwa2;lwOgL}jO4|}pfJcG*kiVCPyj9`|)r#ssD<%19#m0w#Fr`9@B;6tF z0$TEo@MbvqMc$TjI%4~6SyQjPk!dhQ8xl)~_#wkOM*<~LV54*z0IdnN<`UmcM(%&p zb;^#j<7@f}LosLlCA}jj@`~5xCF4KlQqj>4ZPwV9bUw-Ez6eALp}yd!1y+3jN}!=# z;`90|^_%y5)gXCt!H!G6!%qrCXQz0L7?4Ns}ngOcP8uEx0- zU3QQ-FA~3D)aNxB9~*8l(a?=9Dv{K|+r&e968Izd-iA9Aal3V)uz!R$$Ac92hDg%S z7Lj-Q#`Q>J`44p@&B%!xrZ~M(00u?-l0;;rm;2>Mf-MJ`jEE*O@z?Gn_dq`<+S$Pi zPF{LyxJ5o7dU|4C(75Q8@h+d}j29FBJc`-bBKD7MnZo#P5qk-*2pR_>4nh?P4geTm z-gCdzFP*L{CUCNV-vvtpg}!v4=fZ*w>pegFq7hUR6aYj@44x^${hBgB6?elg@LiCm zUpzI;D;g4rP+*%>a3((t2(W~(xAylfwL+gAS>S6{UlUYNTqwdJQ-fqDJwJiUuC^CS z@)ze2Xp+Kh3ZJtD6+eN}+VPq4BI8f5{e)=SUDJ^W-jI$gu?s*>?A>Rfk<* zBX{L#t8p#XDTzhRSeb5Nt$Tt}cDiv4Oo<&-^&vsW%A^94DM>Z%j+xc*aT=BlGG=h- zHk1Cj{a3n3O5tD`vi|7|P6-IwiGG8u4!cWTCjeDuxyank{bu?>PFJmAb7AC@4C=$J z<#*@F#I5IA%E!vBWg~#yh9>zj2V(bx(#R{u_`vfU#OcIHukIo?7y+wMxW6w+t+}{u zzw*OIpnQZ?>boKXu-if1rwFhy|18Vi1!F;*)A=GAtaF&TGW=z;-tQ;Kvk4HnF*{3`El9fKkA$_1 zAU&Hn{0Ov-UtEQ=XOplb;R~0gna5L31}fS?Y%S|1>IsrBqZGIvBtTXPBE&XrORtsd zUlAoHoEuTpECZ1Xr64Ud!?3oxy72dU_kR1Qxqi<2;k{g;5R>pNsOu~GzofqBpSfua zl##??V3Tg^=H*n?^ts@2%wWf5%I_9FMJyYbM(G+W;qwWErh+Dt7{-?r9G9|(VQ0-R zGO-3g45g{eSGZGmZ}NNn-Afi*eaKYO+~de3@SvC3YJo0j%rrK;&@aFWD>no#0RcXIy8paj=lbpn$=V%D}0mmWC|^u)a`(uutrs3{r+ZFJxtW}4=7Ht=-zi3;mVAEsDZaqNKd zN_adWtU{mslIfhxbLCZyG>y)pXh-RJ-G>Myi)ArvbBM%w7w5~E?xYP>A=5IC~xI7#?5#(e;1G0I%Se95}*DpT(9on&@B)zh`Yh>gv0``!@cSQ&p}U zDIxjnCe4$9PbhP_O)t9RdZ0v%YA;cQTnXa8QZ2S93vB<8*mj95ZUZV7pFpNmsg*GW z3gQJXOPAcDC3LDME%yY(j6mT|T&a>J0TRrGy~!3i)(4CRC$ZrD=5pxdiK^8yg|zZ{ zum;d0dxL>KyhtyC#}AvS2C1mj$`XYM;3FZEEUr=K-#STR5dyUG1hlG|Ts3leFq8X` zZ0n&dxG5#KCO97;rjW;~RLkO4$>WLMh!)(9O6<>Lw>LQa27vmP*pC`dSTAZIv0PXd zmJtmnriUZNb=s1?!nt<8J>|YDSFAfL=Kv{LGIgILtv8Gs4e&rTLjfO*4E{uOiqWJ5 zqNVQ8@yo5=p!^Xxndo73kG`!e$tmYP^}!_^s(>!jMl`U~$U@;RuW3;y>oC1QLnW7O z^FjlT0~<}pcTC}QhT#M=&?|Q5m!PqJ(c9yOlHLs6?IE6DEvv8L80s%BhnSm4Nw)~} z|C5uO*1Y8;muAkv1hr}*)`IM2M04NG!iw6iHuIW5Tz+Q+!^}IIACeO(i<)uH>>C56 zGfUqH5iFFCaaXs04`<$BIhfzdBAV=X z1Nw5Yxa}i={C3Ndu?Ve|YDh^}hfaR#aZpRkly^|1d@&&RF(COdV5d7flu{OpvR-W- z#*JIM!)q!~4!29q02jjmS7X@CHu!sbEl3;e55BVK#`nC7UN80AWcn-?857Wv+%fSW^+vTew>6$^WXStU0v>! z;BiC!d<_v!4PviQ9zKFmL@EstjBp{b%O7ig>_&dTbLnIh*WSo{H(m#c`LF?&_mq(q z``5;u>y>O+yjnr(87uOFH(82aW5^bgB;|Pj@hCKi7ft%gCOQA>Kk&Y&f)r)hmh3gi zbp@}Swg(&^me`2T5Oh+K`OS=MwT-8|upuxjK}rVS8OLhyj<}s_|7bPi77^(cWt3tvCZ0$e zm&@#Ck49jn^e71mM>mUqT{y=?pavmq^*xa@YWGOMg(a%jPyprrQ$D-gtTZM*aTr9yBy*q< z@m)$oj{o+E(6r9e@KNuo3&yFK zdPA9M_4;VtEbE|rrd?n5(e?hR|F<~SNL^-Zk`}0c0pDWt(UM2f7>Sets(%wfe`r0Ql z9!K)I&|{WyV>c{FH_G0sa$XA?c_mo8oKWnUx)m-=*&=S3#1hz%!^cL@A|zJnAq{D} z@SA(ctVPpS;e{%|T-lD057D zg5U>rKiINKQLA;PgB=9cY5b_{f)Osuuyn~$vNAgX>m>Gs&dPfcs5#dR-c+DhLW%g1 zvi?46Sq<^!?gcQsQqpfTj|w{-v6XlnI227 zkA&1OVC{Hnsr(U%D-(x;b-lAAzb0EalD7O?kfytTLdbtmDYn=*(J}b3Wa}z?IwGQn zOmZsvQ4Cfdt87bxnz=V0TYYdm!~y(3BI=j7 zA}5X3Qb%QsTW5RTrDE0TKxRTySpYXP%&XELsC6{hUtkE`F)4c#TOsgz9Z1D!`CDLLa;(n%TrK)6DXCa809}2=;r*{pgkX+OXa&xdoD~nAH;W!_FRZ&=7;YF z{hRSO?bs?PniP{b+Emvq^gUMYku=|KW6+?xjhqRkXK#NAXdk}t)yWVUV@(W03_6t3v@dx9dc^&Br2fXe=M z=e^OjJl_LoZ$0fdKzd>?S9?Yvyn*DUbzloK1-PJxh$LqoTSWr%@$vysv6)Gl?&>;v<538Gq{ z0#3P+ai?J^-lLee8(TY7SjXY#dVZ-O2eec&=E>-#ZBX4_=}D_1MryN7 zM%qo@iCLFW~-A3gzu8MWqeQ*4faIvkZnzAc<_t5_Ro6U zmryc1_7d)D?~`bMYep=R5BA3uz|gRn(TbzuCtT#vt^i52ZDeq9qiB`|K!*A(WNtw6 zpPV{rd<-V0Sh+w7BzG*9F8cXR^Ow8Sm@x;r)=?Amg)=@mwKRNrOo|LM!jchgf*AHuApX~ggczJ>a!{FTPhBc zpO2IrmdBz@%uYd{Y-F!Rk$};nz3Em?XpT!Gf;}g20DY>U`wqoG z)eDEY(D!UW0kw;Xh|`X|TGJ<{Twj=)$yU{oeIquxYhH?N zKU-C88|FGU`^v1O-NT5e*<@-kN|7WXBEZ$&L@J%Xi#{X)g|f*)!Y;0HCzPxK$InJ@ zXOHU<8GdX-GGQN(9FjM-kxkjigTn9k%ZM&F66%-hG@1H}D&)g#V&6(b*sKAhNtSX{ zy{G+9vn+gSIwiSS+mO2(B;3W()XqY2Dfs#I5P9#$adR~;UTjI9<0;IN=I+?hW zu^J}TW`L2Dpc9rnN7|;bq9o=19E1iUzx($aF}4Z65^Ah-H1bF?blp0HTy;-yVigW` zhZ;hIJltbB4y&|W2$OSqA=in)F#u>Y(R3CgW)U=381i8oaT2)O zLY4oy1;3#TTg)|#sa$i5q^#&Q37?0tTATvx!QnQ(CuSQPran>*Reib8rZNg2guLLh zx5$z`$YhFe3*I0x8|5|9Ixl7TSCS-CfCKnVSozJZf*`1^oQ3Cn`9;tw;1>-*3waoR zaW~&~9cF<0$b&0Hy|VZU#fyaZiGIt`3{fB$PGT+21I_{olZbiHr)o;2j=*ZjPUhuNURc4W*{9 z9wu@1p3TqGQT2mOAe3*%W@~gdL(9s(zgRg|DzNqX*8d#WM$pE z1ms`hLGE}x8KyUpWVz3YH_0MllZgPHDa4-MAef0l@P)1Reon8>}kAPAdyL zRY4&XO}9&BQ@(z*pb9tx&hx*;`f_#vrSbvzSPMxjjmsuP78mS;%p04RB|M)p3nn*m zZcm0vcNLGFzD{0Wc75-Ql3jre!0JwRzf8+qP}nwr$(CZQDMz{j1$m+wG}u-|v5u z`{m{)H<@H-CNqwl9`53nXXf0LEnRAH_p zRLJ&lTla(Di6HGfMy-+QFNVVLmI&=K!XX`T@3BMR(xUhu^`e&1D4UbaGNeQ>+85hV z1$IPPyX00Rl`jap=Ien1hM)S+)1Cw34Wuw^#gf|=d;tjv$YYsm%GD4Z~ zxSg|z)zOj?*sxr<*r(}-NPPoeOQQrA*>A%i*86%kAAIJ4@8uWh?>3asr4EZeC zi7eUz@kq7Mb8JV_wr#Rg?vo_ktQc6z(E5D)*LLID{@J3=HT30d-^%^C((`q0&GYl093DER9mV^7wz@e7WV> z*G&4qp4jKI-kTT~clUL^wl80Mnfrd)&yF%-Fa%S$jJ;<6>AL%TJ1=Y0S$Ow;(=_=$ zh^sA&z5o2v*wuOWAL)Xo=R5e8h8Fbqo4@mc;RpQ@K+m%N1B{V1{Ob?^-wKS|BZJ-|_R${gpA)8{!W!Brodbm+MDO_r`0Sm_b7L*Dx;kH4R^Qe@udJ^hOER z63-*#4%p3XHk@Y2%kvU$0{^A#)NAT?+p29n7d(Z6aXkTDL_i0E8PNksEPtSgWy1N+ z5RiDpc%Z{jV?1WJ=p}YANCwBZ5knB4nSU_B$Qf%qu^~7vyP3qn2~S)(y_#BGUEKzq z(H6u4E}&^)($L=h`_$wcb0BNkiyu??nzKU^?FQ&lU)Th;GGGAT_yuO&8LdeHD`-^p zR5$@i$A=-R{s*>l$p1))R>>dzyUY;>`phX1sQB7?lU(kmI({?N^O1~|(nEZnuoPOe8@ zP!PxIurqHz;TGn?+$<)=IrMOc3?U3=IDg3(7DxsoSX~FpGr2H2OUwN~#{CC!AQ6sj zIm$@4BE<~@5A)-2$}@zxiw2=z!JqN$&o7T(9Cr_J~akyrhRb2*(O=vqpY9 zR__jEp_-qPm%eee)KT?qtOPce5rhtH ztOD0i;(yunk_AILe2PJa?;dYkTu2>a;(m0hh=-b8j+B|$wr{&scqP2qU4{&~9Vd9K zk;jE9#_2(0+U+n>N5aU4NsNPqYG~}B;Cr$PvAeI@heN=Ve-!N>PqnLtlN?8ippy;T zaRs4t-?f#%ilhhnh0bfo6FV;-dw--?(9x9}JtlxpHAt`MhFzPuvk5HR$C*-`VLwos zXEu}fTbrd3bN3#`A)PySt_!YBf$cr$7AKthBQqoRr(2uh1)Hx4T=1;|P7?!`I{j+|U@Y4hTiEt`{>s%;~~h zn*Q3Ju;(|B3_eCd?K+kP@<%T4JPbt+KiA)Dyg?u9ToJQYnuxGed`=sqYx9EIL8@PV z5u>}}+_|Yifd(;x2`mbHBs{kBhZ?g_vm^V0t3;rr@ZDw9S)jnZwSj6$hNx4wU$NdE z8=8FDNJ-c)f_e~W(X6fH>p*~R%mdXo5sd3`FOd6BuJuPEv+3BzN{IxRv#!yOd6c3Y z;)3?);jBwPc>OAm85m8v#&oRbs6Jf}{roOs4|EcDBwmh)1`~(b9>;IV)suP4g=Wn2 zA9YZ5bTkBmX0#YYFyWiS{M)|?>xPu#lw5WYE^r0?2~!TgZ&z71WP-TYJf$@}kOHN+ zr>+63wjbe?#E9QW9EQUS#!7U(2DRTn+=qbZR#qzleFw*IyoWeIPC|^zcd1j$6I5(s zL%|y&AE(*x8Ba>ei??rVb&Yt2(NB)#LG$e=ekl00ojrUn-!+;1VHR0@D4wAz;pf1^ zi?EJfq>uU-he4gWK5+AXAf1+Zq<)Gq7|dcB&iFl;|1tevyZlb~<@_tZ6K9V69_1C{ zpC4=N&(&x4UuC2GSeEm}ir7E!f^);GV}x%J=Tmrh8vM;EU78njc+twYR=RiwIbj^n zE&F!iDAYi`YRJ4#R4FYUV6zUVYhVl^A%0pB<4ytu!Zh} z5^wGhHXk4^H{;OtJ$HU2$VN@thCKhJRp9Ftvtv5QeTH{+|9kkJ*<#c~T`m6Q@HaNO zof^ql_VSdpB0j`;vBQh(cgYf-;Y!B25KS_?1MUEPZgFdguK9LoP9f^X|KhQ zW^gIad#qMvx4al#!LuULo$_`0(`>e^{W(5i!w4+_79;3#R~L<{bVxclRqX~bAI6&$we84@ceL_L8UZZi(Bx_^o{`!p zSYZH25wi3&NSQEmXNaSr$3_4PkyQNk8AIxImJUXh8p8~6eplAU0R8r9XUCmA_)^3* zc2=i?;ETE1L;us*TN|`pBOWJ**&E8%GVq+Avm-RC)l$SJ)D*}L5?um-Lr~C+NMRJE z%D?Zcm~Pi5;RI`7;yculA3uY)YkKSScBJ?PR=5KQixR=^12M(7K8Nvjpou+F^Z;LP zp#+R;u`jUKIF-efutO(a-~smPHv)s`N%-y=^7+96pXi3F!ru z8w%hY(YSRue~o4Q0zAYRYj}ZqNl8)KV=b=NyG7713N}0)SbO}GsJVAwDwv|BMT=;F z{Fdv1O=fn-lG|^%F1BM;lW|FW^Gtv+yo)txX!#E=E)wMNRuQ!0Ql3Wphgq#D_3MCZ zMaZMlaSP4F4cEic6{K)=$*~~sj4W*H5pHUV6%%)OFlQ6G&2uC4nrtKSV4m!Au}U<`T@au=5C}Xfqjfk3E;* z2*p84EqtY+jsxl!E~;V@IBNMRJVvyPEH%8esH%x+(fhu*PcV9$gM5>bT$#eHFN4!% z){vE3S=o4;7%%}? zmfVN_#_acs)e&g}4maFAhosx@lO(YKVM~tV_s02XUhDmWWu`&HpyLmqIZ z4zTBYeQPk5hmHP6hV`!8=ril9Cqh%M2ck(PU9FSmznzOQymL=83}wK`K}WRat=pK# z=o>TiDfNlX7fyxVq1vBerkwgVmvlnf(i3NWE?U;LPxbg}ujfE0r~UnEu^sXgXGH9=QjMw&FmmrfF&) zjW(-?ffmbKn`FqB?F*=ptzPp;k~XT|zh7DU1dQ%Wp1-21;S*`UT9qSrunW@`v=s9f zbc!T9q)e2olemhef>)+Zqf2V({}VhWdwuVD(!F@E*Oz9#9SWD5I%~^m-PN8Ae@bg! zaAMoPcu0HDoqGLpXVMF9I^P$|&d(P8)q%agV%uPW>_d1^AEczK&oOYZJYF~|NOVk> z8P0@ixrH&Gpsy`tthSiKZiFtS9ZK}KYCVA4^dSPND0;CfKllBq9@c4@4=I5*T;Sse z->hxdT&f#LKaFm&Og`}VhtO~~f8${xA)3og5Eb+iyC5S-mt-Ut+u5|#%$S(mIDi;c8 zu&dRkB~_A+_u!xaw?}F$D{R?5_J*nWki7{dzZ76Lh&J@eBn(?~XZL4;n>g`T#U%kTRlcN{D(E%ejzP|6T1frPs;*@1Y zBAumKc4#Uam(wf*8{&?WQ}Q$0oi|5)&M9Vedc(~$reyuik$oSFk|P$&B%IXnss%Df$-bsEg@T)uh2^juz)ZApkcr)OY+@1}Pz3-yC$w zOAyF<$I}e3?xjQy;OB;815ONE1`Ff$8zwrI9o3EZ6bay(AVU@E~?`;E)!$ zeK3Boa!H=EVu%9Oo1jmfmqR3& zR9HPdapn~iUX|=xoW2Vqvo7fG&tJ_gpr}lKELD^OC#VbTnHQBd@?p`gssvDv1L_kE zCV1VZLy_H+z%84Ung61l_Tr-ZWjp9q;n|zpU>i2KzylC83iMl$hGrb3w69wNQUBQQ zx|Qcdg&L?0xG8s&N1wxU^1jM}K-xbe7lhj{NeX~D`-Z4Q!q5dt;Hw<7JS2;3o-I{) zc6KlQa%%-Z$dhQ7EI7gr*4}c&)>7~$l8mRleHmr0pHQH8j*98bY*hqVA+rS2jIlf| z7vbpj{~hbn_E)@V7RH%ugh}pW#3{;nXb@Xih|!9(P2Wj-wo`?m$++*7xIRhR$`3x2 z6JlUg**sv}<%!Lq02+g6`h*8PKNnCE;~_uM>s&Pj$6aWdC%jB()Qq*Tuq0uFIcN1> zx=eD8bxB|G}y!a18HKAh&m~pt7 zIrdi#pOyKX(Mk^vJnu^q!XLhZSW*O-or)vgQ_)RMBZ0pk=r0coY;h6p^adZ7l61xl zC8U8vhP7si(b7T-4B)gxNG8ru%F$Yi@nJy>m~xe#iWdyCP?>z?cpo?h;81a^k-Pw` z3NktwPc$e^oKuK-6;lg|5)t-w_(Beyyz4|Ad$VmldpGZEGZ^qa5-`Z9XpEVR&j~W% zwld&($BtxN-eggKrST5zvTn^xg zjyZ@>M`6VSpCVN3y8)H#m~5x8H7~3KC@>_1GslU8%#&o>omVIv|ChmlR)|?6f|-RO~pNW6Wxp_mzeeita$Z72|rD`-$jK%n}>* zYI3)tJ+2n>+Q)QGkej#2pGtEH2|B#++_OH0v0yVE#uucf7EU7)Jm3^8Ra>wu>HNFT zunoDI&CB^^Uv?$lO*AJ$s$WU7ax?-y z*hMV`({qG-;!~;ES?%kKRPZMc$XEDrGhfDw13~HyTZpVurx?c(;C=*AfyCP{ziJ9yDyD|4I{@_&6FnHzVbarL&ykL%x1UjycTNsc}(c z$zM4}6>I11x)$W$Vryw}SnrP9Lh_5Fy zTUr63xlp$z%kGOv9&+sg_p+lYXFiE>7Z>_jmOd0v$pKBr^Bf%&r5G~5vIhdVNLjC7KxV?e+efagwMBwd+6ta!t-Bj2( zhumPFN18mRA2};%1s`w&o4iY}4fLP}ftSld!VHXbM1I9Mj`t_d{E}X~Q*h)U_3B@( zBeYej#SXpB5!a!^N}YEHZW&Wl3sXok!nRtm=4hB1L)t3$n(RV3ht^RK-88CBk!p|G zdadFbDqalBMlGTA2F4-2%2XSe0?t<*>*eu-4g8;+r`m#(YuPHhR(9=;vz21r_;1d1 z3Ed2Qn?e5FWPhgsf@L%S(pr#I z(Jm0c<8)VeO_!pWWv9z`hD$Neo7kePmY;9m*TGj~4b9@xpW*Iw#wng$x~Px)McZ!L zj?iS;6$=oQYuL&4)7mZrL*99z=p;tN{t53j*0!aTl*jAfM#`a9RDcxS@B`(x@2}}l zMP*e6>brk@PELA$ylYQFWVN(|HCxsD-5gFC%nm*7moYm2IGjV7;x2f9 zo;A3swa932eQzNOn55*ili>cJ7;sly%t0kJ-X@Zxu*a2-qC8o^Vi0!t?c<@(@S20niF_w9wc zy@Cqh9N00eoc3zCJp0(IN#-}D^KBdlU1O0TuypqIO=jC91Z_8&V$+O@wS%(6*6NLX zew=X)Y-jJ+aJG*N5V$w@WO1`7#wNwiOUk94sUNZxjm-B9lQ;nVHI>o#=9 zus;vtJ(##HybPk@*#(tUE!c3u53XTnC4kkLgsVitHE+DntYldVwygk7B|xBzZk)7A z{c1$LYH>_=oMq%31)Q5DH@ix+nO~5_${B86Ui^9@QR-0%Zg(X{qYv+CHN{@5)oyIi zW;Zp0=bga1qT8*rPi4JyMvijxy}-kGuFY<`)P9+3vH!g}!7Vx(_IuKOuH{?DkL|Up z#Z*7W(^qw*Y0g?#Kb5)e!P3Owis@w109Y@z&GmuOc*9Innw`FM_`FB!%jRBHvsgK3 zT2wPvo!!JmsmN!H%!n-KrUrsN3l}!WeoWzbE$1FEp?*}J49moodYlZKIoa2hdUjZy z1eoxo)tgv9%;}Ai(Y<%MSA9J@1d*|M{TZn-t*xVVTiZcez~?N?L9u@$Y#$HY4|o#|c{jGn2x1d>uwQ@jh={1F+_tf)5ds^=Zz_gamzunaO_4;llwsUMry)=%}S%uIV(WAlvUGh-x z)cGmExl47Hvs8Q!hY6}ttL~(sH8sp;U}!(+_j&?jM5nz+`J5K=2C3sSdQ9`2!>F;~ zY{b2n%JhYzWRE!PsQ2(K9^~*J9MFyG>I0${$;2d!c=VX(j6&UWy}z}!k5@e_?O^l> z4}NiJfVsZ5>w^@>i`m&fG0I}tDK|Jbin|hPgPy9#$FbL>f8W^M)on7kRbrlVF9N4O z+bGz>Ul31%s=aQ~dT_K1d`{NnbR|SPe$E7&`!54K4_9~aaM@zo+dku50sH2iB7_ax zQRObj%;q)(iq*`XjGZ0L#0m0>Ao?DjrO@e9i~e-?z?}~>^+8|q&}W9d&A+7|Ee?i0p3r(^rDZAIpMYn(Lq+oR~0XHB@i)%mky0u zfYbcL%iR`JEGRUH3Q8i9uM}nJ@_&-v_~+=Wb9|nwPrCzTgNTKjoP4E%u1# zHlHQ~t>7B|fKPkQfnf<5h?M5!$@2NKyIjp*e428|O_4?xIZC|}DBRW5BtYtM z+(w3lN)YS(B>?4wD$O1q2N3qS8I$M865WTbJQA#?;OpPyc?ZjvghKR|Z()WGfa`pm zhK9st@DTJ))%8DxLDf`VDciP*x?5jl`~6X4kR!HNppb?#^5(+zj++QUC0_ zk0M(q+EZ@F>~2lFINwFK(f;J?O9oYP>6JP!^L`{fx~kVZjjuc7y`5+L)ee#HQ%9U- zI1q5+E0#ALm_VEcQL{^~(KZL7;~d0PE-03QS>`JRW+1w*`0M1?RZ+srS;siOOA0#q zS17-mFgY2MoP86@U`h&vhE=`aH*c}b)y4AiYgY@5wuziJqtrEm+z&Gayt;NnwO~jzDRiLUl4ogJGCZl@x4EH9;R}QRXc2++e|o}R6_)L!BRQ?wBti}xO{gw ztmu9N55m>*0>EU*M9`z(6y|qZOqhJ~@6-{4dmOtM%IFEeERo`=iiLln(gG#@Z+Y&k z*ib33e(HG9_TEMXOCXP<#_>8%;GE-H;HXG~6@gq1iGc zQct7H&L?^Xnd@!?)Y^|m3Ds#+QbNCR?FHIAE+SZeqn12b!u_5qK_BX5NW%O{*# z?KQ~M_5A=2H$-@%Mh=<>fzNXNbM= z=wIgc9wEp$qIeNdJ(?p1XW* zP+hFOj>vU)bM`tZ{xWqYj?_wOIygS;=Fb2Y03neGLL%j^ZQax$3LKb@9Wc0M^T=@g zwklrXu>TnAYuYpxDxP`Q^BJ>a&Q`3W_{V#v6n4Dv{3b|iwBk-rC+ua*(+dPo_SfLr zY!?p^t65F9$fYg3Q+t~*w{c3Qqdfaof_*>GZg8~=+S_Q*r_r@^<+ql)nQo#h=?a>M zJuUFpbC+Iiwh1@Wl$$}?RjX#3o?9EpHlxrYoCGt@i~)- zJ$ZX)rP?G=TY7kzg_WC|{b$J0YGbw+LKdJznUQ7~Sb`ZK1=m4g=y?CkpO62su9cHK zS{hGUk{MT0qa~Er%nji&{hbu~a}T)+P{(Hin?OWh0+|JO&!T(z3!Sa+!l#HOCaAQ^)JY;CL|vS=fwr^fqY+|Mpo1NLTXCJt z7EP_7i^*Erwzj1WA?v9e3!Glwt4a3BbQTp}W#MIJ*8dD?l*Xu>rLa{*1!X~*N7i6w zwApK^PUeb=fD<0`N%$Er}8TbMrD5H7baCfAp}-cK_&tg<&SV#R%Kx(UKXVh4I0hw zIiHtF1l%qO928IK<_|#D-KqEB-6k4b$bLIBRPH`Ec}DyY867tHUm!8+PET=fQ?ADh zd!K&yG-r*qn6%ENj>miS6l{CQkBdlIb{HQ(khvY${yWLzf#@=Q?%i6owtUT7>q&gL z>qy`?R@uO6>tx*51#)TL4mNquPe#T}N5Fc?eXx_C7Bvd#9X`sU0t6Ga8A#j2?-`eT zc&%y*iAgmmbGR`_Az8&Ib$A@6PcLowNZMok88^{fW~D&%k<*3z8H3k5M%(jhW=v$J z`~ce;kK-_U2I9p4?27`Fz5-FA5H~%mf zh;&;L=G%^*nrSLYK6st3zYt}mNW*$HX{17uPa%{%lhvS}lWIz7ezk)9eRat1)~zT; zDiZxFqDVDDg$X7m-E8*j78BIz@>H<_9eP|D%ZGoKt%?lYN1$AS{gdUY;scjiVgo)} zu0K<7lNmDPso{fPTYPY)%a=z7e5{b59xRsw8S=422Y=>}{EUj`_*6wvzqE8EM0l1w zzFxBApNl#BY}CfR;3#R9No3FEK(sz0wVn&aVOA-a&X0mvbzSm_yZtHbNY0(T1K2a( z9wLre)oLi3h{)1GCsDdA2a-R$B^-^J`sJyCxb96{ov%%krrw0_;I}RE*gT;k9@|*w z)Gf$*mgL?Ga35J;rSMXk_T6qYSx48=cDC(pI9){dzOX35HWW)rgT~zBVjgodOuuX} z=+l$y2jXS^SI!u#+DQ2gjrw( zSw@)BrIaGd^Ns|wZDN(1x+vp`Qntn{HMS)#QuUIT(y%Cb{cmS;EpY2IAuKHd6#GgN zy=*N?^suogb@`ITq^8wJB`gpAx4&n?O7fO&xG1HG*AeA_Cix$D)+QGt8mw({+<4Zn z3z!<}`nry;MY0Vcd-?W3*(OqWrMY>6C%FGH(0@}K#k&l$3@xEb36sJEj`uab7*b@e zYGB2ySEkOZ%-Txo?rlt6Q%|U?t9kS_b$<_27gztU1z3MGLQLiqXjvahAD!k@7++*q zo##|oU*KGo(UpWnWPw>n0I0J%EYkRSNtKvZwS|jW=QWj+SynZLgIQ!uI;VW4}%f=gxnO zbxeF0XsZW$kuBn+i+Cv#?_DArdPKH-NTd!Fz{1d|QUMAe!AwY(ymCvhaNw-0LkuU0 zjIzY`g(pb)ky+H9-fN)SBVL2Yo8GSD@|5e zJg>->P&HZf@Lvom0)=2uqzn|GfjBYP7SJg{+vIQ(COPcFAh8vznt- zsr@S$TE-@^fvlsgKr4$=3-OM>QGTeA;^*bOzZR`9TMvGT$tH*YxLc?Q7%2pUBUPXP z7J`PG6iBe(uP5GKoQE6Akt}}RSgYt|W3zhOB8$z+X^v5(4y+STIg|QUeXwiK%U{vT7L6{zih_4W#xpPbPmA49 zUM7RSt!}AH=wh;lx~Xn>1LVdxAISfr^Zzfr8@{jJ5Xq01`1%_vJrg3%W7xRb|I14A z{|>;c|6c*vii1e2SnDuFJ^OfciX61)I6!h*hHKrGlg)LMW{7Q* zg1A(3{pnqK|L#iNfmalu6%La-`PaBJ1C#BkrKhF{uNCvx4!qRNMs?hrj#icrI*T%d z*-m}DySuVQEPJay!AQmTk5Ks_ESi&Ls_p zeLn!NUUl0GO9wRA^pn@|ZiM z{W$mgAaIDE<0$jk_noS7^ACuc$Nq8+@cjB`2QNwp2N^9k!tMx(R_J&ZHfg!!&#ppd z=6Q|G>+JFR-HY~^`|Pve>bLJ@c&bCW+EKPI{=1oEIqBFC)eW%fQC(%MN~*#!3ia4! znG`W~?o!2U`-h&t-th|QsSS>Q{fYL@b!-gP?)`h5RA|2Xm^mKhXJ;{LAEq*Hd(=&H z3)Yq>n=aN{-x17v6wREIN%z5CyR^C2aY!L|@7haQ;R7en{l`$m;#l(!ykoEUULXNivMQl&KT2ohs(&?Pk zI?a4MO>c93cB|daeRF8h|vt1{8~)}Vw4evND|K>1@etK*=w zeFxhEFNn5BGn-TH-TZxS;sG}x5TzyXKC4L<={9ISA5mz|e+*!Zz2@=UGqlmafwe@9 zDgwO;DwKT7)@n1T&P-=v5z5XiZYh|NH_`<~20kZ0E9}0-_YA?7lh4ER`r6_C96ji_ zlw(O-JP|EUEuH<#whM86Kq-72KdHvZ80&QhOg`oL1RX3c^CaB18eJ*cxRcmt%p`ih zsGf3rzS(RC4gefxL^Rh8ECx`bECKTE#`s&P5%k-XRJ4azJGGTSo6MVKGE7j?1&*5svgqn!W0eZAjDs6p0 z%S@mIE6#1|Y0>qR%~l(3<}Jk{P3qv|l2tZs6%4_YP9QtNcUPwhAJ0ak=%`(huRMkc zfhKd&@yL@@7N%gAvF%?8dlUpjSHOKFO;L{*G6{{`PfE5P|!MHB1J?vxTzfnSpRK6D#Mp~eaZrm+-SxAoM z$Iuf3lMqhgyQo(lvX!IZa5;B^;sJNuB`f*;_cj1>QM;k*sqp{WDddBwEwI`qox6|8aDa=ukt8j}wL9s=7Md!95o~(db+(j`=>jUY@kvv=^ zy+$K_jph)?kh-*q0lZXof4UGG`r@(NvL;;@DjO)z7L9iL3s(b90AUsIKO`krIwJoW zuV1RODAg-A%1Lg-pS8ORLriDt5z=&wz6K3}>QS&tEv5Xvq&US?`{Sf#h~h=?sxWZn zw$y!<$XTk93UrK7NHOO)L_9>TaHSF2Qg8#h3rNC-==09&gOKT|Ql&(8bVq|&+MzY2 z5!q8+4V?8tD@w!6uS73xuyBoIIGo4yMo$u@Hn?Dnf*FYYTAt*%$|tc`k4Q^#$XL_wLwFi6_h2PkmRb z*|vX4=8g*&V?6LAlPZ4?&d&_Tq!8Ls83(#dq1bvl9YwZ~c&3p~ixvMs64~xah|G*7 zh0c`O5~Ky{utZreL1pNqhyB`ZV(J(&!BZ6I+LM+Zw8oRK@2> zr#fjE*|B$D^U$+2w71v9n5OJ(iLLqu1cbMZ@>*15QlE$o4)pcBNd|EUF#)XH=}yuWPrhVTcqy#GW( z%xzps!-&ZZXDm_)+@y=vbV*}&QIUM&Vc-^>(|@rlr)Tg@Y+TDv%kKSM{6(^Q1w`St zX1FYAuc`i`mHFw}x&zG4Y$FuW9|&`gQ|8U{U4%QmHv;u+q~rZn-X=gyP*#bn&0Yqq z9yjOK5BZJ%5iNG*8B41tySLS6`i>rf;R>{MX265b6(|~&)lukuWHC1&j-tf4%h21h zZcEriyB4xd)OuFI5XWq4+o~uVV_7Jlx_b|GAvNjQY=p{R8@h@Z>gmhMKu8Y zt8H5*HK1MajrMOC{Y3uL^NPX%qhKo8EAhE^`Hr$)E9}Z%)J641RFT270U?Q!<(l;G zo4@_gOE3l-mwo^NUJnJWSj@IQZ}5wA4FT9u_@{*W3vIg!1`B=_>v_M5vzt^&wQWQ$ z)t6w;<o@kxEozVP+elWxa4dZ=YWV3>xrKXH98^ zqP1L<;UCgbT2W%#l*29a&|7nb59uM0Tnm6;s+ zipkQO&I{4?xQ(hKY^EwUX4w&UU;j!~rWq(1aXPC`>uGkG;9gHc5xp%#Xufm_?#paN zq}TO#g}54tR?T8jwY0=3$K&+`R<>R$a3m=P1eqDoLH4T(ssmx&?e8NIYZzWdJ|(iF zyUH>g){=Ug(d+p{!dPJBZJvj;Ybj`e-l3a2FlRPlhmg+XhAhl3kg4Nh|*Oo zj+dE-;;Jp!grRaDDoSlX3QDFJ(GUfSI49Hq2lA>y*0rleoIn!lh115c!Vz*%MU?l> zMItXz2Trb{F}5w7rvXh^7AP!dzMPf!)%XHnxN9BQS%0XvlK~CquV=y0*?8LTc#HKbU%qL3Tecp3UU`0gZvJhM zOgFB<4-`iV)c6bOktJl;x;}oQg7LgXY*|QYPmr-B+F4T#FQXyU`7x7>=6%$^Z`+V*Isu_e+ z-)nsKhMoa~>*9zID;g;`4m(91jsyOh_F&Ka!6k=s;S=ZbQ2&1u5N;5`CRy=AdZQD_ zuQ39}nH;%w#i~l2@6l-}m^2xyMm;BgcH&VPw;p`Xdak2OM-Dz^gRdT7z? zvqp4|4Ouj6Ox@Dr^Z%J63q3GU3{il;(n<=pS0g`Bo1PfS%whLhp6Up=SaS46xr4c6 zrw;Y3f3hi{z19GkxOF|z1^z^up80}n2t?KKgsJt0_~F6Xv8Tk*k;$Bx2mks`zJ>1N zEP0|s%Zwn>pC3WmV~|0wLoO+^QisJ*M%IP;fI}g^96;6LP$5a!at|?6v&*CL`~%Of zwDLdLD|~$`t3mO({#@)DA7u@5Pn3dd?d=k*X?12?ro=)bedkflso(GRBS5C3K{!Ut zb&mbU;*e9Oftt%p4)>5jlmkMhbtoUUC1w@QqFiAdmXD+m0gp5!ihvMice)N7d<`)) z0=h@^Fc(Eg5upxkK$r+`>0N-uaHGKiwxouB%CKlStCAHmqEMTqJ^FREmqFUDGjTPn zEU8!>`{`tn5V+jWE>~2@X6gBp#SQzHnB$JXI|x9~KsKWrIQ@gVX@Wr94tR5_O2pKk z;Tp(Lu+;$Dfych60_}6{uCr6?NT^zsa}JaN`h!#jmcl{COAHfUyYB`U13)bpON`Oh z59D0ZzWOIIHuPBHq~@>v17vyDvQQ0*R(0bTs#xg8cdcTl6Y-}>R*Y~6;BzKH`4i$8 zLw9eSp26nbGc}qvAU^1-%9?PFm;#KOB$V`0p3Co!XG#h`uQ%^>A0R zpu4%DdHPf>M zybRW;Z5MRjt0;EA#JD?TlZ}bt%$A?YTv%*=3Myk{^vaky7zgE_577~hJlG$ExzVLOVNz=E=|qN=KVAF z>WjO>-L)E=8)z{g#&nkL zUXl-zWmIWB^vG8Q_VN?o(?>H=cs&6YU7Ecm;3TfKKY-Z1=j}%9 zAm}d;=~Z+4UEV8~eBKM5>0T^?4;_q#Yy{t-IVYCuDTbU}&adS)=v~h5TtL6?pJ7Dy zH2^WT(E3h*NxAY)Gs+i%Nd@~)x#*zr@ZgScGr@nL;bXX1I$Xi>KAZz_gWYNC?zcZc z5+e97AM5aRD)Fn0D-=#u&3W|_O}D|th~R>f?2WJq%jYbwn)cOMeFVW#lN_lLa&skeuyWhXbvQpGd$ni}zb6k{p0N`*xp*%9rC$M;d1>^u|TNje$O|kVsOT zhu;6z6uWN66XKhP{M*2YBS~EE$y4k3T^h8HrJMH6J@|9`WAY?iA`5tK$j`shSOhO( zO!<3q2E7+OR5fT>qUIwF_E!>PUQ09D8NB_>0x`PhNyB|R1hv2QLhSPI*v2Jo2__IN zdD)QVqSAzvHWXS(W88q(ZKtPg)rnordI!WAh`2O4G*0x!xeoWSNJCUy$TbWVMB z3txH}yJ3Ke#&Np^{}Jb(B(ldFEiw7b9eb}`wDICBHVmAVfBNa)p@M*%*IQQ(h%PSM z$I%F@?2F77RB6o_pJb;VVX=z!t?>D6aiee z@rV|jY;lk6jYeWdL+nHTT$9XbExFSWDIMbjPhNI-qC(lVZTFWm*1EH?Q4z!m4x+*Z zm|N31ri2HDULk#FumP~7^^mbau|WBM0cb#%ze^=hw=^fY$}v)X=GcQvrSuz{1qXOb z39d=4wEtLcX759t&SU0O_sSJtK7wY`27_oI31nE(N{D3fpki= z`PmafC2|c(4u||VV!0OSnTM8RjR-!p%XCLK4HeF5zM3X=SxI4w*+5;aGUj@QD}!nY zFqLQwqQes_K6{{}`BKtIi6e^q{8O16o2{+Zb{UOVS7FEMS{s_^N<10WV>P9%Lg&|i zFLh*0$#VHQ5hLOXI9OU;OHa@25mOH(CC5_HQ9La9bOi5G>P{T;c&sEQBtYg5!V-zu zkgQgeqFN!3JR0ea~`_mwFviWJ1OO$ zu(mR^Dn`m+JQKC!D6~HJlSm_u7JJTbW)9;)>br!rU$Q;3R<`@K=y6<4eajZasMY6Mjh@UvCLdsC%|>i`cZbtnEU8vUxVD zkxC1Vv{`StZb9u`IaZb9q`j)ihv(?CrGs@vZk*`L@uADHFj~qSx=0i1SX#~)NAla^ z2mR!OLHr=W2EK>qQG(*~hDq{H^1(=}ycJFxNIV#+oPm3=9EMjk_h8yjRfYF$14Y*d z#NnB+P9V4Li9I{_!~t4j#h~I=92ZBI6=;}-s10jQp^{wc`BU5KTZ2OIVt0#;?*8M0j z9w{?=(~O%J=T2y0DaW&t)}}W%C-HP!4Q^3ZSJ>vtOd=*2u4?))MOIe^P&Q-qiPE>M z#kHl9!d6h<1glbYt>U<<3RlyvrngvG#aCA8+5;-+Efie^KRZUuEh$XwDM%tx=gd;$ zi+Hv>y;XxJpoaXDb3^#z%l8W}<9s3Xb||s0I)-sk^NrKEM85L2dvQ)pIVl10hdSZ1 zU=POIc>EkP+*NRkyA^e>|*H zfGL00RZcLMBhRC$lsbh$@+nCo<&^>AX$lL5hkubxgUR3L;|-I7jJsO(Y65j-63>N)(X{sQCB`&njVN8FoTyz&T7- zNLm@-(1e1BBIUnHO3seDqKld%*VsW>m1QsFW}kR>MdMPkpY4#KY4S&WBas^hP`wNDdv1qgz*%q*OD;ZtCxk(JEwb~^^r`skXceHE}xS~{6 z)$|YsXS(8kCb*iRJ8>*Ggi$?AHQKUALR- zW`G+SWy8|Us&}n>tZKR$=Q)dAFOyE!tg!9lvQ>PX+wZPYlN*?A` z@+w8{WJQZAtYlUk%rUat93jgkCa`b-MSl2>H4otC!KpQ$!HYhu)mQ|dkYE4k4oXf^ ze(V}dQ&u%H>#lHU)-CM^{E(wp8F4U*82Dj@!fxE=z|6R24V=mHHM@kNnX$k|W3%q9 z56+C`HN^I|hiAs}nvBoPtGB8Fnz=d~>e8(b(aa?_8lwqSEcW^y>B)U-I-fu$3)ao; z(DQ?`o%)7Br*6I4u@+x_>?UTM@xG&_uRI}|ic+{e3MG>C)I(hO-$^z0O6n; zIucu%*9Xj;@moZ1-I5VNxe>MAU=#p@4p~5 zX0e^%l+uvYB3!ji-?Ay8PtFaYgPU~Y{0$ug>5)GKRf6%%PFYOTa_>q#Q^^i#65DpyB9@}@vH={BsCBXSK!7eJ{=37N^9wi zuiW62jm_}5%~t0JK98DZ8VAy^d?T4-A1ye0fTF~>fE4hALYQX>B_^7xyPtf1m$Y1k zd%N#w{iV*!q^>g0Y?GCd?J;xc3>jIg8p-Q@`;U5t`2Svx_$FkP;^%DFXMgp!?9(6e z-A)rc!zaXaZ$pnTc0zATJO&*W8v|7Q|B#(m4GqH-3b zzbqvcV6lFBVbuxhYMuSo@Im{9UA05IS3+&*qP2uRIu8G}IF1`Xy+8!Bj!`cUw1udb zhK${-6O4&tSS5VNe-iw1(IegJWES4AlfH|iR4Jm4`(Vqaw)=;ESb#yl@F=m@{V6*um>NI70kWj}oj$ zJG5K+$r7Lb>3rlxy|Ho z&JGzX)$RVEo-rVx5eJrs--7g4HfX|T2Sn94!J8$*v>^H09Xjpo5Z`rc{eA$Yjo2f7 z#O{YtM(S9{AxiyzM3ov*`OeINl~*AgSk~4AQeVG1zB{_1i`KC0J0b%z;`>bTGIog8 zJ&4H!E!w34Yh&DK5KtoXfUaEQUKrZzQC5XDL(=>Cjx}_H0U0Yf!!^R@*d92;HYIW9 zIF>k2YXdE|yMd%Qa-H$e8bLrDNogoffarlkzWUA(Q#NXxgWVvc+HvNDKhpR|uOtcH z1MhLPOGw6|T`D8%Y{hYPEQ|0B51?zm@BwsOrk~1!>>ux*ogJQiJUBe+og5x~Jnp^e zofGnU`)f9>C)O5~AhB1vh0KYO&|<}6H)n}jRJeua!3bIo-P7Vi+X?--L*H=C69&nH z!_Pbjn*63|jew67^(5vPf}K!_wytFDVp&Y=uTcZS%|R(H0{0JxG>=zShczkOUd#>? zO`P!38^WcLq(8kP^@}xo;tieNWHychQARTr0zQHKvoL}kCv4dm+g{EN5=PPMs70mp zI4ez(i&=z-QyOtDj=jl(f6+*fjAwkgH+M0{pW&MzsrC6XRk0f+S=)9|UcCHgl%K2JHrg2Q`Z+{#RC!&Ny%^ zH7}I%hu;}h{?qc1q4;eEN8SsPGR2X%2uIlEFp@ORxr@B8=SfD;(7YgNQe3!tTwt!4 zbtK;oBC4$=lEzpPNZFuKpMY-s{n zG`J1cSdwKhs4{G`Y~eDb`I*_KBikM4i4*!aqUKs&Mzl6&s)1T<-yY-kH~x}uWfMA< z;L@9uj`PyKa&WgC>FfIQka=a~N9~ChDaODK2bWeOb`hM><^GYX5S^5JyHx!t?Hqu3@0o=EVGlv;9y-ipA}7w_a;-~qk)5j_Zdab z8b(bV5f{i}+arHGe?=>nBwMbQ2s@FZ;>@(Ej~wK10@jv(dFC?xk;EBl#LQOJIH> z7yM;er~x9+dUhk~=oll!Vuj=nJvkfi;B-m9;!K=r7(@*6Ym|^nmOF=8icccJ~$ zigpG{c{-xvDzuEW57!=pjww|~u4po_AstZ=#gONL=(!XAB}WT0&wukK!i~>4-+Yc* zo|Ua}Zo%S=!=w!_-Jl&uc*a*rkj??3DDJa_QdFYU$Z>meNQ&gnjPI$I$Y&WG>T)Sfue zpqol354|z+E9Rk#4VyZ}MZHLaW#5CH$yiaEk8l7g7voN`8 zUqO9?a`mRcw6Xuo;r>7NchAmSdhiH5b6Us40g@7xi@AI(1+9Ec)I0h0^dE=6_THVp z-#ykWvnA9BMW0@X@PMmpdw^4TXYR$+CJn_A6oBSzwx|JVW_EYVYtYK{d^v_;iCqzR zXFs)m!i(g<#`E7zD{bUSk~S1*lYR=E&MB{_EHko#j!KJv9{V0S*+Ds=0Y&^{>tSzM z!}*{8Aq__*Z)ClIDSnAkf;EBi*X&M``eJ$bt+0E{>|hi_fp`QY41iYKl|E37Dg+fs zypps5suc#3wA83Lo$l4#>3jpaB>S6xHBX>ShilvqF3_j+PR{~P% zO*c(p2sd)4_Lw*EPtJ`vic{FkI3cU%U=G9gXpNkXSK&PB4yBf@wDH_XboyAHAAyVV zhMp79qrlX}6PRch08{c%Ouc43v7$nsShadhtWxC&-gg{W2^1&EVrG7W`>c|z&`Yk8 z0~2NoNhW@2n4F8wP!{qNT{t_Z|vER1|HDdA!rQW$Q5dMQ1Ip>l2L zjA}2HkkjF?)ICSzB>2f4@fy9lhnqacEj)~kU9R=~U@X{RD&G+Bea5$CL6hI)r4SI%zkrW(8=Ep}`HOpM9f7^x zD|)~6oTS)#o}FNOog~;6Dd0t0`1UoWek{B^j$iKOzhxz7y=LW#uNjD#;D8c85MCdM zulI`Hv*NQ8Fb2c~BT^F#_#;aHNO*fByxl8!%}URF&k7gc_isYR8xU{6&!$|pLW<7w zIL&i)lJ0txM53}6C&?;EOp;ZSm?o>J!KKagY#$Q9&qPW45oMbuk|>=CiT1LJlM-c?C#6ajnCkKVDXq68-f^oEudIOSEwo`y zKu40Dl!d{dL*Q(5UMgNdr@J9aLQN}iD~HTKLGQA-;7zGuJ`%NC{g>&d#DKyONA&P; zTxxw)rp2iyA@P$P zd?d`Cf6ZpI%ePFG7Ley$iiFYhUMUGR)MYE(7I8ahjs`tQP=rh$leySCmiePf|5y@g z2ZN4aw$gN1qOM@IG81jYi8d7Fp;IwNV{@FQLEl0--ORU8z{atHH0`xVNPCpd&0Zt% z?AJ(rq@a#{*Z_#v?Rq*peGSCx{mj=uygsNasAGTK??m0__Ewq(P1B9jY-gp}h|@e% z6h_s83|Hyu3vL{dwr9dXxMtgStySyy`{dujU{L$2)IHdFI1NP-Y{N^Z)9Q9x8yjC0 zqg1c|AB9FTZRK0GiVbF@^$+3(AX(7|AEjS1WrZp6rnD1ru`jf~rlF(9ied0il6_R9 z;{y*qPEpNINDlUhjT3mnjqbB&&(?`QtSUZ&=&F#o*k%Ivb8!)DWOwC6Gi9Miz=nK) zBL1KytgTt;JapfPHRb82!k#rnL81N0p;-!ZrZcj)+%`f+9DPFWK!pO076wt`QnG!N zgi91Qb*FTg8zpyTC{)_vOyw*e-JBAfv4HrpyJzFxIlOkpSBQi*i*bugau~mfHz%vO zbG5m#LlzG%{n224CotR(M9+to2aNXvey(1j z1(YG~z4l+kR2VNj0BO{;`b{m?0@{}YV?hREK`~>@H+T`#VDm-D8;*@)&H_Eoh7CGT zkgVhcceK8X801q9$$E^Lq>~0QmsfgRjvDA#RKg^imdNH2rxr@H_@4%J5|waBr;M^0 zgo&Th{Poe5sf0f|S&_{jyf4k)04FLc;g3#~Wb+qIlayf+JPf6I{P24@1Np?nJQ80p z(?Hg~u=KJ$rD>z2%$Ty2U&Z`iYlXtQqlE0}pDtB!>H+IYjoqJ8WPai-Ro7)fApReM zu$m!qr6c5R)qINQ+f!UDd;=OpEY{c?Cn^ z5qGivkd~*S66i_0Xx~xLifFXrtm1+hIK#-r17QRc{e;o#F#h=m`T0i@c%g7gIO8Q> z?{SsIXPiu_&8Kkwn(o8mhXG=m$sWb(i^QpM>=)G!F&*+6r?jtQMtZzSCozf8kX|<9 zBIyHbC(2e>bXQUesc3H=&gNmF=&mqU!$N|lpyvFzYhTi3>A0)Z*CB-$oDj2^eSXdo z9}9brC_{vFUmPMA%eYZe#tlBwllUqrA+&^i@lyR8l~+&T1jBKIqw8xU?C3!T@~6B6 z5syLQckM+j@g(7NkD6IIlBfubRfI{d5^R=Kf=%Yf++iJfkadm^fju{qAgru%9`D zx$lNIlsK&s%HS_yI6HIvtFaSqymS6LCnX*czu)t3#0}p!7@h zd?TW62B8~UQHe<<8jST|+WOfgw84rgX0> zv-`9oDKV#&Ui)JtyCrC5!<`aL_Kt*Nr_Ke@acUnqB3j0mL&s$u5 z1Scg|fzY60vnEX6F&0>3V|hqoOj6jL;E#Yt2atVD=}mAM>9g>d zDq)g$F&{4I+c0HvnK=W9X`sE-M*W&{GlWQy_TS0rzJLY%$S8tl>L(qJNk4mjP%Kk8 zN0n7@R>?xvRPnQP@ddl0gUiB6$z7aJO&mHUBR0~we#Ccj{1$#H!3&vJF+BIuJDJ!_ zT>JnjiDNL;WR<)HfkiMX$fG#QBlu9~UW3X9(F#Q(N&ewIwo;fnXT|)8Pusk3+2<1G z&xI_n)LEV+vq*2_HFd#@C5_$kW+x6txZixfy^$4vho6^J%(scB8tLCx*3b@Z=~NXb z(8x+H!Un%#0uzbIwWi7rhi6FAgjUA6v$gWb^Hk#jyhKe_ak%F!qg6m^-Wf+rF?^G# z56hPCVc@ZE2aY)Z@b%%}?mu_w(_ZTg`_G*9?$FtA`s;)BPRDV!x1V=LTXv`G^nVz3 zwzo%){d_HSCuBfrPiCddSSO!n&z`~G&a5ATeqo2-Jcm4UZ=Ns$m_bv0U_-U^VH|)V^bIY+e zhyAV2$le-k4*J9O{$SmC*54lf;EbNHZ#mm*=4BMN|Mm5_{XZkmJ6ps6{LR{`PR#7j zU%dV6*FVOiHqwIf_5W;rWBb1TSMe!Z{{b$>JdFc(YG_2c`tSU0z1!Woum9D27O(%n z9~9_7x%%&t`rp{--q-(1KGoF!#CCHGLHYK-+1={g*Z(R$71lon-cglNzW%p5#0=cm z{|Y`;*T3gqq;$Zb{-15%xBr!VmQnvS&B(VW&b8-%S}R@u8=da@ef_WG(_U+@{T&XP z9J|v`ODY2@czbh`*LU*odS_eKh4l`3vi>*gcuD+7A71~y=Y@Icir#;tpH;N~QiH|& z&q_b{_W$1g-@g6dO56Xfd;7nN&x-9oT&8y43EZL2z5Tzp|F>@cq0W=`zk6^0SMj+G z`)>!~eIIZ~K6lUlcd7lqpZ{IS=Pua)Zb#w&ckb=~Dn7Sm|LK9Lch1Q1o$0`7L+0DY z;;;C*efz%wc0XnRJJ0U-f3D)Q_V}Uo*xL7IH$DXXv%16_KP98DEj;Gwk%ze5-JX-? z>XYB>ThJ!iAm_0=aHfGXwB}R1B!y(!ox$}e{7uXH)$#H2;cj~!HuF1HjlF`iV}!(w zH@7DC4ITrX!-;XYzH{V`;r3*>jReks!aQ_l++7G-@2&a94%+Q7NZ~b{FfyQ|xqKgR# zZ1&Wu?Vee^vzoQHd)7N^0g>N&=f9l3Kev9{efMtnf?#yu{7U19&{0`W?N)}wEGl#nhF1#xTg9cbL z$Dg>^{sY3`5Xg+(i5ucIQ$boTC}{2BLxS@sAViREC#*zUxMCZ6i8kpaUOs$C7=>VX zU|ZV2N85KsV>o!#n_hVXERNng6y03&GCR*3c717f0&hqpcKnsfcF!y9X#o)Z+Gzn(ipOQ+T^ok+$;hrg83qu?@}m#LRL5*M69JhMkqiYUY!^%LIu&;X7 zAwOs=-15kJKn@JDoT$nqv@D)cd^;)^1i~%(q|yxGO<%m}q@L_p5vZx;^x$OTwp8sp zfV_z&NN?SQhgyW>+#)x6DkI%D8_dTcO)5j1f}}-7Z3)~ao8o*nBxR&+3}uli11*wO zcNC2;uab+a3-2iwE2L#*Ld-)1h*&l0!CUb7ev~u5iV|USkU>qh5Z)f8J94wznnYP@ zT`?T(llRBR(OKVwDR$VGbMJlNP}cS(>s+!HV@5yq8hen*e<6z~v+JF^#)KVD)dHcceo;LS#BjrVAX0lXG!I?c+Gr zCS^hlH!GOCz!SUFJ1Y9zvxac}=ER-S0VWxg&`N62d4dG~*Y0>M-2OSR=P+*Ma?qhX zKE%SOR;DLUY8@sL{1|lrmQ!Lky}HxD9XdiKw5?MR?b;2*r-UI6Ro~(DM7csjXBgcf zD!Mm%>ydr}Las0cBwF<{f@C+O$~5!99U%yRntInzv4p>AJ>-0o&Yn=1Sb+x@M}?QD zMbH!o{5Ge>z$bb+bcYy04Px2jWqZ?zL*h@!ew28_M-=^-P-9aBv~sB$MpxJ3gh2>T zAP6wxN(>lWfcqe68HkTFz(}k@y+4+FQ*3|;hN|DU3k%oJztg|xoPw3ys0}v{beYmEnX!oM3)do z7I@J`swXV&cq!)4Ej^Olda-vc3riXjhQR*r@$pB33-rAoPxoFQ?w@}=IX(YK9-sbp zc)&8!*hDn^4T~v6H6I%oMIoz&Dbb1i63K7N@NqN82>=3n0rhn0j)(ii^bp_icPLYc zX9W?REQt9MWp9t2=|y-+o<4aJYxx`d6E(fC*2W{fVIPPdD!;bgvM->AfC6|k!#ji= z8Z{Mfe2&NUf$T<5uXi>NE>&)CZQZN(VIrTEBRDwhli!kb3lH=xy{BtKkq3zQz)N=*rHEl^`h*dp2?U4i- zqw*5>=R}$!Cu8~PB`NgZ!U6K4?xE}ry?uAOcYOHf<1xB}k%P#^6(JB@Lgh_9W_&4J zGjPL>PT!v}Crrl&Q&mo8ZWIDMT7dw=MwC}MauJ3uV%jEA(JZWZHwTLs53I-50U7AC z(Ql%bTeOMdkir_no`7q-3Q%Zn!tlfMTWn4M$DLjJ*k_E@Tw`G~dq`5-jiwrKY72HXkiHdekG`RyFIm47&4$!#){}U! zW<6na>abCPIqb0M0%n*$K+^1S9NZuHd#x2qmpP8hp6x~CR@%8^x18tUaN4X^S-^9K z-VSNI*%_2&HRDc=DHiLmhvLc_U+`^*o`4UV*Sdgc@L>1>K5jRoz?#vz6_GX~;|9@6 zp5QEVm*s)pa^FzcP!P>VIjWQb`+MGJXDG-Zl&*~PnN2iNd>jK*vG$V)^}2g@&Xh|I zBps+DNk{DgSq$R4Od7R#(32PnCx*=8NEoUH!kw;1H;cs-TQvcO_&KN6aGPyOh{%N$ zXf$i$GD(n#V=eX)yQyVsaJ6ACmODmkNLY14HvR12k_-4Vxcv#HEV-tW(Jh@z1bfYB zVgdG)PIBYe8JErjD;_uknRq6)NxD|Yvd4iZaKQVEbd~Z&VK>;1QZLP72qULtD<e$=tTcLx&N;#EHf_G!nbG+)u%MAy7ma4wPm0ZQFfy;Vpl7Ry9fa= zcO|V|65saF9rF2#ecY=AJ>4nvRgG*ENDVUw33f&N@dtL*jG$mm;rju<$Aa}woPkGt zCm5JQRHz1$!u;$N_*G&b0qK4k&;V_(ror6~J$({8^ zFcU6J9YE!ZG-Ai+k<6YnUxRZl9$PUCZK4qUd1wV5u*;@nrj9ej1)>MQm1hr``I}rt zJra~H7XC<3s$}7Wp~OV|7_l==P%JGuM}biC5`o!QtPIE{L{-m>azbu!!*G9MOp z0(qq3en(kj8O;=0ihx%z@6(%A8l7g_`R|-`FO3MPs6)@y*xE6e(KwUb|%t zN04_`Fn~WF9+Ei|c#vU|?P0=NMz$e%qGyT=9yDgNU#4@3b5V-dnVZEjNr{WD(%lmBHb>>+ZPpI7XxMD98b1ljOoKpAJ{S$qXT11(Ky_4-)&+ z@^?0-wl-$UD&OcrW?}@iUDyYXU>~B6>>dGFBNi9;kh(tLsQQftY z=d&wXPBi+XrQuKA#;8bFye1|#Oy$<3TnSoAhH00!(7G{K%#39yX#t2{K^+&*8fS!_ z+t?^sv!L%N09Ms&`kkf&9<^2o0N-&Rr_{ z3&$jB!FeL(CY-eVsmURUc@c2IsmC1XXp_IxX%X3E_Ju9_$oB}PHa8@SRH#ebitq34 z`4fKbMEr;Db~^sU#(n&UReWwM{sX^=@6e>sv4hJu_AE2TLh3OlzK^`H%*YG8qvsn>?_%hKc;VZW z+do+Zg)|I2?7=%Rs6l{psj!C(Q(GRpWV)I#2kaFY;rgGfgE?5*OV^neg+R#iEOlcc zEG^tYZm5MQ7D5tww%+~Dv4=u!Xy=0oI!DMDZ6(NpDLb0NOwJ*NRY=565CSGB!y-t* z6clt{%8?V|>7wW)mm+S06m=o7vr8x3f@;G>g~1kt7zMmOj_LF)@X;!m3vcDl%+txj zCwaxdn-O?P{?-C%bfdOs8P0KcfJ*=B-Og+mZ1hF7Xk0Jny~gH+?;3vc{ftFSpn zZi#fcN=`2B+0N`)q80J11o7hE4y>(XqetBB&yL^54zQJJ+UfhIu;wN7SCkp41B>}nE=Cbt_9+%NTD3uRKb9m;IzCYr>u4(_}^+1)!n{CIx)asS=n z?)l-z{*OPksEU&B zL|xbrcNzLg$o|RI^UdztJFlI2JSGo65DQ$VW3W2wi>_7_Ym9alQ+V+yWDN5K4Q!s9k^>v{^ zNrPvM6g+=LnU!8sTu9)${7_Yj_t#_0kO=)o;^G!C?$_aD60541##u79cRlsL-C+W zjE*>-$gLO46}H44>`g!xs3S#a*16JBxYI)`Xn@Cm+5BID=egF9%Q9WLy4ENwb=8kB5hZ!%z7p%NuQ8 zTd)QDq%aw#)|{H?5p2pwk*y2;)qDzXBNlvFaS|H+<7FrG-z?3sRh*E>Jtvkt57pv?LVVEI-% zEzZE|I<2f}i>U9Cx*)@jOslKwc=R?d0ETb`GzbvxvtzF`t}?7_(r06$U@atk>0LVzACQGmrvkDRICF&T0!iny zJ%Fy8z({0_mqp>gufPqd&w#Q#n|VyOIz4+mt|wuj;mKiJ7ZSws2n`x62Tz#~;Y=?( z2dpLA?h&G7-4SA#8pNRrdi17`o4xN2NZ-YpWYu+w|xMz`l5;-x4 z9TTP*VQ@^`4vZ&{`-cz$Hc3a5Ts!FN&6bDIT&0yfWXz~EK;~o*z0HGVbWD|@SbXaa&QO}Nw5bXaxiVFsO5!rLMDLH1PR?+yCE^07O=GqdWHKdebOxDOk_L-G!%sL$ z$A4u58=Z0cDQ&TMARQK@{bi1g=L!&Ukcw2C%0uTmGl9XDSDKvKwEJ;5(F~{}tUmnC z&Ttvb)hGKVV6)eeJr#`!>m_9vFfKEv zlZ?$4bAdIT2tNpYUxvy0Sew7j~glZFCz!Hg^BDSF5^PDlwc zj~s$+PHZ2prb5pwfSvqL=_(ca-Gn(>0YZ4H$vl8+q=X136E9=~G^lfc9x{NhItG(y zQ_^&Co({Fx^;dXX)*^vwF`rSe+A3nzCTDr{0@db5Opy-`=!P=NJQ3qNql~yHs(Bej z(%gv}MSAWV*vhTVVi=Xg5s6F@W*IM}=_Nb8qlHd~6|9)#vnwhYK{9=kB}y8rlsw?s zQE?{dU(5@;?jS;zCsA_-gfkFcG&~ZE{PZxMt0tnS!y=`H<(+71LtX~BD5IX61RSVc zr3DXX!~&K%QBkrJSDw0{LkMQ4ujnbrMWa12QRLOc5)}oR6^jSPL82m}S^LuB0(H0) zI?ww^HQJv$5&vbqn~eXm^=#`t{>v&pw-Ns(GMo3YUT*z!`|)3%J?lK%6ym>hX#AJ$ z`}i-b_+-U@d43=N!0c5Vu;YzAC5Q*Yaw=VO&~PD}?M^yeNHjGsOr|ifaV~}L zPJj(E^0IUS$2N?h*%@(MLc?hKTp);A?+xj?JKYd~<3QL4K(zjne>%_UX0=TM|?%CiwL0BYaN;8=E1$QMN zc8c9HEI#BmFS?T!$K1HB!R8lxxX}e`NLR2|8FfNr{V`tFqjmJ^mDpVUHPohvZScRu3;KjBmV^@r7jSDk-6b#_61nKiFiy|8lxS}k-62FVfiiFaW^6UXCvcvtt8&F%`L+U5?e1}4Qj zB5_MlFdvQF&&{MT5LpOFpgQ#6f}D=N1TgO;_EgZ(AQ#|03XQtOYM%%YU3Eq~I)wxg zkw)}w9Yn7~{(80m#3THbWr*a61&N#)wjuk=-%%>wFMW;F_rkpbkx|*Ctw-GIM~5V( zekzre8Fkv{lYSu}<`k=Y_v}qndYtep7mLL=XM8o1eNHQ@%b>Gi}^$&*AL=L&#B&dYz`W(+=_aWX!e~)JsWnMhyT_++VyKh6I8cHsg;sjir9n4* z5nD zmW$b`X;|Z}<+a(F<9uo~vFXaIts;nrVELngtS77;KEMbM;&V!NqF}4E7=w8rBo;02;_cR6}3(hn(vEOE%7c4A+ zFT%GQL<5Kh8CpPBl#L@1v?Pq)EOle*yExi_qWzM-Y{JK41UY$-#K%TcDW(DP+e|Rb z8eHES)hf?jTZk46s05JI1MVka&${tnrIPl6BlnY#|aZRFm#Y zBQ`colssfupo0Ow8_j={KX@EN+lsIj}h|MBhnz2n}# z^?w%ppf~XmCHaw-@`@_VujCJI(Tm!Atd6)BQMjZ_IsRFHX<2k5-a65gflVj<;ou2w zGiBo`KI(*$Baj7U5XZLB?ZyHc9B1K~yk(Ma>=ZU!NPAJ=9iG2`cOuL8#{L{M)?4dM zDgwAI5Iq^@(z!pefBNR_dkp0D&oeRW;dIzgHL-Vm#=#aepIIPmCv>s~jFB*5Bg_jT z6{_&$6$|DZ8D5yn9nJ@Ay<#d%nSeROZIL9q1Wc3Pj;LrFyq%sn*Hl}TYM;|`l7}yo zuM?Z$g~^}@y;Lsr2Zhp8opOY*s6Ppa`7nj`#i2W3Jx*%AC!UebL>;phA#a2_l_0Aj zB!HK!g93T^eFA!MA}N8rm=D1hS$HX(22D)ksG>i`Z=XEL$Sj$VEE-axB&j$MbadWT zK}VdFz<^c<(1i?WGgDKVYEcrLBI?3Grx&|013RE+)aZm89>x#hqIOgVe0`3kb|3pDA60ERr<<~BrXdPU#HbH8^vFiV>(~Eua zoJArdcgs{RTYOfCn|#>Ohh543FNgd8*xx-nSGr|VjHqQfcH%)OD(7BVId4M8KuFAG zE+J$G@yK66w!H$`_DjmPPxQqe5DQygKq0HKlratR7<5+d9o(=JvAmc%Sj7KG9JQ{m;SYAYy%~(R3pFA4D7eT(G0{MC+<%50J7beOYWi*zN zQy>pXM7kDarlC5hfm%Z%qH!GvxC?zW0yVUlwre| z9EiFWP&mNz6kyxN7$ZfsKT^dg0hGRo6*HkB7%;S185M|>EDtqOwPYvfZ_ZJc#|W1q zhiTv2?tI6>Fxve`7wP$JnGH=O73$c>LKR~BWUd6!hv7sI0sLQOjN<&^y%`b4qi{jB z!@yR}%tSt|z~|Ev{Tt{qbe4x1Vg!T}$cW$N|?*gU=lMiat2lGn8BHaD|%=`0jbE zz+zUFOS_L;Rl-(v>L_d)W8143eQ&xG(RHohVP@kQ+x3QYCR|pFXbl`!+K3tvd5>Nw z6KV1(6pz|kQsCz_>aG|0ysavdF-enXl7h^<0Xy(24lxrSL@A5oB%eskfzs}UNz(l7 z+fz7#Qt|ch=KQ0UY_vaUe7~|S!>U!^o6y+GP+ZfaC2IL+4}C91lo#^A^|7kfZ4~?5 zd805eVDXe_EPHB>-c{BXYgsl)k-$cxHN-2d2X?Jj^OK%eDTO*vxT1R5a7$u;&CxLC zsfY=Xzpv$l*jY1h@(AhFe`Q}bTe=5S7oy;*86<*cNlq1>iX z7<`b=3ALA(TynBME|#^N(^Ph;*pf0W=!htK9bW3p9sM}f8{@4)24LJdO4aS2R(i1p zUDbs*^m;$~um9N|aaTwYa&{t&+T${G*p&iSlNwy0KSCPMzc_e`G_a$9kR7i%Fx1bf z*~5^Po2KSTZCs3m%-1_Mt|(~hG2o+WuP2Y`tIEis;j$py9YyftyVrfaTxE1=B#gp*&QM+VxvU?^xceDf)(8s>#{_9G*PEhJYO!PuIeQ;64lU4l_Ic?I~3=M4<$lT7?X()Ur zjH!}8)MXM=o_OVnjFUfbdsJQMY_Rq;jirHa${x3fT_-VxPtfwgcp}-J6x;1?F^-kT zdUR%?!Yv4*w4PRD5$WHoZDFB?#0Ir+Auqph&NMt%3D;oX5_CBSVZ| zH2zXC%4@p02^;ht@+Bl+m=C&aF{rUmfR!V2fS@=NS3j+PO1ZBt#0;#Da6y1mmCg)* zUaWX!Q8b!r*#wx`FhqC|Wo1eknbBrlki%kpE*y<_N0qI4{v`n$>Wvl=clwy&djQ7a zJ))C697m0~1||wCCC)Mxg(pzzfiJhLQJFgSD4s{!-c|)~G>1prok@uj96VMbTfcM2}yY&f2xz^-=7HC zAaV|37lmI$l=ImVt?pzFmN&Fm`ZA(e(a21~9}6N*L3N{}U`su>3=heCEM~(k#WU(; zRr4vq?_3&aRv|sgc5KHzbrqp8s)dqILkTyn4!LnUEs{Ks_8mZ0kG%WLr=($uxh$bo zaG93ivE5Y;$?hzoORAM-!k`wx498t4=DP)-$J8k|#8iud9={Xv96un&4Lnk3{t|nr zKG@hBS1JuNZkoBHxY{jvYDd!5qC`yLhdlFub+-lOm5IjxMWHoL^q$n)fY+w>GnL9_X+%7dmu zpM47#ey(nWO19aR_r^3rvaRLio1iNQ+tbnO#1tL;%OCMn-ff436=>^HlSJ&d);FH71-Bz1*u;G>A) z(B?I8wLKQK3!5;vDCF$7=*cwpSRxoAyCr#sU(sT-9jgcVZcx(gr=yV*gYJzgRi=1% z8lD~pEwtM-arnjdT;cLH-yJ$Bac*CsimOzTB;Io&iEDI{l=cb1^MA=DMR{oYMsbo! z61kFkAs@$(5~}b@@7k$RU!#D?97z*N~SEh?(#@^Jd<6XmBug?MW%bDM7)j5 zTOyt29ZAB5HbF+K^sj3%E`_^*AbJ`_^<0SdX7NJ|`O0UCZ!|aB^&^(50BRf+nn;sj z-xZgB$e`*&aF)m*0jlcZRwA0`56(xgq2!d|cNoky%GohDFa6z_=4>a$NBJiTgAGh$ z2CJTvLB~o;H(mU_bM^Z551%Dt`;-Q|J$}J2asHi?ha&AsrD%9^~=}wms z5m%TfG&q5%(AO;UaQgDMwXhM#$4Y|$T{dJMBl%uaa4=C(vB8At4Ds%UvJ*oM=Fi*8 zmwgaJC^m|HXL~*W9z)N%nYM*a3)x~kc7!z&&x{J|LFf}^4u-4#fJ-qmef^9;9lB`y zhjRPm=i^1)C4E=a8I+pjrF8?p$QXJ1DwvGB7? z^zwM;UUv2RY=SKnR1wwpv3dD0}cm6vQeG0Y*&x(zAjke)C{ulCR%j%68-b#n>j1d~G#3(r{ zV}1sS0hKUvJo8&*;+QVc)oCbD8+9058+%3Ab!WwP(u|l9?Dk8_ic7O!H zr6RQo0Sia!$8RGu8-MZew^b6Px$a=%O`hEUBc@pq5`}ldClnwo3VI)RJnCI8KRp6Eew z?1VwQ3L~duKI*cFS7RMU=+)@<>+~n#b@-7?wa++DpnIBWf9r;=~{Ob0-AB9B1 zs`mNmbCr&!(hqI(O-ty4Ix{Wl%ZsKUM@kw6k;u((ss(Z5QBGZHRLGxwQU0yzVnm?s0bJ`} z&>*!op9TZJ#Js`XjAXY-BBM}gUP?i8FV{;X*x zMvlWzt_t-_aT#Tk)&(TTj;uDu#O7laGu<1J5%1(g!GGe{y7GeNr5X~+{l4 z5sHVmfFxKbD|$3P28O+HR6?|a(fJem3d8|xzgvf|dRGTpSQoA1<3*E=JnkE@H+c~^t@@075d9K1hQIcd@$ zhZF{BOFah^zxAOdEK*Syp^4qXTd-mCY{Qxg7u2$Q7BYJEs? z8gD(c6mAh~BGE)ot-V=2*aIweFE3T;;%A}$$pUDKn+X>%09}{CswyII*L_0gM7pW} z;d#J^x9`W{+O&w@&NHG{|Hyx4%&c(sWVO8O8tDCY8Q(-tPM&DM_e zGbq-qAA$wK%>P6bbpf;HjL1bh8}3Sd`jEWjIdZcTQ$F^?gK)y z2~4iIC*+1dHe$56c~w_~$Oc1)FcyX(5-UmyBTP7#TCLWAy6+VZ)Wx_TLoywTD!m!W z8mt0(6~_IzFKvrKG;#ZTW;|feCxs+9@V$<+3 zM!cybYwMx(DN8w10NtgaG{@~ho?g0%tb$U++Sd>2{&BZj$IJJ-SJu*w0Tt?OU(=Ha*DwWS^Poay@)`3U-tU1GUa`SkLISM;=6 zy}voCklFvrZte z()y&m@(#>@C%Vfbv>S-;MQc@mIxPsvJVk`4Ew!_2a<_JszQ|dr?%845*?@-dTJ8EZ ze){eR-Exza^$a&%HSfCgGY;`z|8w;a@WEB@Ao~V<&2s)VQ;&)47*j6kkDzmgNh> z-;_}ccd=4fo00tI^%6%9d0W_1)2Lm$$r+uJrz>&o*WG*_H8h29wOU1z0N|cPY4f> z#ZfNx=2BR#|4m5J=yh@WT~eC|K?896W+9iNWq-`C%d#2XDl$QyR$=T*Q*7X7hyuh` zhNzIj6jJDz3GF#JdFZksxw4UMPaeb^sj^?Q8d=u6DU#v$Dq*dCS7N-WMK!_ZP+)Gy z@@|)&0s$K{ZjnXSauGvkAqzdym}~i)K9cRkwriO=0oq=Y(Fz+iD`+LHtC!$)$CaOH z#QxGh&L{#=r9DXU&2Ll1-iIQoNcGmTJh9o)Pyy zp7$Pcih3Vl#Jxtc)$^;^u4DaFt6U{p7%us@*?Ed_+16Gtw^caNm1fe}(Acif^#|7H zY^i)mdN{mAw(3mN*&!>NcT7%2bh^iyU8NXv4Y6~?1xGWT%jj?&3nvtLm)Z>-wpNYy z1D@(czuXL0>P4R;-;267F|*+GyF`>!@r9jcrb+N-SZD&|x0`w>g**I;GncU3&Zz}> za}j4VAF?pY(AJU9WNQBb(U|$6VR_!Em8q(Y87x1XlMq31hibAcxwzy@(gZ2RT z#k2w?gU1oepcO__Tte^B+LxW6z4w0?xcYgBx)ZI2jf0SFU-aNMR_lnJWm7QV%@?;c zh(3=C9Drk~1NR>H(onl`>L33MUd%(B7i2kewRYriSEv>mQqO)o9c4ruyomVFA8&gQ zlveU88%H26NHGneMIr;8SOmB(NQ--(4(1g6)LcYS{+r%6w_?!2@SI;1%{%xu*b1<_ ziHgm1?ZXASIWad3mshdo*ga%q_qS>vpD`zaFCA>KgSk#iq+gRy58<(P;{`7}PA+E+ zbOT*t7uodW>MeoW@WZOqK_j(t44{EUX2S&EeYqbK|2c5JQoaA~%5KFR1HDJM1o`I1 z3c9j(>Hh~omD9u2Hrl2K6eF>=@h$9 zM~G&y_cPRlXjIxvjSdu~(C^SRb~~9rJTIINRI?#^8%j74)djPScB$ri!dIkM$I+2> zEq+V%Of59vehQR$d%Q!Jr;B7QB$<)6MD#{P zIPW?Sex&AUiG;y-qlew@J|99VNO3Bn?1^~2Xisu^Dl@ESDBWYI5YlY0sNfE02r;P# zH_%b)6n5-T8Y%@Ekfz$1@eLMxU1}Luoh3{jpo0)oOlmuwYdR0f1R9YR+Vv<5nmW~M z8(Ue(O&lQgE0?cC*?v_<$>JuYN6jIdP|5^D!%-P3N1C{dm)4X3ZlRaORF=P*!b||~ zAt5V?E1&6yT!78`cB?+kG84EM&QIK$06)|2Rdy0AW{UyqAafv72-Qf6EPOf^1oC~z zMc(ZXd33>(<2DgHzD~x6`|#6-@pf#~Za0B{j3Llv@drCY-(tI-#?hnjXh!52pkKGB z+?=&Ymz-+QDZ+`RUgL`pD7xm=b^(xoc|T-i-*RGNZUI)53|?fmT_bZ1)X_((h6oEX zs;tX|w#j|*#8QEz2rzege($}0a$AqUF+W# z#AFqzIeDuweHENKgcQzB)p{4fiz90~f40;``{lN{aAm?hdh(hJFMDU3b5Hcys@4^vZ zf%7xvNZu@q=BgdqSD1m!l**O0klW@TQdr}QkioCP(~v{ZLx-UdY3*Ro)0>^yLj1$N zfp39ABz!LjitOoSy$xy{B{VcKU!fTVUaHOnPi4$fnF&4MjQa_cvpvLn8^wt!u=?3M zQ%(h1y_=bl@z)Hp2TcV0lsN+ub{RN;GggNFPw0D)XkY-K&BRD@ESV%&W(#l%T_w)c zFGEgw>udh^TeC8GxyQlI=wzQ+M_Ee@+aE4@H>q}5faa+&InYFsLX;Iv;qRM7nmk-T z%D@iR%D8W}+|0r`%*?0TsSCl(&vv~a6vsW`SOD$By}3RuYGG_!I|euw1S02a7L+BOlFE`!s`f}?+E(6W62y}s6oAEUOS0tyJ_t>#hvhBXj=?4rkHsXT z)2ZnY6NvAuQ3cH@!5dOJTxooncy>W$^K-iN7BqNte$7@@+d0VUwicJjJ(Z9qad9SR zHZJwnB^iIb3i2pS2HqlYoK##>msL}<+WPKU{oMULv{qLV^=;sAabrkSF8Q87PZad55#DSF!@)P zLM%b>5~`AUO{xVm_c4AXgI|xCCL?a@9n*bBm!<2R7|c# z5ta%=dEIL9UHkk`n)O}^Kh5jDz=J6=Bh)Up6PxK5sZX1(K;RxpA#2BS5`uw7zCk)u z8E-1dG$Fr}wgm8){IuDKG4tzM4-YR=0GaTsJh&Q$+gkmawdML5CrD;6ndx(xF#p(L z>;8oo86HReZ>fKNo0O<^b9%Cz(1BC%&pUg43wI`oFQ5ooWkV`%Ix|rkb-b5yVY^Vh zz#j#~Fny)j|H5^u=aykjjF!=9n=IulTz3_6F_Ye^KGud;DoqaeL;u83^t*+Ns$-*C zqc7e|a|H&&DI>zL_Ibv5BW)c`{&_BL;DXkN9B)RE^68M`$tltgU#FQToN?Z13_9ki zl7Jv1Tn}X4gAxJA(G7}WTE;?qq9lOj>q!Ph>eb_eBmH*AVnK=tplK&&DA*wwovUWr zBCcNK8Wea~F9pQ8A?g#;iALQaUy6n=l#gkM+q#^YD)UD*>YztF!kc1%6|>qN3u9^O z?@wBBs7Gj5ID-(@?=o2*u4<^~A1aL4SghP=Fsh?}SrmMiQ*r~$Gga92JhS#p)v*^) zPY_7u$*|mNGCl(OUO=6AlH6;<6R9lp0MzO8z(jthaJ< zKeX0|Qp-8rnYT-rAcso4u`MH~kk!Od97%Phv1eX!^^(b;9^8s&^1Iw=> zHIi#)-7G`5l$Y6|`ZF_?A&2Tc1cw^30R93xy*5lwZw{Y`e+Z<;M*atFZ~GF{{OF02 zdOA=sULcQ|*g62bcibFw60~z@KBu3o?RlA&_o_n8;bZyfZ64p}uN$%r{wH9zIAa{n zd3HVJJtxJkrxes(v*(v8Iq)g$e9=XdpQ-o*c03>uDD(Qe)xW*hG5hE7Pj2) zxJ7JScf3b*-`gPsYtI910E5b&bf7a*`myP%ZYNXY!|$v@Z_%XWlzDt((ZaT$yf1-& z=o!BSyn4aQ)IUuHeO4!$YjU0yGlx!<7B7mK@I0GRDi|@=8$%#ltOdp*3Jv5q5PTct z)7}ZzF&w4aL#aZ8p@;6<)++vhL`;{B+B$WW70@_@;2n`FN2uVC>;&#D80r!aHE^mf5Cu7CIR@U z${TF7`13$mNE~+GKfaU~@&|Q;%mr%5369dM4ST_h&Y>0GQxd}GAADg>h>NcQ(Y^VEEdi+`OJ-l7zZ`3Ko;EW3KGhaE z8ByDDsF%EzbAFSU-oL#JaUSt@9wYueo_JA1cbq$+X*1_wZuf1}64G*N1qpCfwX7I% zIBXosz9Z1fU$dg5|8RM);3S*Wo`pDiJhK3k(W9sNnpYrV-SHDFKuGi zLh!HU3otP9m3TE!g*@bWMG6hl7);4^)lujpo&aL?YJq`J8KzEVGparl;_8ru=%E1X zVuT}nQBUB+62dUJ(0A<<)0ZnalE}j0Ds)UqS`C+&)iO@0u+$HSnz({N%0J(a`(Pf~E>?pyq-xeCdW!_qA3l|H%tZp-6P9q9wmKH#`2+8rYjzqs)oq zngG8&JkH&sYlu@ghzr@wgo5JHuGwp}-9o)tk;?BNaF8pJ4A(2MB6x!3U#J6xMmt9B zk1YgSyDN=%>Ves(rpE)^79G7lD9#&Z$5QGw5@JllNG(rmy{^8VHvep5c11l|s+#g#1XKN%w`J8oS(A<7(QoG9#CQ=H5Ovb z{?#`|z6-_xGy{wD4_}=n#|6L~$cQECSR`OXX|NS6CY2R8>c;?)Ze*i(l~!FO)3K;@ z)}my-M!GYQIrOz!l&~33*1!c=gKEH9K2RFT5mHq;|PC{IA=`YuN%&7D|^!hE@1jU zzsy`^ow}^R#? ze0)mYSi-93rPE*poupt*kbw{C(^|MTM&`@Zsq1smb+9)Gm18{4R>`F#hm0-xBV&xxpW}{Ub$+gJ^ScI4^g%1@RJMLLYS7Jk^}SfIrqka1 zw>AdVlx0=m8Y_iG?eu(i*i~5C<`Nbj&s_}^ff~S#3COozV$U=bCdPAVlqHBm+k^>` zd(PXn=mCxL!Yy~wEZb)T`cplpKZFCoroA5QG2G>2scH;-qj;MttvxjDrSjZ7<*0~bJhl@|Vt59rY8+EXV zYOv4{EWayExB;ysK|V0yen1H)xDZ2XvENI~Gzo?B{<@z~;3Q+(jQD^^C|!CBE927S zcLZyYe_~VePOX^~2JthgaKJvNe*5cIvz?t?^)IP$i2oiZTa95WPD}`|R2pazBc1w) zvoEwd{%?ty$q9j8Y75qSzZAPVoH|z%d|We35+z(gnP^1D3!2rr5I^n|vR}Zq_{RdJ9W{vC)5%hfdSBK?L z21MZ+WEfk0yVub)bR{Ee=sGCtkv+B7eX67U@j zRkW;yr0V&bi_hnr#+*;Vpo2c%$Ji$;t|^NR*Iu65?=tqh?xh1Oa|W+h&X>HYf26x8 zHyc#vJG&T9SJ5xEb(7Dv&>Kd6T~ZE@&4B!)++3zHi84<&_G}j>A?ci|T#O~vO}=!J z2vb+Cy|)n0mJvw4Ug4vTJm$3QW$M6%&9N;loH%tHgD2BX{v)HZaEcL4Muj=n)tPz;5|v;3*6vREb=L??+v;`pAYcZdz^1~HwGkBK{n$UMS{#}P9nc}g zQ0YXP!V)B%5ze^;Ys%;?`hH|(yEg^Mx|G5BYS~HgyBT}hE%1x3j`BoNWB8^bmGDH8V?D%&PHI5u!n}*0jDUnYcPgzy4r|)yOY{E9|Y)2KfOO@tn;FcNffQH|h~A z`6|&twOENe?uxW)#C`0VpE+I6)7x8Xm~}!C@%nzmDjrkws&Ru#E`H$_ zgF7&v*zzqLUr#P7ylrjoze_tWQ@t|UV&ZL~(u-zy>$_b0i<`Bapw{`b=&Kzu>)wM9q8JaM=?_+#+~sFKhGznFY(uGpjaF8!dIfg z^0r`EHg1i>J1#U;3yYcvT=Q6!e>z*n!714pm3p#kg>#OMk+u?^jT_Z7^r&q33l}rN zr%d)0w2mfMvw)Q7Ki;04xj(1=QyQ9*YmBEc|A)c{m>#yiCpNaYEd!Nj?95iV=;A*l z!{6J$!`n-08Bdzqb5VnzC*N>NeLrWP2VdT|Zx@kox7EF)`^)GFTyG}R548P_9q%4= z$3OeEeE7b*%Tt1_KyXCV<@1IwXrxj9rMR$l`r_d=nsKEVPUCU#*m=7k2TcjNjr@ua zjGP5l`@qFp6OS(-un!N~BUWh_L9O=+aWV5PleNk5aj-e-7R-gfr%Gm!_NdsPA85a;dKSJ@6X>CLmy`|kPY`{x>EGBzzia@m+7AN-yl<iu-gFi1e?yhn- zU1tG*GsNqF^^i-o@%ou-(7H-@?DYUFMTG{5dm_tQg28*`f4J}-@LWn!eoMdhtYP^> zW*Xl9O^qbZL_UNC1D!uZrd~qBA7|lDwxuc<51Hpe0cpvzOWbJ{Xer(CSfjs2#~9cj z$!yeLY7)%adn9TXN!eTEku0CV^U{wVwCm{VR!KT z)Y)mL1wFkVh;``8!{A$`di6%lUWjw#%R>@P?F^;VWpbP~$<~{gUyoNCB^fgW#dF7H?!|Wr73<}- z+ug6ckhMxuv~R}Hny?Ns4gnc@2K!8DG&&px!8Xbi{5VAViy;x}R~{m)^sDd%yG-}((NZz&zMUlm(S7`JgL<;0 zr^jy3K=|RS;BboweK*n_^jdfw9iGWX_gWdt6!v$0?Zs2tjM;q``gZ;Lgh>(=l#lGc zr2Mw#P9M3*w8zcJ@i-l9SvtPJaQ3v0)t2GFp(^D>^6X3fD-~BU(+fuAt5Z_0Icc}N z%$p{gzMM3AT`TQ!=isGebyXwn@FuV=O-aA*&KlKo($$y=0B)MGr*%qoYIZfBYg8OF z$Q+C)6UL<61c*GVsGF@uJqrinYphdMyi6Zaj$M&qbc|DVyv!^&gML2CT!MzGnRdFf z@KUmx=8ljhdx1uw{7~Jfsja%7pyLpInoO z{Zq>-Dn|Ut5ZACM@g|IHfl*|*eMqeIBqyzI2E$yunyRs8qMh(uqKd|@fZ<<>#Q#)1 zbkda0;9+eN#hfmMMMR*9X;>6lgc)bTp3!R-Vt^Nxz>v`=;8D*&*yb!HZx0|!ks60P z%^=XG5?ZBd=e$Amzu@I|wP0kq+zkm` z+Gm_KW|{AglyQ<54wYe+=MS8++O>(_tf8KZuw2z(_zjF;sJ5y zH=nML_w8db9l^&|qL6dXh`22F1S4L$2^an3%NnyG9i5@S3}%4^R0TyzNn8eD2E5s8 z@jO}UiwHRiU7n827)uk%*+^UNd4DT+$MjzBa#${!(Vmk@ym$8FZcWA}wMl2LcZoX&~6p^z*9G~Y}lw=L{hp{-L=cG?{*BdckenrGG+$*@FiWjpSo??_;k zrx)ZNrT!bj2~+A7*W$1UEuhLMa!Txu3e)~2Pg}RJ$_~En1bdadWh^`>ZgJlOpARsIut+HPD=qjPcYj}OMyK{Imy9`5TQ)+ zG562F^x=R?(tVEoU}EOQ{!Tj0OR-Ec&x5YgqlQPM1n~UGHrJP1Vd?&hK07~sJ|OcxZZN?KAOQm^j|Jv z1WaG1AdmLz!pDcg+5KiEY_?`~(&4y|u>ag-AL5{~78=vC&~|=+9S*GneR~+pM+0v+ z?xbV$zwkhQy2(FEnsPmzEg@I>T)yt>YuoR1hnU|uR|5*aJ%q|jpNAmnItijN(Pyw8 zv+b^Ap@Rtrd;$rvD)_($se91UbG?Tl8Jf=+gQSx6NbRY~7Kl-GNf-bDwW%cbuSj?R zZ_xwHL>4ndZ@A5HZjouceH9(gdj|RY)0d%)-*B&cbwizOuET=Eboo%f;!!8?9sS!I zezt^S62Ph<0I)PgtP}E-&fyWu-|+P@JqguDAzdx0%IYMerv8@8xpESeh*nP);)F@W zy5xO{Q5kiqTBydS$CL|+AC&sSG%W^EP@}08VgA9uJ ze7J579UQEV;)n0~&!N@K@S5C%fq&PrN-dof@ytuPW@KJ9IE`f`(&_#+U#t~aO4iV{ zHgCKcTysk=0AHBR&HXC$5)FBUgSqcyomd_pRm~GMal`5}4=W)^3sE}~Q2&x!{4s28 zsJ4#~VLOyh0=Ug)mo5MlG>V^#l7dwvWL>Ohn@Eyan-!^-1Az%dRbH7Igq z1v!&m$22Ikc@kA5CRB$c%=gV9N(nMT^so%lp^Z=b6=iSpCYy)MF*lP$)qs$jQc zCl&weh7fjAf>kCZ$w@DY&J8Bz32w#7pD@WSxVaF#fFQ5PCwy(}Spg`)vMj4Jd9x^~30bo!s|snah&Dt*Qfy*glr$V)rus7p~YKF$45iAhPC`+KK!_?G2 z`xV4-}#*7?fwgZZE^By!|H0+29cd~s%cqVW#qW+D1h zMaq$m7G}~SQvem|-1Q>mM8}kR3z9mPkR=RtL%nEw8o#CohX+HgK~Si{@%T6M*q}xY zk;~Q~`T2wVR54An1t)uQAVEkJ2|qdDKt=@Owdr%Q7G~ytdegbGPF7Zn+UV#Eo)+;! z(qn4F1qnS%m}&;VP!HC=#xKj$!}H-RzZmg(33rsAK59xbp$=(@R&qw#lDma1lerP$`;!a=7tn6;^p! z$x#}0S;_WsR%*|ns$hu2qNeCb!=k2S$it$dtR%yts$!_!qN*w(Y;}Bp%g)EwvH0uk z3!>Ciw=5bp zn!|!z9aAIHCZ6h3oxWX^L0jcgn7&xP^i1=*C!Dj$HA@nfPf zRb_6ynel@n^8X#R1(-k+%`Vc*3v`;3Xs<9S_jB@DuP`h2bJBS%0?b2-36es@uz=G; z4Nn)f($msQGAJtYbFeDP^HVY?%Hw0O%FEJ2GAPQ@ea;Beg!<)BVV!4{Fr}Mjm2hEy zIsw5X^PC(Btn-{41=uVUJY8zLl&vj>-aEZC^iV5s`qik?By@J z(fzJ zr4nY}tY*Bb=&wJk!%e)oYUQN=N}hfxb;>6rrTq}02u>ceTrZmc^c`rF7WOsv!F470 zFa_7Pb5_)?GoP`rtp2lhONOQ0G_^5#N?&wI58)==hTk}?v2~Gf&f2b|)}M;bmh65{ zgl*}*zPhN2tjd0OtS=joE}L4o-R#A_o9eRrm9Lw1J8|plwYXx{T*W<&&H2>m{Z-o% zT7V!LBurGG`Bx}1uI)a+h~@N}P06H$gG#Zh!QJKKbLlp_!F%S>_s_dN$ws;ItI76o zm-?Lf=xyDYC!cbgr3H~PNz&`U7(++-+=v7jOT|4+_i}D(n=>Q__VD)kYf6hJQQ=t2 zM^~Z3?(yPnx~PQj6?w4jkkWAV-aB?^0-uY^rC4khmj#b^)AF#| z#fIDVvm!HY)8j~5EbFCR>h0mQ00@J4HzYJJTs_i_4L=uyV5Jan&{t_s@$&e%$oAeW z^F9vYZNgo0t$$;OzC4|I3JsN09f8`Va^eXE#e7Q@PfmvWteyYz&EkLAbv>6nrb;kQ zUk6(7zh1L@sy+&7N@q}ImwQW6s^LR9(?~4~;jw`5VGDYF zyYUCGL|M7we7KxSO=rr ztPk8lTVwRs2@E64fV|bdKbtcUP_4l(!~SG+x(pjqJ#0ooE0hKdHe&e;N?>R>Vz{te zM|sd~sDK4shX@rtd%Wmf-tLF~*bJjJYMw)h$@cf$iGcddsZ`&KbZpva2#r?Z6F)Mk zWqQn)K2);wZdq9$c?vb(m{=ch?B^feZ_${695zMKI$#BTc_DcCEMONPuDCt@>yP?1 zo5ZAnKwFsW0D#n;Y|YC@-I~BD7VOQ?+#v4l@7Z6tpTTX3?evEoE{B)(;knBG zEU+W9m}*Sf1qvgpmh?nhb8=6#5Bne(rCdvjzm~r7bNBV(-$`@#S!wnlU};O?>~ocB z#-M%6n1kiEJes7()gvdp^NQ>fZ1h(kT;zE%Vu8>`cljrMPGFP+^fmC$F<^L$g`vac z*A^`6U6&yuqhZ3u8Z4doAp@Yu#Hv6bW}8?_782F~6_~AP2wY4d0>q#+JUoYEA%w_K ztK_2D3AEw+L7&LHB8^r4&UX+1wJHOTbCnPc+k_7biTh&0cX5(p zJ{r5-oP}Lu#M1=ri-=PDo>+_fe;9j*C{Y$5?Y3;&wolb5+qP}nwr%T_ZQHhO+ty#V zyXWuCW91+RnJXf`*c(|5b_6sq?Xrm0fTxbvdLAiE(N4G^X*PSZZj0o378#ZoLq`B~ zR4{?Zyhc&L1}`6&74{g}4d%FATKs4K_LY2Iv$p#-iINO|mbGfmivwWFT2mz!&FjjO z1ljlutJJ+SGrWUXZ{p2L)}&BUUmFj)oUw3-A85>waJmHdNrw)t_Z>?CRkfNGo(;-i zWM#1CPs_^c6F{lU>Fu)w=CIIJsM#*R$h@q)WAgx4h94d2tO%wh@k6ZrxSz@;v}FoI z%Lv&OfW2AEZW7haTgqoDTfd<0KP!^wD4h#x@`WqyTMY1 zwZyzlVb2q`g&Nrxl>HcKF+2>*t%N;)MDt@wO^~4yDNftq6WH@0fHI@OzC6EW5=Id^~LYdOwRFRgNVMSaMioK&cI?IXj zs78d_^t-_DVK`f$1TH*|<|T;A+K|^E4bB4-TA2? zbE^?d4euMrzg;86{TwR0b>`z{?t@sX3vS$EE9o~7&@?Sve~MaY2A7`}Cf=Q9{4DVK z3mTG~eKnB6>OA>_DC(g9=|yMEg}v~nE?WZ6EA9CdRV*@`7`}8-k7V#=UDbVz<>|N9 zSVuL|)UT_s;poprf8y3KBI^U`c;ChSL0=x(dTH%e@k>m<#EBB|%6%xC8GV-0J1 z-iAZWte#51ipun7%u(@QrU=z_NMQ6(61?J}Vicaxky;ef{qat4eh*E{>>Vm16|3F= zl)J1QC{Nt3ufA?#{CKeF0=6+(4MOk-Mm=PgdU5*}=1l90M7$hoeg2fS_7~xkQsiv5 zkpiy9$;AzW{N{Z{k6wSk((KIO!+@W7rbqa54$!*L=f>j%6p6xYFZeP(mlGIER%p-TWQILVLAdpMdbA-5@ob=#!S05RD*VqrJBv0%!-`I(w z8~{vW)sapGXdC#bIS8wpzzp;$?7+LzPwcDhZco>PN=)mvMHxO>r=Y??@MlBhdQyc z9p9<^8vLOgddazjb(mOpc+d$kx~K$k8t3y&+ShSFa$Y|1Ioq9BCP>CKdlCHsDJb-A zh|Sc=6c6Tc7C9FQN;QeiN}pdS99Z^!A8;pWrM24$Je6bur@4l&_&pNcxtk3TkNZ-- zsNk;HW@{D*%XyUgWnhhsN{~JXI5^z?xC;~t36fjNsv<`2 zBuo)y^;?p0IBinz&*sZjW&)c^%q~>zgy@wGrNxVmV#VCzb*_Xmvvf!G)3yS}O;xLh zn>NVm!1=yRdpx!2dr3eS5ZigPwdzg= zjm7drhtZzG(jv3PYym0g?A|XN4qtJ%f5_b2Y)vt@g|Rnrc~MM-FXA$7D*|RZeRUY` z5HUI$ESV|qx15Erqp#!`TeabxE*)QX)>S0;Vc#br$23 zHj9rjXtam@mZn}uwc41d6=y8<7j*LMLr78@G^yPdW1Nzyor$#U@*uY73==Y}r zxARY`rn5SoYDMCT$tlD3=W~hZ3{4`iSfY#^v}Rz(4ggxHPN4q~@$umP1fVYGsNuUi z%CCS3Zfn$=KJO2uj`sSXc2`49?$0w3#*lkT!itMti}__Zp`n<58;cXTa%^1>537E= z8s8o#Wo`vNpBd!Pp;eG(>nU+d>O>=l}R(Puc(R}gr5&A zn!kkkv>9y4GGt44Y`3cCR!AE}=n0_`2tXP=Mdzm&UaV*Crty7CrN?7xb$fk#+ou`G zY918x0=%~lgg^x-ASWb>Ajp_fN+epog!#N#MDkRnTOA#Q@9lw|Aj7gVlJ2^AzoluE zc(n$z(agOYdD{ERzm?UwT=QQ0D$6>UB4}khTZB+0=y`;O4J9Ieby^K6QF5mZbSrLS z<2P__mx?4A+|bgW^E8UDX6&J`vgMpHrgB9SNvubpB6r7{@*k2mZkP~iqY z=NdC(u;;NcsQhTiYll}|wxyq*CQeH+^;v%$QCs#?HiWd_H{0^n5d{a!Oz6VAR^c@i zLDKR^yR?|@PP83+sV!8wK*){yAV~>CQcOd&#L-oru=9+alI9jShl&UV*kwB4+Rh)8 zBSyKG@p2?nmqDYNJ9rAKw$>_DE31U1d_j8)BsZZ}ILL$77_i~PaHJmiR`Uee6f2^` zceD5Y*SZr+gj8Nfu_iwzY`+)vQ@ag!>i<4o9DpBMB&Uo9b)@hFB zm>xQ3RF|@*&f~M6D-1C;@DHW{<*(hW%}nwh_Epq}NCLA@di9^a>DIhXF3?|%Ul4U9oTo)bJ( zvt2gnIsz_F8NB^J+-!hCjlJ1OEzyfG=EZ6w2)v~E2&g0>;RIMPTcd5@P$$SC;eeyO zyVxD<|Uq2Z8q7K{aj}Wq)dctXKAO$}PR*CFUn=%&@Wg;eC%oiYr z0!{jeZmd?76>zW1SMBZUdjjP;oKv8TfS&@TNOJpWk5Lpj%^@3q7-SUv@I)DHyg`rU zY?}^QlCh}f7(Z5 zwGGxU@93~K!SEqhl$ZD{?AFY!KS4v2)}sLgXCKuX@}u_#iJ29Zy-5x#%$0#kmmKtF z@@QZo>;2JmRDm8jv-W)_x*WbH`cd@~T?PfXlm4&=46!nSMP?8agQ0=`IGq>H&2(0D zRjwasq1Amq`Dl00t-6$wu6}xr-x=5xFT18hc(@W4nc^YenCz9{&3=#+aYHZxmcgGN zHEL6||09z?$qr?kT=IB0lk+169&34q-MkUvEA&;*;(VuOFUSFY?(2ZRD8F-;zMY(| zX-MH$KZD-3ZPAk_jMnJErckwy<^D0CMLaR3rPG7m|ExS3dE?I!WAB~ZGiBwn3-G_0 z7MP(&y?B_%h97g>y!}A})&|hMAIGoZ>~b+l*R_o48@b|Xf~<)%u)pkJTJEW@ zQeiWz;4ZdVdUjj9T+Z$J z+?k>b9lajPK~nM4-2kkL`LpOgx1_6{rqoi~D<-|(%|v)Ul%~qDwzkH!d)z{OX1l+o zQi)?NiES2D?eXB1mbaWGozetrI$ob&@W5?&M3V?M7P?=YrjWnR#8~+!wNbOH@Qp+f zRdPEu%w@Kv;InbTF&Zq1}6?>{u_q#=mKtAB)SNo2;K{^WARU{ZQ=7vv}A%D_g$$ z1NM8iT#mvwYYyQIl{!PIKf=~Z}12|Z^-$+7tmY(RI_QWOUE8P@rJeY5H(|}}h zfy>qNFVD0|aF(IWo;E}6$n*iT_;u>Jr1sx>=~PKrAX6oCGF2bPLFF}}&IEkK%H0_r z;=RfEf{1Lllje*jub1(HLc|sDp>;(=4CLvV`Murff{<)?@0=Nyzh~rU;Mm?SjXU#k z_}UHq*1__yz2yT2@}9moN?_4GeD~j5O-I9mp>AuNds|J-H1rv{_(I~GRNmKmSk)V@ zK;N81Uxq(8W5hM@T(lowMS!{)TWDV$ecv`dM-PI(!^ac-o}R@&MDT+LWxhwpk=v2| zRDBjCDn1jSkYgCK>*|q@AuY$J@sXX5YHyl>$vsV{!{-shYUi{hn1EF!Wc?O%3Str) z;VFf6aJ`>4ZSU9Rhc}g~t)U{Z7^44F6$~uEC7`M*ov@;GhR$Y%th60S!4wj9^%ly_ zHnyUWF$@d76f_1~M{6V_qR3jIzG9->Q!p73x=^HJdey~2YBS67m+LYW7&#abby9Is zKS~QXXPHzK?iwSN8`fFNUA!Z-Ub_aUK!Qei@ntIHLTFIE{9=oe&Kep4fK>_3s zW3~uB<7Xa5Ge!ScV0N26a9=wAW?0NucOMsgdTQLD00Ey?nihA7&dymyQwYoLh|J`a zX-^Twn=e10aKfds_Hco~$-xT2Gc`Bv15IaqDF7?$$B>XPzkw+S0Tiu0BKySuzD09G zBQd2Qb|ZT(kEJz{*sczeigbq{E8aVnqior*-enCpZLY3T0J4JtE4BM&SF(#J%KIs4KH~zCx0Bv zJ&%x+my}rj4KBeR=OwU8l&=kVKfj@nvtp+APb<>D_&7+{KQAHkklI2>LIuCE>$D;t zCj}?!L_qM@joS+{L!eIn>PjcJR~FU|S^c9^!F1#vNak+>Nt5^sHn$g!n#(;q=S68= zIEX0h^IawtGqtQ@*%38dQBiB?Tm>ubM4A(IUY9YilJ{`YlghzZY}EFd6^3XJibGRX zT~uQF999;ZkYHGLN`aT+#S!32=}Zpi&ZUBcj70DNt{*;VC8k0xF-I@;XH;sAazG(8 z9{V`1fHJEerC?|z#v@xKBb4-64m5b|oE?7aP9w;(DLctQPE8Y21C`jAAt!v@9z`Sf zL%a}CG?M#-l_~U&;7MCxoqjDxoqFR-NEZ;cCkNvtSXWWBOQtL5KwHBQC2 z{k+c7;qO82+I(L-5v$DO(d+Dy8V0Q~oOU6kGYze26!Dw&U7*i>AAwJt9`Me<0|mdm z`v8eM`I}y$@-|cnED2te(sVDk8r%SNh9|>SNqPTAvw!{t@cylo8hM=N%V18n=RN>! zoq?P^bxdTz1k_(C!Nm~f5;<|Yr_VC$rz(EJ*FVTDOBrbUj;PUL0$Fo$DKWRS`~w-V zRy#(}`vML8^wCYJcpb|UTSipt!x9-&n$5l`)l0}Cgcm+27_mv1UFO46k&fhzwMhr+ z;+6}UnTc-gRbVX?71UOa#$<@dFsjVnX+#y&z!aH(-i6LIm-p8d#Pz95Z3C3c+Ewhe zl!GhGRTnfXEBC1@oUQ;-AJHPJ19EYRk5f>{o>52;%N$M0?u5BEvbW3okmUrw$Jz+J z?v6f!Q|-GEJUEk9RdEMeOW%ggwTN`xH@etLinEgZUInx5)N4Zx!!hU;hKaVUmiuz= zxY+Eo2=$F~@gv{4k*Yg|H*b~k4+Q8= z^n!hJS0n%_RKL<7{E%d<6_u6%lGxzpEZM@C3w4~xjMhiW1LV!%A|~1BaT*yI<|y8j z1&yx*%PM&6_(e1RYO^S~NF&6+l)OHJO_LcKU^oexcX7z5NvdG%%mny_;_r7zNKHkx z=Y*%?EieC7j@P3*G{|;#*$x+oinpjUlKpH`Caa-U>}$iWG z=zWF(z~fv(pbkz59+&ou%nRdB`r_4Cm%=zy3?$|WRsG;D!W*@k*GMKZ*k~9lmP}g9 zSe?M>e!P@hjc`ljt$2_^HKGr!Ai8>WwL9re4_SdVO<~rH*B873Qs| zhpeIMRPho^mDOkaH7cIzD_2!Y2l9*W&3+C#awnxR;^a}xJl+TrJWSNy1*7wR$!$&tFryQNO=bK z8J(+$V#5%I`K%StXSH$EGtp`Qn>KpO(C(j|RMRV{Q-4_oHyysmGVt6OU@~-<9yUE* z(p&6tz$VkLwD~PJ(xTTxnE<$gwu#)Es*dk=lFnM`MyIvW3 z=s6nGf73qTGL@iz_IgRFNYVve+c*S6l8-vjQ}a+^ItQnS-`0o3sb*@mJV}MjmF{mZJp7wx?nw*AJZS2N}P24t3DjtAyMW+~}fzMRC z<0tE4(XzPt^H@pofZ^%n zKW;u9tJJlvy+k97$#s&Q?|-&`m>}^Ex{a0P*`eokQxc$R)p)yV&q17jnt1r{X*hp(3)hX?;uB6T0|Li)6w#@jeE zLffv2?+nRTtoVA=m96V4ZfH>%LCeo5vD*n6^rDG^+gg1g?+VVf8F-UpZ>s%{ckYh6 zsWSImbBjz$FWY%nG=5iSc`eJS5oZR6%KxgtDn{ElaWq{&0Qgnb&^o@=$zo#SSa<9K1 zl)8;z(@GruGY*G4_!0!;=8?F@7LkDtTM>jPOYlPj(=r69$pW^Y(h%q-UrMX-m4s(n zB<@fLs6R*v8;c4KWfUJ_rp7VM)V-P6fe|I%eI3kgywVg?2^ML3A_L6Gfz7r(8qhnL zgwTbwTcWy*5%zbrhKw49V)h?LROlUaLfnxTLgUriWI7yn;}jIU1=^B8R1WYD`$2Er zVyE0VzK^NWo9u*O$bJhZj{EOs0!4J22uJ@zkHlQg1l?VKCNWB{GY_3aIs#fX7J3r3 zA?9!+4@d6SvXa;Twp#jI25Tw^Y|luboOZn6T`aRls0!-$C<+Rf$VWZTMc+wL zX>A^)-V6r2vW{dzPtMqC5lO*R@_~s-O0=1C8kzjjR%oiJGip|$abG`Grl8q2*1iVL zckE@0EdaCq@%SLm*<6>swdr@m@#Q}HE7d7@9*jgW)C&!itU$DFa^PXoCPDj?W_a=t zRy>8E!cfYQkJkpbXC3r&P0~(hQN@1^9P0IyO;~KR=q5#P;I2;12Q(`@H)TlYq(CSy z@UFt>S%{I5F)MxTYKZ0BpRdlysSX3T9Q>d@x9Dce=nS;lEJ&{#etga_xG{>yhPE;B zbnr$k5N~AM}&N(xV}GD}@WC$xu&2ZE$tA0|0E3yY|j zWt`{H@`T|iR>Ez|4@Vc_$R~hun<_9_0E3iBstQgIRdz?-8$QXpNfM@=8DC~=(IZ>a zpASj3nT;8k+pi!II{}bKDO3@lq>{HdY)xe(5q3Dan-9UHKZ~L{l|7tJP3-(Qa1S~i z^O_HZ-i3`jrNfN~V&22{5OzemA(I|HP7?MAyk>pq*M-8_>(<)Wn+KETi1Fui06%G- zdAa1^50E$W7O1A@I;6NV=_V7tUWlGp?#<~YKHnVGs@*-e3RYvow^UQ~+!xABEpxg@ zGl5YIcR!t^Fr~OB06orQl2nG0FCx5p`XaT*s2d!}33wUDXQ6CMg^V(6cB5FMdu(dF z879hPSNl2c$ZLR+#|S09MN2#?_;Ik-ad?aw{h_wjV6U9LK6)I#^L9Nglt*~cAa_zz z00xDu-dWXB9|(9Ci_6&&#K$1MbxqsGVpU;>hJq`MalXqA`LBIn!FBYtSl^LBR64)-!m z1L-1!Ft5Vmv!B}REW0CpF^f52jNH>-*@obdg7md1${P!+g@YrEAW|3p-Q=&ucSzd~ zpp9u?)~ZH(a`AP!f70*db}S{G0rit3P#hGr-|l`kheqH>eksUzu~Q*k#=*IYf`-BP5EUdW_GWycLU(dhI=r?RIK)*-nItbZyx}~UwtAz!HL>A@Q!zRqB$UN zIOy1`g+s9M0`(7O>d$GtFr)LMu%8T?03derGh`Bu3n819!h#+w=Lz6;lpko(0t?cL z812!UW!%TopNWpdG219COfsY8>}dnF+!~_=2TE*zTLjCDsja!lk#OUaPK0+^YVuA% z9y^Jc??A}bL3@?BP!xYR?Ukjo9>}r|eEn90 zV}rIV3668=;{N!goO45Bm&33Ggi3Oc8DW=oXOw$%MX5B*q&VbYE7)jDhx*AUXN<&o z1xQIV6LTFA77X~QuNFauBPvzSXdRD>mh4r9t;V3xOuv0xUD z)yOtJm@T&qES+;yYK(@e$#t17F=Cu6$vg@tY7|RCp#NraOH4X3g-75MT%eCd!lw`j z3&yZ6quFf18V))CwmF12vl@G$nAau3n(gm1G7hcICK(nGzG=J4QI##{3D228ykMxi zWg^;Y-g3{i-!kvTcO_<%yA7v08Yv>uZ;hs?s7;YZp*#aLx*4TfJ4IbJnr z{CM*pV}n{m`!~7*Rw^GSUn=eHyno1yIsxy%KCQ-;sS8iJVi&kn$u(Z~tW}XQFKc$iyW%1Sm<0=lmbwt{C=N~ZLOyfX&PYUz28kA<3e&K!Q zMB(%4ac1-tY?SgQ?h55b{$+SKx$_ya`?xJscjs_v+XC3fAWljf;_4Vt^FY%gCq?_9 zPVLzFB#Vtm=&qxm$d68u(A!B+#{~u*OTOto5-=1nEkf|{Bcscz#u{0}$jA$z{!xn^ z1`?dqOF3!fxi@OVyVVt3Dw}@6)pGg7LwN)>Gi=HE6Ql>}{p*e7BHyt_}<_MwXDG3{Md@b`jhQ&=mK4F^W9CeklGXm{aets8}%& zSNS5a0*poQyi$B6P*O{UvleBCMSABwF~j0=hq^~2lQyoA&focig28cZ(+@l{aq`JI%-w5*u?KiXO$Sn4|*^3^+LiS-0|_z-<(k$&B|PI&FELmBsv ziuyZQ`Tu@77qc|M>G9AGTRk7CZiKN7*VLM z?1~*yVr^s~r`7np*0vh#Z*X)t52%F%GKX4)$=IWI2C)m3H`~@XwcCA82R$rBH^9et z%?GR)?Ef;#H{}Y|R0yKUdVJ35`H(Yg!VArWrhrGi0Q(@Q=Yb{>UUxm~4k}^La~T*e zHoi;KE(5Kn0vqy!8S?)zoMd%FT+n+E9>tD{HkbzDo(_TKkd3Q61aWQbj>I@rgd6jS zN-soa4Iw5 zzZ&)`_I)r}`iJ}e3<2Rj{btS>Kc9i0pTv-za%`kocL_Bwt>gPlG9!z}3+}xyL3hBA zf2NFL4W5Me7ulX8&qLGT+@lrO4H=2Kw+j=~gv`X~GwtIa{hN@DscG7&DT9?7S>a6| z804K)F)H*4`4#0HeGZ%H&+45HRn9Ns`k`gQ)F*j(FT!Jkz2%Y!1={K1;v zK!&OMNmL){{RM-AkbzZxrc6O!lbDmVhq8P6;jhgOlO4}TgAIos`ik^&T`kSeY8a-^6A|ZslCjAmFXFLiT0t#-n z`@K3gM6{gaufgWnoR=iWUI_FlyUv&-iYQt6$kuT$?Tj6=oC!#d8fQ(sBK4X9CM=tj zeMUE86fWml2)HFK^@$Y2S0o*$i~nGxd@n`koGAu)L?S{By2KEWJsiApczWYcG)iC5 zR5Q+Ev;~Kc0Kn*x1`URn5P8uO^oet_-im8?P(C|{mPGCD4NRr)msM!-CvPAd!VL{> zC#gcJS#|eqK>Z~q?{??IG|g`MyynF|mYv3^8%O5OWpKWR6SB24E+O$>BWQLjKI_kf zI{&`Wi>38}VF!0m@}V7odi&ak^rRtkgxijbHJ|a=4eKR{AI(v5-G7GTmQS+k3Jrq@ z1V&6{FnEus=|x8$5r+Q}*LMxz1;WbXduA?T?K3W%={GD765k&3YW-(BkThm|3`0=t z|Ez%hWH~;CKqS2GOJ4E;gyuw20FhCa>%>O(b@|3$C$%S~s?w)U3azd;B4ig8lSPgQjEwf9%ezM}h= z=eMu|`1s0?ONr;sx9YulP1DLZoF--L)>#Q@G9YSaSKHVH=bLL+LmTZ`zeh0|jHGZMTn&p+GWJKbNZuRk0AgY{P4@NI24??!Ir%#s06TV65AWxfkj^@dVYNRaMgYKIBxyHM}r?A5v7 zw4oDvH6EjEShMQ{Luh|6RTb_X2)=b}M}|fxj?-q?T7Y)#bn>zo=?%>&s_Y5TD-vr$5;AyTw%z@tVx76a^#j@$>vmWzjh1%mHj>BxX z>o4JjC!J-B6>|Cm=s%UC(X_=>;i}T`>@wqFN=tCBdGndN@N%+j+i|mfmGl3F2uJs= zWwETYEYUIzTg_&V83e+i_1^*P7#a?!kUU0+{_5{=I4!zo8p&;4{RHmcMHr3R3di0r z;^EhzqcFSL6AXADClHFWA&(N$Y#qhm2xr+=`Ho|N+UxFZZ1j))4-anFSjgIS52l9G zbwt`uerW8H!+M!8dI_=}CwBSDF24P~eS-bQtp&UgQ*Eu>x$!a_hyG8#vnc)55%sSN zgSjO7=`RzUo4^FCx`@abwRz7Z_w_z&(@Ox9q*`ZgDy4m;%xn1GSVT9HIo}T@`1Q7d zDJ``(f|JpowcDZ5acITs?6_B?k6xN8nKA?d4mz0{fqs*vCOZtQ!?Z-HTaPEO@yfOF ztW7mW9rg$*lKPr(voA=MLAWJBG{yGiGV4)R&?76<2`~<5hGy+Etr_3FzOv($^MdI& zeT;3Hn`4iZ+mpj7Bw4adpCecq7+V8`?$HW+>9C9^QF4R)?cmjz3*jojc7Yff1Fo7B zZ@Wtrn_8C26@ieI$I&3F5J7D#Ri5Q!_2Jf(6vfqHOI02A${-yuBT^rg;x&Io(yniG z+{drQkLBWF7ZW;giizcMfLt84)BA?WMGPXK!3nhY3QL`pjb2bMVd_WHn16v^H+yP< zpaL>Qne&tJrX%JQ@wl>@AAZXh;A=~=j-SICVOyivNJo>BPGA3o8L0 zG&q}n3tdgSDSTyumbPQFcnpJ>cQ|V`Dq=fW-3V@mB|xcH5+DN8jG`JSxf+r+7rXtd zKe-e$7?o`nxGc16eVc{TEA=lJ0zA{}?9;pM*%jxo#__40UL&pEBR9yo z;%93aIlzu8^O5GT6)>I*NiRgnX{(s@vTk6YL+~>Xquh5n4q@ob&jx@A!yv^lO|bF~ zh0(*UkjdCtE#p13^;9fmbnp%XGDh~R!EOD}<0;nHg{b_7eT;G95($$E9dq(Ouyde; zbM+3@LECX92uebo)ZPu(w!%U6zE&4(4Y%8uIXjJwqBbLKIwj!o|7qgHgGMKWyJUws zZ^d!SiiWSdElWO&O4JCI@5V2H>vfR0oR@UPY84bM4Qh6V%Gd7je@$W-%sc1o%%M;f zJB5Ky6%~FFvE`nZeBG?W_DrAM`KZi14*Ka9hKp?<=8Z6KcR!Hqa2W5t4_KdT zndkH5drvcs@!jqATl?nlB-R#g#+RM@6@qp9`ldfpE>zg`)wp~;UV_$ z?#wn6oQ4=STA;wTHjYf`q0V0(rCuWqDSMPY{<9edpVcu7fS?v#PB!)0tyNYE{tnkS zlrh+j13_*$AP!mn`T2jOeurm?4 z$BfoR>gzM(RR&W{^nncAk&Sr~#?3bd^aYDyqx}f`nM6FM?}mzRkU{{oeju|tUVDqDnH}Gg*Trp8v7W=ifktRcNtN_AwmY!sBbfMEL!3W z#<5dw)zZs*HsmV>fulp5K?zbZp}g7rX;OBZoKap^B$RcYF9B{952TF*9Fartb9M|Ify7eaX7pdpG;hM_Pi3-5^l6yhrm@<2 z_T0P{z!)v5M0q?9iDpKODQTPb!yp;f;@-<9%Rq{6PkI5X`vNT^Kzaef4})stE1THr zR>{eXVkaT;7sPsEN(XriE03`(6W0V2)@}YS`6+7F9{D|1*|}fAMt6?97n!jX>NMmG z1~Okj7AS^lgG}m&;vzB(d;%tz#2)Ov*Y8+XskKkqYdu@h6Sd4w<8~Zz!G|uGG>z}m zGCjJ8ZA?x7qp84jwSeVeBoAPt{0m{|GCNF~Eeb>WjPFAW;8CgW(&QYdnk7XkP zAzqSn)@*suIFJBQMWr#Lqbym?j$8jAj#K1?r4li31 z_+!Y-0Ps0U=6zocNi`6d8cz%`-OZ$4yd8`2FCKVKFJMdV8P!o_p-nA*k&Xs5k_eJ` z71{3YH=0Eu1o)g?e`nQL_1`Y3Oiz%%4E3!6(tX~9vFo7PoG@q%t_jf(g$GB{%B<^9C+)?OHZfL;LYz`Loro7Aua z$G$d`0!?Ttm4YSoe_o=#V&+c;x&F0IurL^tP`BM@KA(lcFHOSw2!%F1e=Q6Jcvy*h zW>8P8P%%QS>N5j9*YU?1$@a8`;ZGQ0!$)^LX+oCWL={tyYJxfW(N&xMAX5u3Ffu*2 zuoyJRuN#w*CCj*+H5d>&fa%#=14%Bh4XTz}Y)h5zA(@no{|uDREY+l-hi||_L6&F_ z8>ed^s)WjMBa~rtvudMh6u){o$wPJP#moIJ7%5IhXmD$i+v2HwR-i>V1ZM`Gb`x~&Ya)n z*bxCwcyT}?voMbUQzaQl9`Q=L8)>)%6(Sp`O^=yQPz zX{|p@WHm+Rh90&iT3nV{h#n3Ppd}f7$yPC53z|R#?Dt)}l=rA;(Oqt&hbA7YW`#!) z9kxpy)a!iTC%!=;(vm0H9ACi)1&zC0@eXG^w7wP)w14P<=q8Qy;hdgEb=R#UtQbG~ zizALE;1wkE!--JOky`d^;BN-scCH&fUUOR>+nOGFKC9Cee;{m@+IS(nICDAezFi$Z z)TzD)zy^KWcz-%RWtZP}OkYlXZ)SeB>mGW7Ppo|F0w-9XX&$1i&;O8h^SWEQG$+37 zdacZBbG>8LAf-EekaO~9hWO)qdXwW>z}iW`vJmK5OcO{v&wbLIZHr(~{u8-BQu~KKZOYbykyKSm8^{VaZYwkr+)x;Wd%z=3| zLYXjYwmDWht&>ae=frMCw%IOh@fa=kNP->lB0mH4l$NjUua(CPK%op!FUikp3hwfk z-`y6-erhGwV$ie*wa*fhqrY4lyTHwzYp4XgzAnL4E*USxL$R(C4N^7+Lu(va3&Z zWj@tF#qFNeoLwUm^YDUy{_%sp=_O>xn(h-E{ugLRcSXJOkiIWBjY58+KTap7D8@wj$bRT#VztI<_CoKK3YM*{(N@j+D=VI?ZpaYAY0L&HQtQ$^fq$J{bQX zi)oq2%DtR}?N##xjN#0FgiE`op z|FgAs{kAu9u#I_{r6ZxsBd&tP!EdMBG9L7g(E0q@hsQm{dOZO$mnN=!)rUlW)>6}Z6j}O zv#f+!GYy~OzY*NX(9t{(+Qq^k6Dfob4E!RC6=p5o7#xY}5Xf7z-E;myMgwlsW`~~0 z?fQ6dHBtkoVQkF7t=QY|o=PzT0^GIYo-!fDv_)w zi^tl4xb|!lW4$K)Xoh5Q=4D!JK7%?^D?cR|oe0;CC?%)s8Pqpk$Y zr$Ir3n^Z3PyMVsZXV$M=`X@$9A@&aMR!$pjkd9RmP5RngW!%>I_sgOBUZSlaBB@aT z$r64p^H8&NwdzX|X+UuUfRhT9_a(40P`EM$|Cu%H3a~!%!Dh1!8O_1KxN{a61NQ+(d_%>wI(ZTNhE{BBbNF1pVUw?4? z+R>8+$OlBi7l1&!QMFi7Cj=Cj-lxX^0LJ7sdmIg_Ix7p6tY1MZG@t~dQLKP7M27QA zF_)Z9kK@AU>HfKWKRE00AuiVNy3;^4BX1u5=jxnPDlmVvpV|&9BTq>EuVDMa&;uR& zR$wC`cmgqvbf-}56U>bVD2lx?5r*Dn#F6}|W1+69EY_F=`=7EJv^w$Xpclj0lh;7+ zID%NV!Bzk%K_SlF^NzFHGl(&(DZqFOhq*mS3aj~9GwptxWJUlDIb%WDdG{%v zWOU;CUX{el=t{L>L@xmYLbh=hKqsJm`P}uv-3E_?8WtKoi_xChpDeM?0mjGz*1d?B z;F7C@I%*CfAVod0f=z;j%*LSs+Zlxt!BT$P{|AFWe7{LRxRN%RUp=7#Si%veL5$cL zh25v2HQ{8FJ{uDOYa!sX;L?K-Q7nosC6JZCog+jSKzd)@0ZiS5jfBSJSadp%L~KZZ zh7{%LG+?yV=~d2gJ7lJdH}ptPg%m?z8zaplt+6T!yg`xxAB-_fdXgw1;L3=`ibQe{H1-U}K8iOF z06T6GK@SkP@k_SBh;b+7F(x<%5DN+-5TE&E=)|JTB-DpUA=n<>?DU4xmZeKYh|r}K zeM*VX#1gGP3Oc>Rxt0nInN^K?Ey!p}>1Yj@X&MF#yTGrjNq0GA1sh*j`XQ^acE<)4grT7SX72%ET}xWS0UTIj`gXiOxP?bvjIbMayUX9p7`us=;>4}I^;|$ zDhZEX7D`4ni&(NNh)ptEWjb1c68ZFJp8G|b&JrAH7!yC-3q!bjPE3`fS#U0(E=-OF z49FPH*Lty<3Be4F^NcTT zO7U6ZoNydTLsTpn%|W_5E<4_u26fOnh0nZ^=7zXxQKKlDyUJ0N=L5@C`UQ#?%2O`J zS`wz37t-3y%^nBSwPe9|V?Mg#Wpl#GtS5L}G;wN`t%Y3`W=UZI7Zxry<}5Fw#tZ;! zIJ{_}2o?k5VY1OfNY4g{$P&vO2eRHQ8s;L6W;zBiQ0timotqN^RnEw4QdPSomsB7s zw`Dp9vq|HEUItn;_5~wH-i|NPSx{NA`(_<7BL=E->_{3k!BW`DxqevH{m(mb|9^cW zegA)JXM1)3e;J=!x&I$)mDOGU+y31C{r{cqPG=*X|9gX|fz|#0C46-E|DUez|F7=< z-{$@QyxiZ!AR;W955#-*X4$?ALkMUdpFmL0;!pv&X@(~}`S;7qg%yC(@28LxAj~aC zi3=eLWpb_itvewc4~6Y|x~I+8^(e>qlA82*W<=I{V8io4{&M>2qc;dc!p=7&S*Yi znSvJ1tGwCnWG|J+TR*~n17kLBH}KOhIDnOpJyLvZ!y=R2LBuUu3<1jtf*`BGke=(% z11DT1!8sF=`ZH1|=@7hWAMz8iF~; zOl1O*1=k`#~4Trm$Q&EbG>1%0LI z6GH3DWZRhb(W_VDsKHETp~%xch+^>im<*(dg_y^~P9jy5G~R0{O)=VFeu+6igsAm` zN9$)u3`tL+hC@OZjp%@J>mgD;-dH2U>MAZun#8@Hy&+NO^vsi=(J_qZA)N{ZK5p^C zE#ZhCLLlq{(L+WhO}?Ti(&lf6OEeP;cx|!0Nfl8Y{bQ)L`)6n3Nb2uN3{IAV4F%Y~0K%hAEAm(_-oC4UE5oaox zXb=mq9)&^OV!clYh_gq~iB3U545Sf%TL;qXP`|DxfLMe-vkEaC2_dmD!yNv;{SB$& z^U`%JzMuUIAQ^>CI@;!1KfZ(`%~P48OsUg3pUev(QK#75dna$>){}zQoGca$mEqM$ z&p9pKltDMe=nhwm>aI9hiEml`U3t=pcbHSEGfr`$*0qhMzABy%$|rlQT6|wB>7)L%3Z*=X(5Y2Je$ND)I3D$fM56& zyYl>k-kD;jSVY(Y=EeYz5i_3&7Mf?VPXY~7?hWN`#T`~58h-kWjCLZAI!?qHLyqqq zzXy->PC6Hh#I6jtvIi3lA-{E!CzL1J4!DYDQzs@=i0uIufxKNga}u+0qrIu&R`#x4 zDaLivj1x>MAwGRPfdwJlR3R%W@bKYQj>HX*+OQHg1W0Ibr66meGTS;!dFr$;liz{T zOjjc92~F`U#M^HG?1Unn^>CPKT|B2t1#El*^L&yX$f+aT5vzK%-1k@Enj+&6kR?a>^R9Nu>0p#VVGYICu577ACfu1zI)ggO`#7M49hw;rX~?gG zE9?iAE}-kJM$$t#a)h<0%1b;!TUfR7OlCse*vl?{6#Lj9h(_8LrtHh!pJ3$#?#NiB z1uoVA320G<8hZx^zkT>=|G0PH{GS6qXyOrs*o3`wZciM%fBWGl3>5Rv6S3;+$*`dsVjuaA zgDXfr(?B>*=w=NlBVofv*cYV9T~Xl4D;DxIR=lv6JDd;LdBsH7G68ky&gejr7}Mm* zd=x{2kJESFC6!jC*yoI#^yQxP>y)#luo;v}xh>Q}dr)XSGbzU$7Ud_!V!ljab8+Mk z*o>3e?@4xKwOq%lMVz>5}wT+{S zE|R=`{8&?2QXx7RQlT`cB-UtrpGpBo+?2q8DTgqH4CpXZLz);t5{x2h!oZ}Lm@or3 zq<0|bh8te?j39R?#*(HR;$X;pWyb(G5i%iTMh#2nt1xZYq^q!S46K`Y>*$Ob)Vw*q zl*F@8GUwC1d$9^yv|`E^*(zpsFFgaun!@rhV7sq48Yp@{ft>}4I#f9HLaICRPkgC5 zg$j#^d+Fnislgc=6QmbBr~dCc%|nNNys3)ZEK`|mi7z@=`QYz{Q^~=PuMhrluy=B* zG|QwIBsXQ)iH`P^&i%4?|UB}qLD$cVD&NM6sHNCtpB8{#*C#=`;{k4n;bG!ERTJc+EDHHEZ3 zc{GAA0)0mX^z};82d>DUZG<(hXiX!BKpv8bM4+)(K;xT|G=fuVc>-xIYwEB%c`_z{ z1=`*e&~{Riwv#hrES4vZRkNm!)+dib_#)7EqNQ)>jokS-dd@t?)9D4-rk!v%1*c`4 za;Z7Nc6Q?{l(-otSOIlRka|Y`snu($_0bV2G?}0GiK*FQ{$UGjEu? z1T88WPkxl_21>?D90vNvj3#=5lQMzsmh=jzH5nd2P)Z1|GdNct#eUW6$|_%h_)^2V`(B zPw{6Iq;?umE}Mz6$NSP$)#HXVKXDG7zKedz^nQQhmKGniz;c`EQ&hlWz=mu^&PQ`{X+CL=6gaGBhC3at-9u?Wr!L-0 zFpjh^j*MZv(ZV=3hS5u4;O_P`U5~viyrIkj?Skmy-c{`}XX)b_SYx%v8S6m6Q4Ulf zbjBOo&N!~1Gmh;#L(RzI4oJ1#%eH;XopEH_8Ao=VQHqhe(Qsrp8d5OsUS}MZ=!{Z~ z)QyJ23RKf!1)Xtt1D%mHY}zN+sZIWaBni=*pWiwdy(F5?GF~Cv(WOlzNMcZ{Fberp zos_1>=dmLgwMAlAIbwFqXEO+C4)+e=f)sg0%rl6^L{`nCU`%G$_^JnjQn;t^;|q+q z^)6ue3phA&^eG@pctM?+=9AdB9z%?!+BgrzGx!;G8V0+7T2aFQO-6P%B*rtEx&9cf z2k+b;1Y>q$9~)C>;Y$Ka@qbvs;+=bea&<>^5iZDoJ%kKueT?8k1d!ed%8?6=+N)SC<& zwMH$8YZOQCp#HP-4b<)*YlWPc)G6 zoH8FVgXH#?df24oJGtE<)U+8pu^Vds*lF=)LFl;SONiZ6`?;13s0?=6L1i|e=<&bt zpehfX1h{ORH<57|s8%g*?b}8j2y$I1M z1utW8r^DeuU5KL^_l01SNDU`TYYtxu;l|FA+o%8f@H*Rm{oi#}5V@rGRpjZa?&nvH z4?lJF5Ay5Nb46X{!~Dv4WT&fplwX$}h3RVd@@vCUldkHU{Hl14qpN$8U-#$0AL^?9 zT$iOMv84q;JZ6HJJc=ceI@Ppi9&UX#>g{^VsjtXVUtvYl*pmqA79CJGMYqnbs~u)ip7OH37|0*Tff% zmmvHhOZmj2AYCLOkf5Jg2rJ3eixHtf=S8NYIl*GMC+b*~MEO*0&lX-ak@(3t0D+9J zd3IKrcXT?-cy5D3Fn<`QB9C`RGaO7pG%@W4x{|zsSWTK+E8GWOK<81CIzf0G9{~Kj z)`UGn#T%uQP+GcghI8^EV*zuLnZb%F0_9_G@;N%AG2An^!W5J$#!A^@5am39reQ$B)IG zZeqhrHQ4sHpKNbKiCw4uDc&D}>w^A-g$T!4K*SBolfJ7TGhH7a2?@$LF0WO@q+xp6 zvo`0)K5%4{ zNCmP*=!JH!T+qwCM z`YshbZpK66i52AWl~{2SIM7I37#K8cAy+RcYz7(Vp*c{=RV)wYkvUA!H!BZh&m5%e z43!7;jX6-k0ZB5WIM8lxA9f4+uw&DQ-GV+;0xjsnZb2U^VdnQ?x1bM|AdC92ThNC} zpo%^;$&0|}q2xx0VnSj!1;|_Osf5luu~~z;4um}&X*EvN6tPnq@fE@*2Nya6Z-$|- z1gK#do zFsT#7`xzS!x(S<029I>AGL?BZ$J*DZY4J+3UYT=Sii~hk|8o>eSdx{>ALZu|c73GRd%+14LPR!PI}|d91@TZ)6|fbo!f8y7}_VW4nqxk_wYpKV%7H zgp4w796{zYwg2MP{&YTrq%U~X;KtH~jy9;MS;CVz?ghrnk%XKN6xmnx%%eUz1%|8( zFUJ1l3*UUYZt(}WDRk}N{sKOLExGFg8D~(Ag4sJt%KK@9iZ(+|UjK2HC1Iu+0PMNU zOGHWi3Xm&aAG&HC;D~8fFwLI0(2H;VCTdLF#}Sqhxa+7`fX1L`?jLz6p5Z2SdJ1B7 zaT=c$o2iGq(VkuTt;fS$vUAL@Co#zNf7ifvv!NhA(OdAYJ&Wj#P=z(Iz;z+P||QolSU)TbDcZ@U4B5yDjXzBDuhSb z6=GT&q&9z2#wy*q%G#y*uE{BzLgiXxRviT6h2+j#;aP$w>mfrrc>Z( zFrs}`Kdxh}DGz3ac}NfRYv}{TS{Wh)JE+rCJN{^nDnyZIyJTs37xJyq+;ViPpLpJo z9%k}gDrzssqe+B=k}nM$HYN;44IgvqSSQ80(WKI0f5<*%T2iO%us1Ovc$J;VcC?LdUu*9_#8F9<*P!vN>ir0>Km5Cy zHG^IlUWzW&JiDVTw!Pm>Sx!X_A6PUjT^kl#KWM5ft|Al;El@}<^@{BuHZx{gQR7Dz zjmP(G#kP-{Y16K#>7GT?!Zld2@m@1)5EeE6#-e$CPgQLDO*3Uf7Bzfg(Qtf)RBZXA znYKHNnm(pY(;q*JKRz*}&`B8-4{9K=*d8o&FLl4#Td9X0gm%$yQ?;Gs0G&oBMn5cY zM?wt?+Z;4~DaO&K%2oEytG}p&cNM@C(w3UJ7~r8J>=+=}TCXNe8%)PDW#54Lx-T5J zHW36fr32EU+WjK4vMyLBE8H0px2h;k9Vu@|AunUsk{4{s$EPZfCO)a)E>gTt#Scb7 zz&5DJ#M^1T+Kc4nCVQFL)9TByFXGz!toDO+=1QqH%zLWZ2S&BW@qV71;Y!v|6!poF?eV@4&}I!_iDVhGPBV)q<}$=^ z)HJAA`w2j47&Piy0fGOLZGt#Vf0CkBO1sK|%*W#wN>6Y+TnD(sFcsaUGeP~5fWg## zAia$s1RiX&0G$wf{C95_I1s~f$l9Uj2h10n%sq*Rxa!7%>%7gmZ=k}wg-!+p@!1vP zh_PSOH#u@NC*&Ir(5qRPT2%K96h2&GLx15wy@)4&Qb{CGbgTZ9RR0w!#4c7-8d!4bycAj>zhieQ0ph3Wuh6z=h+rM^ zJnfe%)Kd2fy=NWy=k7SO5daawX&wc303zN$PcP&zQS32sRJ2(GY1-9S&@YBhUEvEn$b$u=ZcA^I+l|LR1u)I`G3S>`1ILf;|LQMOR@Xn*j zK?YxFd}luyKZ!4gC>ao;IHcJm$dDX*;1Z2nm=o!cGCu5vV?WsgR`z_g6(mIQH4XB9 zDy<0ERuI(zEDXGQ^otP#p!5mwL%)5OZZZ+H^qbf=+1>4=Z2L^nWcN-q^kG@=$nv^( za{B(`>*fn5Z3w~|TrPX8FME_Od!#RWm@a#$FT0;EyRR>MkS=?mFME%BXbx1Ew#$M4_$ zUEYjK-W?sk-xDhyiZ2h}|FnPnTHZiS-tPbFRD5?JzB~AF@1wjKmApIo@%=}!$$v{g z-@iY8z4y*;8z@f@qpSp`Z#f7qC>bv+Di;Xw46_>zU~WjHqttzcI9WIh3&{aJB?%xf zR98Y`^q7p;v;1M&4W0U$Gm}f{Zk}O=+S^?6GiQt$obB$`kK;4u9M2p+v(kHqvl;Af zi8E^-?$60HDY3KoTNq0$eh)%R?xIEk=8bV&^fHT+g|e#Pq<#VS5v6IDx`i+Z)F)k> z0rMjQDbAm1uDjerXIS&Fc7K;AT)pDS%*{np@;mQxkLwbRy$8+9)3YdAX`2yhL5+AL zE-P^2(OcRqCV5`)|?+9oE2Z3vaBSuBT<=vb<~E`6hsc( z*=JshSXrMw^`H(h!#up*>X6?cWUyKMsrMq@ZxO;3DTb*)g!Zs}FX2R7{Bi1}JpZ^| z1tIU8-3WlT&tt~|LYc%Wh zbe3nJq%MFmBo2fJqKs8m-R})p-G z&F#N9Tgza;9Ngm_=P&;H*0as^ZEd-t_xJQuW&h(*w4#mj{lB%by|e27Wqc~{|6ukx zEd%BIf4j4_8vjfAwAb2ee*z`%xe`)={(b?#%=KrO9?u7o| z?qv0UXQls_@mY%g7Yg4ty{nJ>S?T|k{=a?wudx5OSNeY$pJnU+aO#a$lfd2itn~j% z|KGO$?{;@q`#-nzxfT6?LjE~OB266x7v9YM?41%IVH=>_Hdp>UpIg`e+ntS#&22&d zZ=n9)?Eb}BUj_sIo?$~kX(HZ!g%-FZE zO{zi7V}IaHFwfp($Q;-ArtX0JVQ*T_&nz=vx4rH(pg@hi0(U0@;wqTOAtR_;4a9AO zu=pPOZGxi_cu|ghjP4z~^f4%aiSsW8Bj{r=I`F-mUUByrR?u-HhBSW8qG|P>!KF^qk z5JBT|=7aAOBuN-Wmk@;!f-w5vV%48V64N-2gmke$fR_nsdnZosq~`4Jo%Bvx0OXh6 z>5uP!I(5*6>)mPZ^@;QTqjT{7-C^&v_x>IEb>!^5`42pUJPCQd^uEyaHG0BDiW(=M=E_G?j&;<>xJ$y*` z`~?6JPPbD^qMc}zHcS#P9zG;ULi{jLD{Vh$_uj{Tyf378fM0v&jmF*}YNJ<7&U@<7 zA{UrP{&NT2R5l*-K4kek(*SX981Vg&^k(yN0BtGU<@9c^uEB1^tV5S+d<6Mi2Dkth%b8j!~(jcO)%(t4rry=3tY;y z*TAg9$olz|klv*C1VOZzPq06^2nMvF0VcE{$X+?&7k|pwz=?_HWVtme5dmH)VHu7w zof8B=1Hhi>fJ_635+jSj#**%5VlHu3(JL0O|BKcE${odxR3j!2+FZ18>jSeO1a$8si`Q$tUzHT#AIeQcZ`+9>8abTH^aN zA)>(3SI4Zv5#=OfK4do`IeG|cM9ixZ!eKX&9qyA&TL}~58DI?TKLZ<&j8OQn>%Za% z4wJDV^$;f$Cx7QpUjLVUdB>l8 z7|%oY74-=JJ|9Q^bbQ5r9{LwP8)?*}ksJRo13eR6y`Q1YC%^0w3-l|C-J6~L+2i=K zzFhZcK0$SohB)>o9$0i7+h90nbkOc2>z6ApN_2Z849G~prHu!Z0KYrX_nIg#kPgHD zOp)0qJ(p^42r(8$zQ;T4&>OIC`(AYEc@vI@8~D@v<&iil8cheU z>V-~hZlaTY(uA`MN;&izwNrNOjisM-aVCCE!?e&hZJYvI0)h}zf!*j3Djm@5Kcr_G zNl{y%T5J`I6&32j>x%I&0l5qjpMEVM%FhLxdd08xu2hAUH{nPh&f3{Mk~T14p$Llve%g3HQKHG-)h`P9@@4t^nx zXm#V?2&fj_w=~3}gzn#2%_G+ztJ@~HMQY^WHtgRZ6$m{0#lHU6mjLFg|#qgcH`6g4( zsx+F{)=W?vU3#oV+$v>98ZZr-L1-rbBE^go^x?NotJ~TrLpIhcM=Ni+QaVMT592th zi0>|svuH|_-B1NM)ect<@gc@&Ks>_;_MU*Al9GwXKr~41U80M1Q0*+Z99})Dl^t&d zRO!XVk|+a!*Xlih?DY5B$%l`f&Feo3Ei;K+I-T0`VK0Vk_OUrisR~~1!V$w!H{Nz+|?mv z77gtlso%oljGHvUO= z+{qHk?GJ`tT|sCK-_+E|!AJnKFfvT1(M(CW5hJ+q=!NrfbU<*lXh@GW16z_V9Tg^Z z%a$+DCQXf=P;}z|(sus0Rx2-o<=CN-$4PRkxR5jg97@A`ejW?G*fSOmS}h|SdR|EF zmzXI4a6rVIOgMm(3AG3U9u8OAgq zB4&BZS#NiS`GpSh3*~F%?7rO0y~Lw_&9u6b-p{m1Uk^L zRiOar_z#S_t~6LD(9O6C^1cCm^;Ui8jq2Bw9Na1T;gvHc)f%|(W!nBH0t*tbjeaFq zjN4H_m6_ozU2S_-3?O}4E6a3J{RX-cp_cDSBB`yq|DP}8b0j8DYVWVOnh@FIUprRx z-UzjfR!er+vM*~>uKxR^>t|me)`mDIo+1C z@oUTZwApgDTFy3n-Dx>bTh6mz$#@OQs)rkGeqj~~;BJIlx51(+_(H~?g;L$DoZwA6 za_HnB5ObHNhcXl?%oxy+*R5D%T4~A~nHNgW3Pr@(%>j36&LcvICQ7UR`OL3hS7fSv zA|P81f%xlEEwZ^F#Lk) z4Ui5%1;bCZQjMzERM_lNdi_cHO&rl>(1`w|5%b*yO(T4U?&j>@Brgw2NKkTQ)Mj~Y z2_PmFDwH{b=6hN4E)t|Dp&+0g^^S(zMw6cn9Ple4cvF;LWq^Z$CmpBVcD9|qH*i^a zdX`5o4pJ}2ooDwu@zM#sU=oBZt60cd1D|#l2A^N7jAXOqSc-9XCLFBnv;)b&yFd= zn8c;5j*8ty&1{pv;-Ev-1Y;Y)Jx4zYZ}aw#`_f&Wg?I_awv?GXyHGwq$-olbEwd!h zbKoq6r!zQ}5N<@a2U(6Q5YchH6e4A`Js#{)mMq8$c0{-cFBas1gh8G}jfAUUiyldg zDDx0x>Cu@uNgEAMu@Up}sca-UL>S4(5u^M<2XP^Fsj^x!n7*Isx**}S*%XTX4|f;^ zp|&6AMG{-#;MEQtonV(5-N2DV@!5`Yy;N4HxfHb9DmF|@C(FX0jr2cMr^h;N(}@Pm z$0>QHb5K`shaibE(ZGAv8{1oz&yow={~78$vEOvIK%R zp964d8Nv;Ia846=(kBa-!5Q5B59Tw+i~T)Hu$MBFahJheoV{8nF;lemVx0ClKGC4< zl1hLu``H(MR*tQM8Tl@-2jF&e-^2W8kUN>INhd?b`~)$cEV4?>bcnqRE-6AN75yMO zlP$PJ0)>gMFCv-k2=1y)*p6RRJ~Len75x&cv?CNUel@BYgU%_UZZg+W*_#ZjHC4a~ zbY-h#ShC2xWx|QO$^o3WQ!?=<<-i>mftxU2Y$t9u+g31da}xkMphCN-l8Kw)l%BcM z6J-4R_UG=DQBetI7IQb9_e4>>A)_bXNZ{c0HUjkUjT#AvV6KgjDq&$F#NmU=+-821 zXgie})o*u~+QPQGZSY8#ixfJpBHRkE)0m3VBSC^psqa_I%sxlC$TZgCs^^9cszuN= zvK-OSS5+CjfW;4WxBk4|XO}pnYZW?uqq#(};AM@Xs~NSNxm|c$+Pak)P%-5Tk=)NE zxxWC(orGXAQSFV#{O~k%!T<~#i1s%OsHp=%8S$Q+d+A=46?8nP#(FiPprw(_ zQBbe>gW{CD(|mr4;aQSL8^@}vS(@Wo#UNe}>~`ob~DYDYilwm9Ykr_v(); zy$4+kF2(aw?8sM8zxdG^o3TIQeNm#Zz5$C)K74%A>2`NIrhR-G&;0Gvk3YTs0X@i` zqXU`d+L^%xs}i@H@};*d2}gU!CxtYS=M~aW08P`69>i6wYMLPm_J=>~6a#+ign0K3 zPA?_NWgLdEEI2TX)ii2pK>!NYphZjyO>S{2Nz?LCGYBryAw_=!N_3+_8o*N5}l|nX$Inoo_3>ATNaOd*DC6~|VN)$J{*_JoEE#HUjY0IkhnDKM+%Q9n{?+129Ee8n0@)> z%$xiK(ajF#VHBM6*tK9H{Or!$*=OxMlM_*a{T1#7f&B&Ugs=e@5vX3o<4Q;F7cb(GD+nc<>*StY_Zlk zT&APQYu9_(`PVd}5tRhzoRlW`;kjC)sS*`xH)TX6V}fQvB=L&pWrh>8(#W!`MV2M1 z?I5y<(6BcfDamjzAs=2@+|x9)>VtZ-4Y8#6qDDtW5-C+BMMdCB6XdqO>vOG^?qyhw z*5aU6nb*METHl?iI+E0aHE8S^uS(Dy6yF03;t1#q0RPs4nbw_Xf6QTR0Bdvvc5m|qbrR3*xlHAmJ|7r zXu6Rc$BslljFDfcp5yH8? zHi&DA@rqK>iwfuNZhXps@!=+9P0E&KxcF5BqWfh_5XJ)0qnn0oRaip&;)=|$SFZte?RBji zOcY+Z7B{S0+_0o^)4Ih?&ElzC`;Z;R8Ux?GIo z%M00dTabm5E!JoN6K)HN(ddo3pt2rl;f#`*!hn_GX~xtzIR5hKMtMY+@rJpHPcw$2gkY4c=t#-fqX|Kklx{`G5g3aaWig0~J1K^n7k_PW>&%RWWNF^O zy-tJP3~N-px@P`80sR=IcSdb1_{?lkQ-mF@`7 zj1Vo$wawy<;OEcp zKtl;evx;|vyLohVx*IAi;juMPcC|d3UD1o!66j5xvCrW?fCB^CA8=QD;6{TphiaF& z*ODF&J+CRYg1U)31i%N7hlPlVkh~m6-hmrNF$C7o4fK9uP^zvgxz%1*Dg>7&11kJF z_5gGHzrI-n_;v(9A7JmeRAfEa_H0Gk>KByDbPZqsHvWZ;%;*(6G_ z)(jzSL#sE@p1Qd%@b(56tMAPb5J>(kkH!vdbgN{e3sSm%Oxh&>E|JbHXtG12p9g@J6?2sxEVOE*nY@?YLWMd7m z3~A6|tbAUxl8B{fr>(n;bIz2by{)dFa&~WN&e^@mNvE)F_H~JR5-DElgtvPmGhPmP z8_S+xcW-5e-My(PR@0NL(eCo+_1&@)`$B}`yuN!6CidN%n%Q^n-_*WaJWt*!GPaCR zzI#*q-^;HiUzMKOtC?P3+05*V&aSV@O|FY+WMJ(w*UB&hyed7{EvAfVn`LLZMJXk- z&a36GCSR4EbV`s})vWXCh9;eqDBrP#m=5PVtHHI?jsecMGg0QuIpvp=ugWhcE1Gny z){~ViWnbOOa`IKl<>aC>Udh$ug1w4NUGj4BRr%#)1ygMK)#QS#Wvy;3bvd~S6Z`U) zldnoICl_SyO_EuqF>zB%*tD9sW7Dt}={q_%>#d19i?ZIFc>UjkECJDlJA*_48(W$@ z3OoVZE)n0YvSJ3%s}?m5Q>PBL097G`zZS-wA|=lDxZ^~F9Ve9naz~fJx>1|XAg^3> z1yt96`bWK_G?KizIZ<)v^w}sv zyClwj#W?#6XS^2Vj3}>1#k?Ms#CudR-Xn(hI3V`r7|>o{9~Yrbij+iqTrt{XhIXmE z#Jjuc?7YTVf~&*4pQGi}tFPVrxMbYDv+FPIlFvVQ;arfa_io9{u>r<+j_uThl!SZORIMiO59XRzcUN%OGTH#| zJJty_oAoX=(C#pvLdIpz+B%?IXY!(ZduK%^pCAicczLMDGNYmaU)}}2>$mdXmG=yI zbW4urkF2)l7QWr|Xqm_J*j%Ztxhg!;9xeI2yvrIbyERvVPuio>dvl9Br9HY?S7_LZ z8xUx2%R1wQ(=tl0R`uWw9FWy!CSC|vw2X-=g z#SxHi-RVo}_{igSy>g%$L+nR4JcA;ysLvO?X;0@-qeg*B$?WhU0`LC;{%f~F+pFEc;*L#8_-Gumls5cR6h2@=p|?Vn5S;V=y&2P+R`{|yTf5a zWIHBb$Csvj9f#UQKS8;%jy7MNz^!K|ldAc>5bFpxX5M*l;Srn#?$kcZncPv?lteto zgSb%ftgVp;-fZ9#4GW$|xWz#RaxfDziIJy6cO_|cmYIwJCb^e#(*>kScDQ`x7=Xp8Rd?sxrutzevn-k?yH5X9beI`$lw zs}20w=m@X+ed!eqvPHnBvKhOzmg}nD5o}xiKE4wjQdGT4>ZW`21?BC}-pn6e(LC_b zF#@*+5N~S;G(>^Z=Y2+=L_sV^EDTt`Pq1u%4sg#2%A5unQD&I-DG`7bWk*SzOSFqZ z-lyXtf6!50ocQPd*qu2Mk#U;IE*7SwG{BO3_1QBx*@%4O>J`8!<}k4o-(n z!!fIk+O1Z{FFvalYyVw^_P5cYWo*Hl(*0JmmR9+H7|*pKR+YyEkGuLy7bRH415m2N z59XNp-Q&mI<4RFDE{{Wdee^gvFsTR+NTy(MWHfx7?5I?O$qr@*)29x@dx)f-pOoqK_0=GX;Owy4D*S1p&71REW%LALnlh&8%ZB?bAwbhFg)yK37nIf} zKJ+jAq4(Rl|J575Ll2HqaNy9H$sgP+G7yLVbf#>j!XGr^r72Iuj_dTRVD6l`unu>I zureP7Gq$U8=1x9)uyNu9v!OS0MzFsU@dWLJ*yj&5`BxjY#%bd}?uFYP6Buni_u@O2 z&1_1sqRj7!Ng0}J+v|t57}=Ts`7EMo<7omk*ocF@n*(<|XiQr*3DU_v)^2r&bjMCx zaNo4xk!it0(}HhI3--i<`DB|?ZA!E$&88%qQfy4{{#uIp+v{e%Zd2{ZuG*npwKsOv zdirVwvSYZYBJmLk7l+m%NGBRnpCl)MJMn+Vd5^YMeDaoc3 z8xx!w3~#8=81%YLwX`yNW2cPX*eN4JB-6@Bs8&W9nR3#Ok#>BvW1}4x^Oz_pqX`_O z7b_!D+e8%=7dv9bjP#JH8Zy;F6um+nWI(JLt%jr;Qff%3A)P7F@9i6QvPG@5;_2Bb zo}QiJ>DeisgtRhx$B>OyT(o1N9S`kTn8QKY0t(N9S)taEf7e=_lEP_FB`ujyrL0&& zow70sb;=4PBd3fsnlPnu2D!#Eqh*|1H^HCfyBucE@OaG6i#rO-kMZDi0!1Z^bHLIBIlUwQGfkUk6HvyeR_ zex=E`5i=V(vl28bNwX3)8(FguHVbL95jPuovk^E>POgLC>L}FkDD*KNrgfgK7axlm z7d|<8nM0J@I zJcL{`TzzaNkY>_w7V*-%19}*l5K?J0{xk(2j*U z94vkGE5ovqPAlQGlTAC(w3AFL!L*S}8?m&KN-LqXl1W3}r5Rx-es=O_DS(y|Xeokr zGH4})R#IpuhIVpjCx{7Ia8x{<`4?{F(L>?{$Ol^GpU#v=-xIFiwqPL)zr8`^4L^F} zd>l3L*fuhm>uxXM>cg7xYvYh9YMIC zgn7KE`k6N#2X*JMQ@;#m<6&KK;lGAu@O7=StN&&|sipVUi_U@}jTslx9-Vp7d^Ra0 ziU9isnrNs385E-cE;4_gd0vFERd0gGObd1tCv-wjQu0+4BP#g%rYJ7o!b9eFM4mBP z!xoX}$Uk?-XxU@j%FAFrCSpDrUpe#8BVRl=xcBG&c<9Yahyt+438zrGK-^iWo0pD~ z4K0af8%CVku;)^#Bq~AwKSVnMO0E(a`rf^%&MFCB$6UAmm_kyK;IdaYL_$gMg(N)I z^n`oET~QW(u0TD`?-JJ3&324cBl%PnQM3$#O17ajZQlBml2I_9R2l_yy>u|8&EqH4 zM#1cs59kB|E1y&y1+!}#1@lSOQ81r$Y{FnZsWc4clk#yepHv$M^NB?u%qLX`!hB*C z3G+$SkuaZB7jg25Dz4m<>OvysfilOl(|lqY&GAXMI^1(W=~R(1o;d^R#zWMq1379$ zp~|3*1<*{^X8D7kIVctD+KDm zliSsynF}i44qaWgGQ4c{1TW@n8{DojEqP>I^3b^C8{?8asboI!#C@xui=*~+TX@tFFa4%68<{R6#ZQIF-jT76pbz(dJ*tTukwoi0oJCpaFsi}LX z=GOhtwLbN#?&{imcdhlT-$Pxv;;lR`LT@VG$$U1FjEia~+seIOzVA3BHYNm8bza-m$p=_fP&e=}Pa6~)E?l9m4bJZ*j=OW}5! zi}6GZG-t_X*2U7P#~|7NObl4Ul_7r|QI<+SNdK*D)XgG2k(Qfs(R5To&Pwl@J~^?F zT9h+)PC+w~w}s4TUX&ZXoK){-M1^rqftmQMBuu05aD7 zO)0Y0^GyIbnf<0@dF|UKfPywK`uJil`s`?eAijQeY!rN4RPU(DNVc7$;8iM>w`#$K zVMK$ybn<2K#4&3D7@>4sJ{YDnQ$85tM4iF+yJ~Nr@|+?Ioi%~xDqmC0>qv(gW2;$! z&-&d;M)OKmvso3pKJ1#-m&dC&9{>z#cr@zRG%mPd_*g=DMY0n6U`_@=zhqV7L)9OO zqC?dmjKW7X7`Oz)6B#lo^pmxuSxb3Q$cl}9(u&>LW>HJ7MpL{Juvg7)UCnJhtzq4R zQP=$7`0(rz3H@`LkWNn$K%2%SZ#Y61n}v%qsv=goUl&0!(nnC_){x>9z(G~Vi zVOvkCTeoOAFK3j$^3nTm(GL!Sj$fHsB6C!yrtG!pX#&U6rT})^j5Kf2rRYezN9dZ5 z%IHOHUo9u)we3n?8|-NdO3+zZI_&9--dB`=LdkoJlhu@lc8^x$az^Ef?DUV#jIjfD zRyEirOkMMbR#a{C!v;)k@r71oP4&?ROilGxhBNClrZsYNijp^RbE>j8b90J{ws12* z)mo`JMa|j}Ah|>s2RZmk<6QiD_M+dKL$IQiISiQ>3LYm5OOS!#W2{w2i7`dFnQWy} zAZN)zzMgDk9Qgd5Vf3}4(x}&3?q;HXIajlR+iAt`+YGW^e^7)^dii28D$dJr%v}Fb z&XI6Js@(gsw@|l-%&1|*UKc37F;;Yzqfw`bi>>tk_>*+7V#8A^XFhe!w6e4vs=$^E zuF%r7H3>J-!i8R*upm{D-(X&djdQbUIy53cmB|%HbrhgjjzYwPhb6cT6rVU5F45A$?ygr6x4%eEAWpP2B~zs>jF#oL z9F^o1*r=b6jq;SG^Nsvaud*$OjEussHxl<6Q-x2rB97F{M_?gZiT*9B3{TBYwiG{; zeER$Z&%0jmTkH1W0!?97{=Y%wC%^HSI4#2l^L%WW8{O2t!Rw+v_L@{!-?@v-M5$(V zlTU+|>E9$ZTH4$yEzMV1Nm|m}P@ATM0({g<4~tO|UWAhNdV9)9vt^csHhb#m_mqX7 z5c}?SXE7$rtEbhlkeHMbJ#}b&wy1-hmR+;~T~VB+6s9(#=)V)DAq4c%pXz zjzg*bl;r0xa)0g6H4d2NB&VXQMj;oDRp%u~SHs*+g_wp@?wf@UW?aB{wr5JqG|Bme zz!jW-z+}Uq(j5)ZaNbO@X7H7}ouUUW&g6!Dg$O=KPv=+zW^(=}?YhLRR%G+jvjqI< z(5v)%x>%dZu~wVS`FDw5`JqaEwhM7~azH{EQ?C4W9{|7^u(pB~V#igJ3fP{Kf(Trn z@*HjWL?T<|!ADo1&Dx_)=Vbj*Q;c6)o<6}fqFUB`w70KJ^)!RmjL(&a4Z-Iq_;eY=#| z?X$dQ(~|W`gynrzUarB-{? zUH-X$>3ekuf!0u-ev;$e+9G)tVG zOvd7#EXJv`s^mCD$3c)E^uFR+xUabW& z#Q9mEW}b(&NUVQYeyXnkC=+J zd*pqX&w4MuGnEO~RRaU0`Pt@vS197Y)FmaydNf=K zC{~ML-U_=gDwjBolT>qLiZScw-l4jj6-0HD4boitQ4=n6#R?9%N4Es)KCp-2g8%ql z8gcLCYfz7!r`y2+@AT8 zi9+YEF?D|rBm-bs9DvuUcSSsJi4=E`L2zlJZso_J=HH1EkXZaf#o}TkhID?`tV>8o zG$iUDE)Y@#OSM!A3~h4ZY%XEAwR*5kQeL*W)4gL5r)qq_B17E{8r21gT-JfYlDa( zl`crr9|hKN7cdJ?{q1||bmg_=(E=(sOJ_x)1`Uyug&1>2LRa~?cLw#A`YHeBZYf03KP;5N@Pj1Ceyk6!gbql>irG;AS(iOIQ`j%y=!8FD1uw zP0|Q|K??B#)v_hRCFHk*70F1+4f}NykYtQ7K$8OB- zCw>g(=Sv4Qm_Q+5!vS+p8He#4js4wbXB18Q+-2PV0Fyx{=ijPC2rk^McHPXRy~^J8sTWSvj1=w8SNh*y^!XfvZdWHp3=PY(KIil|~Eu zKDW;WGYT7H@140bNd3c0{ucBV$ALe#DkGz$Gkw`)C&DEoJ`!98?SEsa8;yzG^0N77 zOTzwEfIf(yh$D1a$_S0@n2U%-99{<=nm~{``cz#NX(497Y|TC-<2?Cn`8n)!pCDjRPvtfFt@g*~#W4$-g&wGdPC7QP@ft<_sWi6- zeeg>#YfbCjtI=LJc}-ZXJ2M}!T0VoQjNFS zu4_Wa_0)>T(PUZ~14+I8?QlexV9+?DpNlw!6-!SuHIvbm%ZijgGp(>kn#llHevW6| zoT!YC2$7EB-rhhU9ytVGdKBaqb*-c4G2)CQfV-_$sQB&v#MO@r7=!<%Y+>1BvB};7 zG=^shaAL?$2ym}13=kO>@Sj1zEC?tvc^r&FBNOC5Zfg}1CCLkuxwIe^nnT6Z%p@AON;|JJ3x0$o@{KREL}+}S0*f75lXAVt96z??I=@SR~LDE=m&ER zX53}Vl49;0Ar3#mtSPzcw!Y2F{$U89FaJ$*3|HL*Df&+FvUvRr8PxC8mTdcvqNq%b z@-p6EN`;d|$vyJt%RqnDCOns#Aj%e8BkuA_cr2P9Clp6>7C|3TY*`UAG45%>`GRpG z;-}im_`ab}gqnP!#@4Kf>veAXwYB_Cygw6$1A=K|XiYfyr7ReRt4zAVAr`B)SmLL+ zSOh1Y6~)kf8#3C(LW8krE4JDzypN_`hh3lbRzZEe#q}4T|F0NQV8kdJuj^dv;?sP( zpmvUk_m@vPjoh+UN?g*PovuIC>=kodl!u#vZc|;@5DZbS;IgC~d^$#8^fq1f0x-t~ zRnU=Lu7fG-_b0nX;NJ8;x)`ic+N%v*>lgIRWcaV70m~*0c|W>xyYTUB`PR;Q$LVi| zm~QUNbMrX?{wdbKR1M$mUSa{?(L^39f1|~3Gfm|y(5;by#Z_kmO_};+*$$3Yj_I&P%2EwsMPo#vYR=ae z^(gzGPfhEjmQ$LW6j!#uL{kP~Skn!;1*g~Va!1-0aon{J1v@!_#Xl07$M>e#^#X}R zA!39}*-u*_mSsXW^(PLhdvC;br^3%Q>);@;GV0iNlek6SV*E;%uUp=hWk#M>o}Qj& zP&|@s$Fv0g;B)qc7c=$Cig@UGJLg2>6v|sK*~ZuzXtlReKr#J|Gyj8?bIah>mKm|T zLK4@f&uTOOWTwZKi_JI`6rsMIaP9PLLwh9Rg1u$QKo&UnB{zx?Vo)JYVI28cFg(IU`4x_1Fdng>QG8}bdCJUl~c%`nORX?pSwq8xDebr zKkWHF2&7AvI&q~#JXfzlla4#c430zHMG9Y5DNn_s?hZsQN}Xun3XI+NKSG->=0u-g!gOEi#O|;Iuqy1kiL;Tno9qkQv>LYchTxz2*Oejw17KGgf`UyugS{n6R>N0`p+`#j>qC zk{hIBdSbn6y_--6c zLBe>6-d9p#p*gE)xC5OhN5p!ILAXLt*mcO z9SPL>g980&ind%}J5f0QDqwqDTWbh@d&FCD$U9@F8-0lAkjqLLEwJV}tm8Bo8)TIr z(Z{-My}>NyuUn4VyYS1})BHQ$Y>>fiUKZ&@k*#W&#D<7D_G3HS`4L|?N0%V)gLJ!* zCv^q8MpOUrKa^~*JmRY92X~=X)EZlML*J0l1GAoMCTsX>I#DPb%nf2D!wE~ z)mhKMkSa3`y%9_-rSi<1ZaPrJ{fFqk5VvSJXA!ClIItz?mPD}uq!vEBrgddJ4I&0g z$Gy28npf6Itf}bUTazRky*stI&*08s9l+VSh}_&$%hJ9l;_W-SlBemzL#3K8mLsR2 z$_w~nTA@pjk4_5=Y`Sx(eaK>fu?R=<-8E4)r>!;J^dvlIL&^HsyPP)kd3p}`g}ylA`Axlj$=fH0-dfV_Fb#keo@bzZsGJZ zg9r0Y<{jRKs+9zDIvy3L+sk=hDhO5^m$oh}mg~i=Dh$pk_(%NtD^J$8!3u*K0F4t1VGrDPY^V%$Dv%-(lQ1hEF^vi?$Cl>-_ zRx6gSie@WbUIpt8J&PrQ<$R6L)$Q$ZAHJ{rdmX@$Zey*#-gZ9-sOwIS=ZRPs)}1t| zw!ZG5U5@VfR)o8@qf-+-_nbzt7pz&GsBK#&oeb_(@>xNlb8fv;#yHTC=sa}^TKQEn zo%IFv zFuz^GcjU4?dj}WayZyr?d3W>DdnQhHp@(KB15VvHas9s*Tjok^{I_P9#*A;LpYHOY z&!1_0TLuboI#8zG;K|*&H|g1Xki?=vo=0s6Vgh(%tZc9YgkF4Cb9+;`KKrB4c6d9@ z(YyWbnl{kvFZV&X+2wG}GQA3?OAiS9p>lD!{X-0b=?e8jj8`@wkQFf-K7l?rq0J@A zWNRi>nFNWAA9XKyxo_d|oTz#nes|TIUK?I+(=EklSD;6>m5s6Br& z;%#AShD4-E@LaUejXNvb1DIRxQdvMor2JG8O;r2U#@wr>T&>0eAC#H6A?2l=fJ)P8 zyzon@$qPtv59InCJAPnr@T|t<_zI;O>=nM1cAQ~j5xb01d_SjS-d>-b;${>_Fs{g< z7-1TUFH*E74Ny3V`$gEiOwTMSZ=BH*i_h$n_u9V}Uc806{`JyNKmA)Y5Ri;q>+p|Mp5V`)G6kb=$2lAOi16kJ?fa*f!2 zAOMAdMC+*JMq@pQ+&=x3o7RQ};bNMM%cSynnf6AK&M{88z~febdg5EmbRcY3F%)O; z?+rh?*2d>@`DbS54(~Huz_JUc;qV%w<$^R$salSa;O83*Y!_iR*}Qu5y-*9;xzA^) zVuY5c@*wGVoJRF8v*Y|jZqfll9@DqN%FxJJ&8`d%Urj0Fs52oIJJ)bZ5F5fMDmqvza-r8OJd=9Wpxt`1mU`PFr%qnh9(HNoGD8!RS%pR3C1 zBgs^$yQuXbH3pEh))i-G+583P`Na=fG(C}F^u2`rozZQmL42CD5#Z3I_n3y|12$5> zX=&ye>6qtIPLqYp2m9ci`{q&f3?t?btR)(yNTUYfXB5F>#t*pTK5n(9o~ zu-U0iQAa(>^2Hv`y=}>p1aS#maCc{T!9iMHp-lKKYMaq_zc!z`>WF$Sq8csR=F-^& z;{NhM9!g=>p*i;d>(gkAn?r^g5o_P@FBF>bh2Gh>o18EIczuA>Xz^!W2^PC(biG1? z#+EI`tnsh|yx9G$t0GHbq%_0FGnPY}LqpwWB%%dRzvHJKNq)KTYeR8##c72raXW?Y zw3HAo5t5qihMzAE7Oj<2Ht2Z)QC$3z-f>fCpkMlkZYn5K*h9)2vE^P>?W4z5eEuHT z(UT$zb*%7xD?10`0EFJvNb#0RKBI6HhD}zKFBHC2QHuWYtNhGlz&RjGOAeqxiB79 zToZP$CB&gW(Pvn~Lm$!`H|jcT)ZwX zzOX|G&n`*aDA~r2D8WO|mzn!eFaW3@{c&p&A|dbg^p#to>y^9*R}EC^S<8uSK=?yoY1|8O0McnCm%l z=;qQ-Ls=kPaL5LMAoihr#JRgK0fG{0+;Js&N>w$8%RmEbYH@dxE@dV`ER|=%AEXcg z^<(q=Mdjvj92XYjO6M65O>zjwCBE)12L{6w+pYAF14W{#c>9RCqc$+XvI$)VJj%39 ztZDd11{H=VGVz;&oSWx7mH{VL#|YB&S4ww$nD6;Ec#O=rUkj^96D&&;vsgQ`1W*_U zc=bFwrUR@q$|pYl5loZNvjiOL;hY6)1B1bJN<)XAH$Y1nH%8{CYnd6p#k?SF5UH%C zwke90br!gpZeS(;)qe7VTy@~dru&9admjAawaVQNLwel>FMQiATBVOxVqgZDC^AxNgJ!&IZo|>#Z^Ho0}xtYS~JCxq=$BBhC#Q@v8_foZR5O4Fv&j z7Y4QkFr9MLU&9Aem7pmJV}sqhMzy9E6DWubY6KlG5x@_LfdkP(r(uIu75qoJ_cw`; z3NfM$LxTo;^ERC*O}*6$TK06r@|I{1w3RF82kgdqRcb-%{F}yd^X4S!Z_L^JgBste z>y4R?
    yhf8JN=W+TtZQhZTt1Zg68Q&H$CBK%bnoqsuX1Abm`S{DBGM8Py+Uw0} zSKd%<8q>*@iw^f{?<$;*jQ6bJlGN!U>(#X<$8`pQnQZq|sUHEbU~666Br?AHo#d|u ziU$egVbV(Z7Hb=C)s`fQ_Uta%MBa`ynviUr*weNo0GV|lHo6jD)456KNK2S0uV>ok z_#|0-VHAei+ISWBnz6|`Uj76&hJyp}FTW{1a{`g${s`9Gfhd8jWv*aBWQFfjL}@$a zua)Mtk}50H72Sh{D(wvfj}%h%3@)r+P<+}X^|-C=OpRBXu*MBOvpanYQyB)8&6>|E znC2@FT6a$^sXuX}YWAYDwE{e&n@f9Qp_+02g1SYk5L%aR<_$P~+3Y3x7L3D24>7J#oJ07m9N&}g00MvSfaUf6wibfgiSsCgpk0sC9$Y>oTILgjK z(#CQTQnvdR@@Pkx3Hv_{nT$%}tUIij43wC#y*k?CT7O))Znx{p&DF5(?#0#WS>-3n z4=>rb{zJRKhFLn>e(3J1lF;RLUhD=L2>V(rZ~U9j zznHQwq5x5AJ3UAs5h>xMSwv_)hYFWbV_8?=v)2CVmTPz-Xb!u}7egoPgyUW!{$nNu z2N+99FJxug#a0`c)1QrTFE7bXxmQ@y87c>Oo7su<`i~1R5Sbbk69o1x_cJtb{1#r7 z3JLJZ*L72EAuA^cq2R(@5dks{Utj>_!r{!vEqX|>LgAl8%4SFbKd1pyl+~uc#$Q|o z9v^}9kCvec&hC*_`DlB78F`pFTsvf0vwSV(7@vbdWHd!-65Tr8#D@UZd%@ga@?22L z=@NIvQ9-IZhV5|D@j4ZWz@ZNOS^2Box*uayDn_TBuP>G@6Kvt=fF8dWp>q14f)inn zxixE-UE{Ln$g`4bg(K1DgnAuQ;OtR<{4<1|Z( zIwcLfo)b&f(It=pozW6knELB3tp*VQEs`(#sC;nhgIG-BvMj1vSi zn@`Z2FsGBi>1-Rv!>KNd*!1@bywF`=Kxn?x`InZpZ8dH9j#jTy4g-YV@Y3HK8jc!M zr?LQN=L;>Q9=G`OVZ|}ACb*WnI!Pl{vUKp51M&1O2UtxGYq!O<;eWhsA|Il)C|MGn zE?RH>$hlwpHb=jzTer7k2sys6Ahr&sJd$Ul-z#2IyGex7dGw$GM5^3dZT8B|N3IK3 z44Smd+h2J#nn-iupq!(<;QNfW^TC4%e=1(V?Cs*^U;}%%ix;mL>UCRJ)M2TNWBFN5 z)~v8i$zxr03YNZ)XlWioOgIT=x=-n_L_&F4UKqE=M8A4SVRLp~UGOBPqf*rdA}N#o zF+w*F{@`PRI!-PJba5?VT>8Pp6)uo9uLUxVB!`YlgMc?k{$iuUAH>$bn)QVnAuIJZ zRM6~LNmw+vz4(xl{A~`(h{cVRmJU)t4eaOfHyT(n=+mlU1PBDaV$cCgkP=*T8q)B8 zO+1cP-Q*oBQV*SS-}G`K@JqzNhJ2i_?e zVZC$2!4Bd1DNR{4Ud%KMs=-{rc4LqJ1g=JW1P^p_yn63gl#oGjqOuq(=`D{ge9#l9 zoidZzAvHm2j)s4~6fYp`3;o8&{Z5mW9a9KeYKQ4V_QC_712>_*x8>w?RkcC4!w6n^?n5;?ln$A@ z!;ei1fq?taer1pPq!p2n1V2<4JxQ`Qu?1v4xf`QA#{OzF@oGrpUc=l`A67hU93O)1 zw+*Avk9a<38rmGg_dvM+>*e_tDMY5Weoa_Dir~WdK2c!$b!j5-Ysuen9)ZYtf2v#T zhTXv!fGl{~ahZ41rRlan^U@6ve0WL!1OICP^OAb{$h5gA;a*wn=5oQI$!UdUk^v3BF;-(armJh&efx3Qf{U{W5<@2| z8w&Tt8s7XM$GiTXrC8q0aD)k<5q1^r6l?^mEJQ%jC|io8gtMUO?TCi!a#*^H__=-8g9)Pw$)Mp7feR(hw`QPfNBn?rE~vck-53*h2S@Y;&Y0Tc>GqV2I*<@T^H?;9jQiOhS&M~sCPd@)X5-?0$2{Mc3JRyBL!P z%p;umb_C3wvSs3h+($iuyKs*Ewnvf2ffVc!cp2^A8MmB_<_DR9<;(YJdA(LQoiaz7{9d2e0x1?Gz7z57d60;F0IjR=k4?LbD`Ue_ zKE1MhDmt|g$<6@=r1Bzc1u^Xs#)bEL+ofS58_iNQh#@_==FT=G_yk$MSiZ1rtCVZ*@lL;IkqEL#Ij=8wr= zQaYa$-Vg!BY6>u9$?n7=;0|<*_@?DH?j+0Qoi!iW2C~g`e+$^Y@eCkSGp&En4gupu z&sPtRqlMi;t0s=QGX!8y;?-)_CMYLe7G{LYTDL1IU0feu?_r2p*CD*oR9i!M+2AKL zt-bIDn}jY$>{}NwW_6f^;73xY{jT)^GU8iE#6^^GDTlGpnE{P#PN2P07$87f56%&D zI?ee{TJwoH)g4FRI^w;=`p%g0-lq(qvE0su2)2A%C&>x1%pUVklbm);c@gYIXJp68GBlxn4FNkxu0l7pU1mXqNDmN>O!SJ$S{Ib%cG6KwFY47_)nHjmUExI_<1O?re>)}qaxQ{gJMcoU9;-+ zA-F`*ie&gN=Jjk*ve5*&b$9^oEq6|pOo(*z$*gtUc;P|hr5i3>^K8BW>cRB`2v+}! za;U*Ex+{$|-Qw(wGc+HXUsqIIuwm!P33O*7fdHclI=|#=pu4;CKT!CI$>cIs#V~Fg7G%Y^gRx3yq>Dj=5lidP3Yf zHd^QUM(RP>vYREKypyY^^++8)t%C)Wg+{q;fcpN~@oQ)IKG;2lRq4i@00f=kQp1PpyH+*-Ro^|_+%GsEN;E ze>b;5w={I#9Ar085lw}9_5J$zag@<^Zg4H@4QJi|OBq<3QIJ3O)6$~}VQ)lV*RH|M zC#ez0cPl#pfwu(9uVQKXq(Dx!vN=#VW#MGFnygZk3gb+u{5U>o+KT~?-Fs?K+Cuy_8P)ycRm zmuO%}wR~8rKS@0{%5k2s7N`ZT`93l+`Iej#6UAaWA*~nnSZf_J^j?T|X_31_wZ8B_aWM&< zusUxCZKJEJ_pH*0>f?y#CH^i(L_*pUr|_9?B+xg-C1-z3KAgL~7@8UKsTj)}aqtkgE-YvNDAtM?nt2P<%mG zE*sw6yWibEvmJ(vP#a9k`0X6hX0C2YmQPdO$G;oi$^b!6JwzWo{Mu9Heu{bvD?@mV zR=N9^mWX}bm9!ydA<392mGltMh^tO((?JUzvgE=PS8`9a?4qtwX-I0Qg5>Ns-OM=N z;4-b2@egUh86n(qN}yLiA`X0)G!hAT8#8rmn9VM^$T6t)fvihf8H$uRw`=M{{EVHH zE5w0i@AP#8iqb1D;DcI0INCVvP1jpbhF=PMyRf82JcAa*2>q5!9g0H+rk|qG_^J+$ zZ*H4drYU7%pKirqmMn)Xt{ms&{6X01b0Wy%(c#-lD4Qk1(p7*^6qF&KDX`2!p2=v_ z*t+Ysjfr`n@AJwe(njzW;y#`5$H1sbf+|o@eEwl5Q#ZQX;;`^}m)r6-eC@OULfYj8 zLwYgjt_Ru;lyP9*sHb^}(foQL+q3G9krh*gHIQ_L>}h1oGQ`F3g1eY;CH{)o zD4RoCU8)NV9+($kM3`Kfz)Oyt8y!pp&!S8rRi*eoRcZtyeS$YKm(_Zbewr8{I z3J>jjf6NSvU;G2e1#G&upcftNK)n8?0sZ@uds0h0g#g!cpMQqpWDTO9@xllLRs=gC zSr~a*L7-|RsECVE=|diE;d>D&G;tzHP*uTAdHN;$ z0WDiIIpAF3g31fQlzUW?Su*Q{+F(F7cD6B<;!YM8edj=m^)azoOa}qyh7X)hSO?$K zm>7p6aXQ_5_+74lMq9@RjFgdih0NM^{h|LWr!JF=0%o?x_|)?r+lv-T5hWVZ{P)^` z2ja;|OqH!%To;KuUhWkcvN_)RTJbQ!eMoIMNY8|QrrnTC<~K+P4%-^d)-00=v(DTT zru$12bAIMaOZchUb3P{oK$a)YZC{Cr*PRsbb{saQA%ykQhe2(*#)7e_tLG_V!l2HQ zzmbqE1Q}~7d7$8n`m5<78^RRRsey?2pu5Jxy?6y=gpI}6tkhfL5{g8;@XFi0joBbX zm_cDt?6qtu?TUW^9TSHx=x4T0B@7z%CUw0157}XcZJfDw_NNC|H}8p& zpB%TpNk88wusafHw<`{Sa5@%9HupGf3`mgLS5=qy@8GC25+{mU^l0J&g_;TaWEC31 zMOi4O%l<6*u*Ak0wI!Xx#nSr+hKvT_dL4WXJ`VO)31ldE+qUf^h-Yf&baG$VyNX|} z7&y-n);vT0+mZM8ewo7M*WJBqSta?-s=C~|w>;xm88U(-{$oxkXyr;DZy=Hl~ zZS7xNn9l9s#j~ep90oUcb}niVx6LzmMpoWt-WJ*4IbcS=-@I79TBX`&FpwvI;LXbk z<=-FUqrINrorPnWno`2AKjdUP+p7P-ksCe<58B6)oV!#MdeWi9&VJCyEgUQApS{tu z1D}L55WiRyd%inyv$NH{84p#YzH>Xj$Rwa9p1;N2oqxc~cjYzT%wVw%|3N^nukYwQ zezORmKl?MOXn9T{L(OFwXE^|$Yp$8UM};&1!2MxW2!TyT9lL=^Sh z2|?P=-i7bh>Yvwx`Rwgk_?~>(%J>p|5Wn)l%bt2?8w?_p74XXaL|Q-tD%&)h$~|&^ zfAe=XHh0#3`X+nx_qP7~-5x!=@r;;#ogHN0#U8ZgE&m@J^!DS7N|z&ceAuby)l4C) zgF$Y+y;@g`dn=sz6sxv5O>-i3R!K!gn?zV{F$+YbBk}WkRtao zS{47VXy~2)3mO`=+}&*FM->i-LZxqbf#VOPPMcNl9dYr>cTY5G52PVVL-vr17^DP- zX%9Sw2vV#B^l>57hVL@SfbR)nZZ7IVW{kxfL@I~HzOU~#ln%D~ z&bO?hgrUj~=mfI@TozSit83Y4dtvWOnjn1cu(`FL))=2^?Y4i1`rk5E!$6 zAM2B%+vjdip-54y-?3SKYX5&0SFmODGFi2B&rTFoNZ3T?gt?+cSHX=!N5Eb-Gfhhy$>cio$a5}yWW^@#)dct)$25PH`_uBcOQ=iY=SK}(5;9=yBGF&r?=B=aT&+GV<<`*6#V;3ZHLMMZm z+3o~q4S@@V7(xKy{pQ%*k-xHbWyC3#yT%fXY(Q5_H50rwd5s2t*QKS=u$^T3nv5QEE=%A5m{p)Ppa9)|3@+Qy2YmwrI zs@0}6J#QM*(g`JM_W$*kEKQI>Cjb^T*iJQ{mmKKfc2)6<)q0Mt2_^#uoLzD=i3kL= zH-Ub|$?EZ9vBOz_(k3(p&=W?CZ*hc&^QOX%Z9;es2^y)}rAZ{CCqO!6V1WJGBrE`- zJj|#LibYDI2n`ts=gFH3O^tnsDGT{>R}$nADOoArYmf|suAKM-EtJWGQ(QBoYC_f~ zlP#~`T8iv-l`Jr{%PNw7QWpVYA-*w{%|cijBQ3o^=dFo3{gf_x2bqp>Z89{pmVSq$ zCD0Ps1J!BH*$PZV2sVP~BI-d5VP8j-abFlNX}JHl3sEb+2ZnXzB-aa^FvaIhGFHjX zKjh%>aXGPCP`n@1e>dV6Dees=-kj-9lMQTfYNEuN>hAYfS~`9m}(#>1KHXLk8; z;seLi$CKP<54e5XLbszgG$fM7W!# zn57(rupzjOAm0!7onkP3kQB@4zYf#bcB~D7T{p?3H4aVX5*XN!no*UU*!?5tRC@Z4+{Bm@)zb@x=nXr^F2K)T=WntCBA$C)9D)#Vk;0Ps0*m`g6NdRCWJs^r03f zeON>}knouaCUqp;hXQqGoQC7)N8k)`z=fdZb(WN=E-Oq9R*)w35A4%YWe;nrcIn1(|)C)H!XOn4vspEVwSQS%U`%ABXD)#?=VXZ0TYKmyfam7q2uah7Y=yb<77*iPGZI> zd_>@s#*he%9Oc2l_Eo2Y)ro4nCaBkg07lEF(>J_SmIJqD(W8?A#N+)J8qF2`7lz+P z-jv*Fe(G#zLvKx<)2R~58s}3bm@x()pU+4c)7aC2&f^-McN3oJEVxD?Y(61NF**%6 zc#!?6l=qh5^v7UnDrXzXP85xx3}R~-crc)4XH)x>N(+(r(iws~DMVWR2L%L{gBI9bCi#vEe`iJ%<()jXL4`Ck&--Ou=;!_6X#P ztCMIi`0nJ)ka|w{og?tu!w3+IY+|1+E~#li8Yv!nAk2z8Pp?ZW!dC?H1LefcN}kr| z+M?sB5*Nf9GV~y={*T7aJs1kL4dBahiE>YlOOa5ylUq@)6}xsTVskBPmuNTSo}68B zN=T%|+9LOrUFEh(x#hB0cSVbJjVzW~4!Q20JGdM6&<|)CiNak0T4M|HbN?K`1C})4JkwFAHESVqosg?Q5)ff7o-%byzj?+r zF7pL6#xc}fG(PD#%fk1fbT1#T=%pEJ<0&cDwJ8l>TWLgMkgX+1zz@~$a3Y-v`cAVb zO|9*-1$P)MlD{oad-DW#C4K%HL3m(x%8DUVAk&CDLxV|-!WSDU5O6`Mgb^CMW>^l! zid9a=R&^O2xOMP}o>5`b4z#0+20=Y6sBmG>!y^2P;rO2&8czJb|G>QhbgZ9~hzey! zD8wN{O3CNu>)R%3bjli|pDy%k**jh~EU^wscnlkn!g@_>avVU<@BNuEsN9|K9Bh$) zLMJ*CcSl>*&5ZQepZmtZhJ=%SSUvF7_@j_aRR1EagdXp^ZaD7MXXC>j&b6XD4%CRx zevxOcTPu6yNhm1Bvs(JD8k4Td-jn%q!qY)?Q#-iD%zl(=b%l_*W0fKX_#I>|)C7HX zJUunK5Q`|;@xdLPtC6+*$@29l37*|>5Ed;G%z$c?PNmpww|vy2>tyoUqjEay$3M_) z8q+0!4bSbfW|TJdbLMV;>Yhu4oqxSZOA2<>oSz(Q`D5N4cP#$=S9vv!*m2$bY`(Yo z-z58mGxF+htspikD+2X*6Q9XrF&F3XOV{P92_vCjlCK2~D@7v-*ZZc+{f4sn->hnH zEwnNX4e#;KoCM*JD{31xEtkkn&jnuTxo<6K=i6YT5|H@@h}wbRtKz4_0JI%5A)jM& zd3NPsUB5`ll1Ov(L*(cd)`Ey}N)DxP)GpeeMu2%$$94-LsI-eM}uEm`) zn?Q9hmkJvQRmOP$F)wbDZ_IRSRUI2ByU6btz&0tWBL=$G&OF={O`iIzJ(T?eJ?{*w z0I4uJFC=dA_|E!6sntshE7etmUenlk$1sMv8zFbKXs9?MnGTkBg9}rFA9RG!oQ`gv z$&XWHoTO3UqrfhjmR-y^arH5c|K;5ML|6zgJq5P8bx|FPI$~)^V`6Xbnc>?7z1tNN zE;-0KHBGq%XqJ#v(3!;#{#*Z9&{C|2;=oS;%UuUA5U?_u6EyV zZ-kufz?oJ4v{s%Cl-bH!@;!duIINHL*gSTF>?BVKgQD659 zWr!6-ZuTBeCDCu@P<-0Fx)dIUA?cUTB4ED}%2iJH`AQ1hiJ~uuSSw`M8NODlBV9>) zuj21{tuN2y@QBsfndv}4FCO-)TfQ85;IV%t)j*VN@gwUv3r*kPw%PIz z0}$@o->ZInNZoR*POgMoA>7}Ln|Hb`(&ywYtkT{80)k)i-9JKdU#~#!mb4seFzqPh zmirgrp=nc-M^K^ZLtpy1)qc^f8oyKN6W1K#nwwTTq*Ef8RZlzxk_Y>$nS0lMRu95Q zj+5UElAThj!8q7k`y Date: Fri, 13 May 2022 14:11:22 +0200 Subject: [PATCH 20/83] Added status and stop endpoints, removed some unused classes and other small changes --- java-files.txt | 5 - kb-importer/pom.xml | 42 ++- .../java/org/eclipse/steady/kb/Import.java | 1 + .../eclipse/steady/kb/ImporterController.java | 66 +++- .../java/org/eclipse/steady/kb/Manager.java | 15 +- .../eclipse/steady/kb/command/Command.java | 67 ---- .../steady/kb/command/CommandExecutor.java | 136 --------- .../steady/kb/command/CommandParser.java | 70 ----- .../org/eclipse/steady/kb/command/Help.java | 18 +- .../org/eclipse/steady/kb/command/Import.java | 289 ------------------ .../eclipse/steady/kb/command/Version.java | 12 +- .../kb/task/ImportAffectedLibraries.java | 7 +- .../steady/kb/task/ImportVulnerability.java | 9 +- .../java/org/eclipse/steady/kb/task/Task.java | 4 +- .../eclipse/steady/kb/task/TaskProvider.java | 51 ---- .../src/main/resources/application.properties | 1 - .../resources/steady-kb-importer.properties | 22 ++ 17 files changed, 153 insertions(+), 662 deletions(-) delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java delete mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java delete mode 100644 kb-importer/src/main/resources/application.properties create mode 100644 kb-importer/src/main/resources/steady-kb-importer.properties diff --git a/java-files.txt b/java-files.txt index bf851fe8e..3b3663b18 100644 --- a/java-files.txt +++ b/java-files.txt @@ -299,7 +299,6 @@ kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/TaskProvider.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java @@ -311,11 +310,7 @@ kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Import.java kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandParser.java kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 7282353b9..4719f93e1 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -10,7 +10,7 @@ org.eclipse.steady kb-importer - 0.0.1-SNAPSHOT + 3.2.3-SNAPSHOT demo Demo project for Spring Boot @@ -33,11 +33,47 @@ test + + commons-io + commons-io + 2.11.0 + + + + org.eclipse.steady + lang + ${project.version} + compile + + org.eclipse.steady - kb-importer - 3.2.3-SNAPSHOT + shared + tests + ${project.version} + test + + + org.eclipse.steady + lang-java + ${project.version} + runtime + + + org.eclipse.steady + lang-python + ${project.version} + runtime + + + + com.jayway.jsonpath + json-path + 2.7.0 + + diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index ab1c638b1..2d8d05632 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -27,6 +27,7 @@ public class Import implements Runnable { public static final String STATEMENT_YAML = "statement.yaml"; public static final String SOURCE_TAR = "changed-source-code.tar.gz"; + public static final String VERBOSE_OPTION = "v"; public static final String UPLOAD_CONSTRUCT_OPTION = "u"; public static final String OVERWRITE_OPTION = "o"; public static final String DELETE_OPTION = "del"; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 3972a6595..c0b673b4c 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -1,23 +1,35 @@ package org.eclipse.steady.kb; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import java.util.concurrent.TimeUnit; import java.util.HashMap; -import org.eclipse.steady.kb.Manager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.eclipse.steady.kb.Manager; +import org.eclipse.steady.shared.util.VulasConfiguration; + @RestController @CrossOrigin("*") public class ImporterController { + private static String REFRESH_ALL_MS = "vulas.kb.importer.refetchAllMs"; + private static Logger log = LoggerFactory.getLogger(ImporterController.class); private Thread importerCacheFetch = null; + // Refresh CVE cache + final long time_refresh_all = + VulasConfiguration.getGlobal().getConfiguration().getLong(REFRESH_ALL_MS, -1); private final Manager manager; @Autowired @@ -34,7 +46,8 @@ public void run() { while (true) { manager.start("/kb-importer/data/statements", mapCommandOptionValues); - long interval = 3600*24*1000; + long interval = time_refresh_all; + System.out.println("interval: "+Long.toString(time_refresh_all)); try { Thread.sleep(interval); } catch (InterruptedException e) { @@ -50,11 +63,50 @@ public void run() { } - @GetMapping("/start") - public String start() { + //@GetMapping("/start") + @RequestMapping(value = "/start", method = RequestMethod.POST) + public ResponseEntity start() { System.out.println("ImportController.start()"); - this.importerCacheFetch.start(); - return "Started importing vulnerabilities"; + + boolean started = false; + try { + if (this.importerCacheFetch.isAlive()) { + log.info("Importer already running"); + } else { + this.importerCacheFetch.start(); + started = true; + log.info("Importer started"); + } + return new ResponseEntity(started, HttpStatus.OK); + } catch (Exception e) { + log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); + return new ResponseEntity(started, HttpStatus.INTERNAL_SERVER_ERROR); + } } + + @RequestMapping(value = "/stop", method = RequestMethod.POST) + public ResponseEntity stop() { + boolean stopped = false; + try { + if (this.importerCacheFetch.isAlive()) { + stopped = true; + this.importerCacheFetch.interrupt(); + log.info("Importer stopped"); + } else { + log.info("Importer not running"); + } + return new ResponseEntity(stopped, HttpStatus.OK); + } catch (Exception e) { + log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); + return new ResponseEntity(stopped, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/status") + public String status() { + return manager.status(); + } + + } \ No newline at end of file diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 39108195b..00b891411 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -9,6 +9,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.TimeUnit; import java.nio.file.Path; import java.nio.file.Paths; @@ -114,13 +115,12 @@ public synchronized void start( } System.out.println(status()); } - while (true) { - System.out.println(status()); - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - e.printStackTrace(); - } + try { + executor.shutdown(); + executor.awaitTermination(24, TimeUnit.HOURS); + } catch (InterruptedException e) { + log.error("Process interrupted"); + log.error(e.getMessage()); } } @@ -132,7 +132,6 @@ private void setUploadConfiguration(HashMap args) { (uploadConstruct != null ? CoreConfiguration.ConnectType.READ_WRITE.toString() : CoreConfiguration.ConnectType.READ_ONLY.toString())); - System.out.println("setUploadConfiguration"); } public void kaybeeUpdate() throws IOException, InterruptedException { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java deleted file mode 100755 index 754d51931..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Command.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import java.util.HashMap; - -import org.apache.commons.cli.Options; -import org.eclipse.steady.kb.exception.ValidationException; - -/** - * Command Interface - */ -public interface Command { - - enum NAME { - HELP, - VERSION, - IMPORT; - } - - /** - * get the command name - * - * @return a {@link java.lang.String} - */ - Command.NAME getCommandName(); - - /** - * run a command. logic to execute a command with arguments - * - * @param args a {@link java.util.Map}} - */ - void run(HashMap args); - - // TODO: may be we might have to change this to our own bean like - // List rather than the apache-cli Options - /** - * get command options - * - * @return command options - */ - Options getOptions(); - - /** - * validate command with command arguments. Throw a validation exception on any validation error - * - * @param args a {@link java.util.Map} - * @throws org.eclipse.steady.kb.exception.ValidationException if any. - */ - void validate(HashMap args) throws ValidationException; -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java deleted file mode 100755 index edc3103f5..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/CommandExecutor.java +++ /dev/null @@ -1,136 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.ServiceLoader; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Options; -import org.apache.logging.log4j.Logger; -import org.eclipse.steady.kb.exception.CommandLineParserException; -import org.eclipse.steady.kb.exception.ValidationException; - -/** - * command executor - */ -public class CommandExecutor { - - private static final String DIRECTORY_OPTION = "d"; - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); - private Map commands = new HashMap<>(); - private static CommandExecutor commandExecutor; - - private CommandExecutor() { - init(); - } - - /** - *

  • `#kGYGE3kBa3XTke4KMs)mYsb))EG}!^kaY;Hxs+?_D;eRVAHjKf z+#zn=HVCFYFjMdDX(U?Vbn~Tc;)(LJFR%ldRd4B)Kq zssJDVIM!Ia?^h&7K$rP%u)l}*3s!jwasPq$hr|E-mNoyvIQXBz`~TZv@Qk|RUxhYb z>N~>u)&r^MY}H{RE=L@cRWue+qO%R<0c97^v?EbOCM&gH`(EObY`B!JU?jq!1Wh83 z-1mIl#q*d(`x;6Ca_NE781bS5E?HJ4_jx5j+L8SGpcaW5nM^k<%ZZm{PSN<9QK3uV z2CE_6^EI7Sql z$igU&EI=RcCr6tvQDk#tH+HT~JA~ha0x@c9)0(ZrNJcHC&1n6}IGesFa+HyF3pqZD z@$2k|Av9tP7%Ei=w8kaSO-ba$`CtN~PRKcUv`+bc65_eqC9I%htw-YNnLyJ`*OR4T zjrKItGVKtFP#ZVX?3@&Q9)s|!wa~JA2>C?`n*%yDXpFNVj2DBxcbgTM#Oi2g1FTO7 zQ44bnCHfr|MrV2IIBex7O-$ZFv>-Y4N#qe~JR769|I>k4Oihh~g&mW4BSyPl$Rs6h zzw}MhbUohduH#Tfbk_^rHajX|i4d|vO{#KqQ{a%$pUyjI0PrwPb%{UJ{s6Z7)%Nwn zf#dV=r%UwB&Dj}DvJ91_V`Ma5c~GL8tYM^-ZmOCEIkFBNNpEu0vgj#P+z(t80dNgT zn8B?F_hfnW=B+zn4rp@p_VncV_N9rj36`9%Xpr!FcxL9on+#4RQ^;=^tF=?+{LQJM zX(Y=V<--j7wrzqxwk#?h+_kv*P?!&9S_5pDG7};Fup)sH%q-hlJ1M{H&?AR~3M4C9p0v_hqs;w#i$i_qwL`y{9XW=Rc=MV0RXQ4=nen7 zwrc;v=J)>zoBwZj!0SJdc`VMqK;|>1R8du2EUR~YEeK%K$*82H#G9@AXL@t5 zVM}{HU$Pr}_I1aty~$P8ODJfp`5*45dGdB)sJg&v09C@q3Lix^(h4UvbalDvA=(ZyY>tMNww zf|hWG1trRR{?mEfIkv7yUlI>GEo?j5#uWJB*FvBP@{9v7bD{v-Q##;MN8)qVoX+K^ z>K}9o4Um}*924hd3Zk1FL;cXgf$}BWHJ7w;9g5i>v0;hnUnY<=;_X6gg676;1Yoez zVZJWLgp51qHL#Nl@(g^kmo=$;MpxfJ)7a96<@`Yd7U17!@nFSlfj$^9dwF@W2g1L< zKE54zIB*8ey*W5=dog3c%Z0nSg1+yFap1%3H~SgQEyDe0Nks$fpeD)VVSbp>rqU^t z&bLl_Qj`%5&o62YnBkahkfu|jO3j)Qq5P_vABZq8N`$b5lCm8Y4da59c>p~yD4NP4 zZic++|Lr&}-27phfYOKtIpvNG>%x+Z#n&i}hN3k*AmBXFK<~zG-}B(UZFXqj>KNv| za-;i#I|BM#@C(SY@1e~dWs!4eCeiUBZfi8DG>R+LxIcClSvkVqBf}7mqm++%+HHvD zr?)EhPTbo9gkogS*DuJ%O8-o-MdB0?b+8?uxi+pe0}SRGWVYPS5uB>^1avHL;% zE0#QTtI!-2si9$&&Lc=P8Ih+lj${lIlc;J16`=^KqfJ(CdPoJrN+nD*il}e~T$}eE z9Sc@yR3vM}>(~bM#mpiG@X8ZrmF%_^6sKV*D0+KL-ShVRAi8J$wAtsd%o8?c zYpfzIA_h$o9jnYR=WUW+1Dth)<6AE}&geWUwqwEeLxk7^SZ8%w!%|l;-mb5Ya9!h}0P~U8?)out)+m+wEon!v zW|o3vo;~Z`ynjdfVUoOLzW;l%! z9dhiytpI?tNHCD<670{(bvs}C(kMZ{t8T~9wNc}>`*^F;X{npEkm~=+kxUank6a|Z zoXT0V&)?dLtD6BuIb|Cez)25mSAQ4`5!M=Zge}q{N1LIC38C8N6xY+DEabAoW-&os zBkFZ8H!IX5WZ!Hk+?|R#>P%o6E%8xI9Jf+ZyHqr53JoIs`JD;5%;jleMs8)AGCvHt z!lhcrS~J*j{)dse6TG->Kp0dUDBXm-|r~^ki%pUTGq~kL0 z=I}1-y!xIb&DB6N!sUft{?AY5xCl2r@j6MG?UG9|Hky@!_dQ$DY0=W%S`^+r$&-NC^%X!TWBFpOkKU1bRsM zaKctI*4cOAsN~JXt0gWW;H+)l*zqQ*E7;RdZ9H0UwLfl3SCFoNn3`%GM_ZW?w0?P5 zU931r+0S;!n@$SXp(IaPZw~ZAH9Q^ne$dNbj2XAW5Vs#^5pn9#^PWhnV~*Ly=X)pZ zdu4f-eO@SCZ8spWpBbRiYP>DDjNT3h65fQHANcevvy>bjd}86TLBDQgR2=RMj(k&E zrJ^9dl$T1T9ROx7Vt1&b5)Ro?2s4Vc@toDjMVm##Etr+!Ar`LGk&hAW%#m|tw|A)a z(qG$IC2VH7y6V>1DlUXH$~In)^WSNpy6W zkJN6ICQoyxT7^U7;Xx4OygTg_|dZD{V#FtHB z3+=n$>t%vlKKO=kZexT?bNj!@2xo<+*iJH@xVze7SGg{ATom9MI5(Klx8i zs~-Lpzw=*Gn|zC4giU`KbYuwsPx_$$gvI>L*z+%@o_}E*{0++fPee9b)fJsLIsQ4I3!IfQ*Xs8ReO$MH zT-OcncLDA|0eomvQCly+YJ2B~FuC3T3b- zC>m#T6`L0gX<;Ks(8MNXPG-eKlqq>XJ)D?3J4${?k&;e=5qs!Uwwn;NtE8!IZZF^{ z5J{qRp;1=iKx+~h9SLQK97Dg-u8Ps7#XVA`kJ70kGET#aGxb#cSP!`DA)1x%tQoWr z)gdjC#}6FR`;PH5ub{i-tn%Z%$eqVp&D2n?!%bCdD>z=$K!Z~mpr%$Lz1L_X+Ikh> z<5MN@Istix#)mxj^u~q+7jAo+Tm13!*q}kHmgs;|e3J&uH6+-5{L;hgjc4Ah8s3wt zR>Ccf`>&mkJ)WO@fgvP9DjKbq+B^nai#~v0=bSXmFGMY;(K?cJN z71PPLpr#MU#$rKm%U)v~lFnJqlo^A-IhNGMc0WW@(+d@{sAM^Ckygh?&F$z47phpg ztXT4ozFzaSScbukhZUo zf~f7d4SDJ11HnT^t_*9bT;JFecx`;<3_XClzqYCDR?!#mzps0<0O!OeniU|AVPb`g zR^ph3 zQ(W)OkIFEW+O)E_b<%?%W`gMn>gMV15v=%86s92mYgxk;$tg+mU==T^9%^v1GY(pgbd8BC z@M%oNqdR(^$OX|~5FK!f!js;ec~)D_ICq?R_MqS2`sZ1&Z`KV`HKWB|61Z%gb=e*= zW6YEkhl+-Korgr9>0o>c+1dy#nIIwZx{K#hp;LDnrktwHtAu2*;5bky^ff3-olPoh6pN9_V?nzMpaBzfY0mr7ZN)l3Gi>iS2+dg zLg7hmV49G_+cDO~cIVYVt*1MOGZNTvJLRtI!xAm4(UnDy=J%-1gIaZ5MjiDXG(bNG68EnY^>3bC zP+L{`OD!Cz2;m!1)Mf!o><`1aC3{2svI^HveP~w6&4^)JrBE2i3m`j*P|8|OdP)TjJ^KYNp! zz%t(X(|)cH{QLfy|3drupJ&d0d6E844xJfI&A&LQ`MuOto38*#n;nK#)QX&>|hZx@SRx!LahW%H=#`;X98Abf#Aq0BRoLl(ZC{r z%w8hdU%|M*6Ye7;bg5kUSAPL=>xMi~9LVp>!!WV2mAs=Lx`TaV&r9 zuCg+~I`(|+_>y8H;3dgUf)rJfgsRd!#}|z%0ID;^al~@3InX=}HhfsDN>mm#=vBo_ zXr!hiRskfKva%*r`C9Mi-=pWPBK$1EbjuC@(T=dTaP(dp7^{R|lpqPY@J@dWIqcC% z$O5LpmkYF>P{$a|CC&8#V4N$^QS2Enk?p6VETfFa8jk2gPZ!X!5P<_vX2QWq<_}Lc zBnh9&19$ry*S~{2KDeuE;LOj1m++9=i50I0a~FP$xTA|OctQN$jl*k+7{&<9ZT*x( z5FUVR%%e$wd~GEuI3P9Xg~^OB-w|IY`h+rNRJc%MnQHwUFSR~ zNwsfY;WxzKXNVWUJl#pc2B}29JqDA$bl-iNWyNdKXt}sJfC@>JPZ9M+X;k>GYTKR5 znzZJ_GaAs=okxX+P~n!9ULW<(S1hOHC%_V?2U`+6i;SjzjEnp;BW#&Mh>CibGMBAv zy;jn%KbAlX$Qww0VM)O3X3J~3l&*2+*lRR?gG{JQx$lIbO6#k1uDm%T=$$lISZ8j^ zkP0^-(zV{ie11#XS-O#{cM2t6lKAWS2CSEs9s2E4aliL2zyR8x1(NAC*3l4Dp*+<*bBMvIGVew6s{~JmiQd zuhus-7s^tq>~20HPH=*~Lt|nq0~M(0q?3&RZFp$%(E=3%PO8|J+H8Gnx7K{n7!5Jf zm>Uj%5-%z`eB+nFJP=qNu?-RTQz*UWbQ)H46b}@WxBW7xS{PEq0+Y*x78Y4&Qo}Ar zK82^sq`vqwo(_ez4HN|+QQT897-~WJ2BZa@M4nZv!EqTn?S+65<~x;p1n|O8Q$QX6 zt=TL?g43XD$sBX81S)E(eN78gLn%%ZDqawn0ZOqvpejr1F_y-FEwBt|cL~B_*mJ-E z1U#C;U?`|EfjN2v6c|^YUr^9#?)x=-RKupJx1~a$6Yi20VXCVX%uz@d?75d)b zYC;46snM?i02l}i2?s%kPc+HB(P1=dLj!0iRnU@phl-N1^9kLWb&d6`IV*9T`$e-i z13f^O<|~}MZ~C0qO%GLAbK;oI1#SB}t0GihvqQ!#jV)$~uRWTYx(_(|1GtMtL9?H4 z2*kLm!)D%a@fZJIkXvUfg4=7Hrc2$+OA}FdO;RUrVK>VIgIsGkFRhN&Yqx8;_l`#? zFVpuGdS)d8VQ?BKE3iepkdIS``5Qpc)>b_dBlu1@UzRXyt~nrMo(26Umf)~q=mkN` ztQae?$3|2unA`DO-6zxqo2JkFRRU@KRqFY!Ql8td;t9Qp9U>iLIN57(mSB!N&Sx}! zyxL|8I05LIsxW?B$AydDifD1q@Ub2CU(|7&?~jDhi{K2`a)+^?@2V)gP76q4IFJP1!%C=dl?f%sVq0idwnORhbcpD zOyHnq=DbY>&>YKfu~OZtMz79i3x*Wy?rrc}c?S#v!kLH&eiJswBki`MtEGeBqR24U z+H1`PFj=}Q5p90Vmjv)i2kbT+q6Jx-@9l2p1-aLY)w#aDhCdyxd2ZIjbst*T#69f_ zVHY5;5yXnqFS!irH57hy1Tiaxn!ZfSf|e=!5GTP{q3Zh)wbFEsj6R))QthO{gNw4! z;~~{#4NmO0+%J0C%tk-mM!$PLgLVo@uh<%nWr`@1;yKT?JDT2J0lK+oqsL+IVBx~i zSTyF_w!3d`zFQv4#k1IH^aYuR+l*{L));aNMpYPWjmVaoz1xY`SP=++;U{mhh6-dh z))oTDq+pFa5#DIa+4sW}a}=@4x@YFv>rb{D%$Si@qbgZvwD- z=2{&F+F0~KTgH3|B^vus9*|g(ZCesWLJDvD-S1xR3v|>8N#GLgSb{i_`>xwwZoK#j zjn~Xt4vE%#&Cx;D7vW42rj=LRF&-A6-+t%ho;D(bP00fSB$+B;e2uUVp^w2+?7u^J ziap8Q$LQ?&3562Oe*9pHYCh_ZncBw5a~erCXnY;CGv39Uj*a-rRI+iWYdOcvUZZ=2 z`5t(D58}Cq(dqExD}l-EHFKOLM!zalMK39DwsG)rVF@6HNTNA`l#c}i)1Na+^b1Q1 z{ep0!T~uY(d2a+KCRBDJCW1p`j@fTXj2fI;tjN;4Y!yewVgrGJW5-9cE(G+S&LRe& zGo>P8P;@kAK|Dg@Z0UGou}+e`PG^%Ut3LO(Ap{*FU9PP_9+eaC9E&I5uLu4DCb=yJAEg-NK< zoZ5D|LyVfAWoRG_Pyb%$v+YZj{p#U}I8AK=Mp2J_hN^CtE>C zzetB-H4D`_Y74v%)rGZzz0kHDm%SMu3$G;_CEqxrI2llDF#WgsQ_= zKx_O6)h#w;&*7Ibz!@zT-r9xDm}RcxsUn|^RL;)SkuTRn_tXHZiR#!py|wfo@no0> z7s8peF^|^A(I!>=g2`unqJ8W}!mde-yw-XrvO)$RD~x$<*{PL{yOzG-8i%MPyWBlQ zRHTr)#=Y9RY{quA#k-Rcznh&Ue8FiY1+uCl(LF3$G6S~%dff7ADK{d8uf-1UUg&M9@%uV43wSH~oO6}dfHk%*EG z+cmMc8njHMd^m6hoDM}Lmo;?iRysBo#Y2VYQAlqifs07t?GY=m#^M#EZy*YLi}ZE1 zPN@icF&gpd9w>n*eIerXIb4YQR6CP=v0hOT z*}J*%z)pu~#Vzkd7;PU8&QDeQ_^*BazwZDaEg_x{fB*nM|CpWz{9luI_#12Rk3qV% zp}8rorJb4m-%lI=iRD|WilY1$!(XP2IaGKBR@s)D$OIx_Dk8yZM4-dP**eJ8k+~ai zg;~#g?x!Ry4U${$Nt=BBFTU>i^ceX47|{k}XbRb=KnEqR|jU%n_ti=H>v5MdA81>I=uLHYR}yQd@dO zSFtXfz&~`fELt`O!wN*Qq~vI!5~A29(;^0BGE}N!?$x-7o3{h)P_VM6tVS8A)sW`A z>Doq~G$l`)>$ow2M|26v?j$&Jjvua&g>fCHE4XoS^9SSX(v85SxGQMk3VyK;Od_iO zR8=9C!bscdz4u3@WoU8&uA-Oa|>4+)umc zjHoZCwe5W>fNDvrdg@6Fv+CXrtcXw}S`}$SfOVgDpK#B&Ua*EoKO#z#CX&i2Df{%p+QzeLMt}H~8`4&=^%`tg$g|cI0Jrk-g7*q&|1roh@F|hlDa}9JpKrcH6m6ypR(wr zPm3snS(Z@hva9gyuA4)_0Wo^GDqE5y)oUu##??CQCAGVUE4J2+j~=R`{WIsumWVk8 zMPRR}e;C|9b7v(qIlicZu?KlYzN%Na84*&eo-yPFFyWG@b(fqMg52l8d2==+5xB&s zVI()4qk8tEyrEFK^MK2TWJbQ5>0PvJna2r$`Ya{SBcYSS9@j%{{9zuWv8&Xrz1uEi zCUXnr*}K~>KLiib9Bn=n+@8YQfG_G7Fb%@p)(QW<8$q7i{I73gL?xLPM3(Ar_1}{a zrk-$$cPKi2O#!s@Q^?l*(tGU=@DBx2xk<`j+&MsRwQPQ32Ms-u3Oq)uEZ|W0U}eIF zpTB>WW~+oNdYyf3dOzBqP-kjTRxJhp!_us#D?}~%b0IK_3;>Y)e}8HI=Wyn)QY?S- z-V!l2ws$ggv3L6W)%s8F271)@oHxb(B7eI6>j==hL4wH=-)aoD^;e1`RIUMc@|dvJ zK9Xelc5Z)3^6#E5cO;1rk)owEbVAFQEqnjnD*x3$W)Es%8CWp`)OFH90%StnGAp|^ zA>!>Sp4gC7s?Zw)FK;N9Xe^be0u~Y};^GjhR;^hl={ci#2%|zoWSLq>fU*cUKb{}> zy6}c{#vu||^&+cli*%Udbftl5=i8AOW>{}K;G_({h zQCc-8X$&&FpG~~9ofz@fG)e#15O+Hi|8zu*z~e!J)Aq#V`ExZem4jk0FGp`6ycxMJ zP(^bDMm_(EVq_Lc^-HQrBZ_4>%3K>8B_19$B1=>7e$W%hN)Hv-P%_bV$KKNRS-P)J zuO9e-0$hszy)^u*9cAs8i^q*+^QtgbF(XRt+>d3H!woPIu@)gl;-){|L4S22jvUoe z?pP9qm-$nRRhC(zw7f>MM54%nDPzdW@3#-Quv{~ae=L06CWm`_@O!-2G4$fY zmNR&QuOOifV%URKguyUFqfCh_sA=z0H0%>M%87i8a3GzrT&Aoiep@&bNLd#bE{`?A<@$Kh63G2dSTRE6`lWv zJNyqW=2|tT!3&9u1Erdh$=2$qsjDb@;h#W|o25|%D2_6^Vp=L`b+Y~@Azd1lRqqzu zu)1&PGR63m;4F?3{4t=Z)L#>xMNm#~Ct4(De;k5moiMvLi+{hGRL<)>W#(`sw``Og zC{?TY8D6Js(JCUQwpg!cb-~<|A%noByQ|kZU6Tpt5#&1nV|+|#qk7jw*RF?F6(qAJ znXgvwhjwYB7T;}9c%5Jq*JP7m^ORgzy&5@HyQ=XOre@W!nC_cJY-Ols4c&bR-!6@8M*-19~?iR^Yi|G z8<}cH=YHfupH;|w^F_w{KybffE(mzU%O7ApUccaJv6F+8HdZqM>+}hjUr)D?3l?fq zp>z^+*iTAZ#(W}}h;=2OhasFf^r*I|3|IvleY}z2n7@f9c94?XBJ+mRZF_ldZC3Xk;U7a&(!nR$=G~B<>|F!Q9n*R!^`8bE#2DtWcI=(uOSZm0AriQ+-`aP$u^_iYsrX zZ%M)fj%|aQs_FS*Y^TraOlOv*<$ASu>|v}jrfCbd@1ZOFH)A2vVqwd1t9H<9j8*|H z#!jmQpmaO5?@rWch})1cvYrKQx^?|B)B2*(Vw4E&qFi<6f|R6IR76VMlOk>6x2^YW z)3)1fH*tKeR48g36}%R^=LjM0`x*;?RAuqSK<$!WksjcEI!zXtuy&)F^zovO#{$H) zXnSm~f1oADib41mXdM4$5xhNW zo7d;||7*7m1@M>OKkDSM|0@TMp_z-R)4!;W$NjGdbapcS7lR7?dqG`Hon8LL$Ws3c zk)2GP?OmOWO`ZS69OVC3b1*S_uEaAfQo1Tu{A*j?saKS)Oog+qUhbV%s(= zc2Y4bwr$(C?TT&N*z~+-X5Q`{^y%K&{hECE-;><)T>StD8|_P>_&ZLGzXRBDc_a#n zGO4aDvpw_eu=(!7`vbVPzQ*L7qZjHfRNO%+NtD~0n$#ig{ey|pQlxHx%Dr4lX~Zj( znDjAipIf<+;;{w@uM)jp0AQQ;yh`Rg5=Ud=gveTJe~1XPeV~a6qSbfXedyW=P7eLr z2{lXC*x73kuietML9sL3#$j~r5Vn)nLICW-6-B_{x+4DN%m5TSW7+lMVfi82_U1j?@NXWW zU9+F-;LjjW?zqy#QP>%@Fznc9YqT$pmjcgzSl^Tfb?b^AaBWzVhb)sBXUqF97 zeDgzEt~7mTUG4v1*8S%YUlVIPC-;9W>y##C*Z2{#NQA9(e?kgqBY;QoE>tZ@@~W$d zha<#JO!uCWCc{mUX|z4sxU%p^y0eO-Qlj|tlt@Uo4Y%<;@d$K3ill@NTz#8 zO2IfQ9CAUn3Qw98HSY@zqL{m}D;UR)O9iH8vNz^wKaiDq8<^{Nuzt>K8GtrcIP?>= zO0#yPn%luVd`9gzc1H_2fu}LK{u?#g9Z7jC9I& zp-wNWBq{Ax=H%ei?cf=1hDy<>FFKn&pdUG`8H{^X_IkeaYI?G!13HGyFwWs3nxuIx z_(ZDUHN_QbUa>;kGahhs$ZOj_P~(;H%W#dmy;Z5(q3ONU-rmk|`ge_*{tf$I=N@jd z$GOXQ?!kQL-amvq|L0!3ePWs0W3U=dB!E@k=4h-?FlmnDhjYJs)@rb@)%)Wq`d>gOWxs}N(Z3Js8=7frFP7jOM z&nuIVxO;Ptj3pQci!jWjqze@?GyXC*l4GEC4+FhkY*T^9u`_IWmR^u5AZtNn7UD32 zK!-7iC$#Fx$7m{Ivn77S(G@J8t7&hV+w>!hgsdF%q(CZ+P0&5H9^AeK^G`1h)1E|C z0sTX#sik1_M3*)yIqTc${58KO3B5X=$sM8GM%Ln8)(gt=suef+3{i}cL^5yZHT>Je zWA<}BGQ=#R;9Yjw)-V)n6BY<8}mhw z;V-3hS)}@%`3Ij*>-&8=^c0*`0hE}dloy8>GVO$LVSd^1X1$ItbbURK&CMRt7PHAY z;O2fK^PSuJ_OW=ax-H3A*>2+4AY=-Y8i;Hvb6+zJxjxU_Qlp%vgpx|d$JFYFdq?xu z^Kesi_4K#I{2xfwe?ov;;{Vj=|8f28Z(}e32U}YwVG9R(LncEG zQx*ebBUV;+6BZLwMiUbzQxjGb1_MJDHV!s6BL+5;@822H|IJJPFMol*gz!(vZ>#?g zMDow6Z=3uNM)VJgZx^F!c%6Q~u|?m#zQ_Nq@cv~s`B&|2~ zqK{RkR8XLowtBoujPPR2o5(vG}#nh^q+!$3&P?f zd-rHV7-8;NISVuZh&ur_0C5i4g;^n<6X_F*J8~!k?gL7kh@m0|!OEeIJi|ocEnL(~ z?xu-`-wB}>Ep;j@`!3FApRnB z)yhpHexBNi0=uz>=F?832+`%HJt$mp)t}M{lABFy?pa#WLQT61w$s#B*#y;I#ZOv* z=^az~zEYu9UX#LMIMJp(NP!1+i2ktZvbYO6a~on9?qN=1-q6M?-cU-`^Kp%wq7|J# zeLHF)BC3F!jCy`o8FAA>Iat8|fSdYlx5CSP_W0Xn+OHQA2kuquaR%?+-Wg`&6V$jMRY@`sPgCau0vnj#Mq4fY~=>_&t$l^p&%Pg0$cHpOzOY=fV-O3+VJtkwB zzO9SEZi#X2qV_r#6IA0u=YIV|+J9cegSR+2md)|do_?@1b^RP*Cw&dY&N-_eX375< zs1{O!JVp(NsGG(bmo--ta#X{opc+}OqlrL=0?*E*n>wd;ZItnSsmCvvpu?fN!Jsj2 z4_5`x$Ii&7rMQGo=rZh}o7t^kLTxH;Bzkt|R9-`-I?c~kvyIlWn?ibqz`xIcpa z5*CkVSmM82b(_pOm;4p9*80F&oZaxE{FZkCNXPcjDY|et6%O&mmUmTdtxoxgMwt^k z7@jI$N2}ZQe!B(YM}O6Qe;tE|SBPQkM2Iokd>S;eMU%V=c-Cq6dPt(9`_{nyG5Y26V^n?cb3++Nab` z->&N~Vhi7u)8@r!5Fh0YU!#$P3+l%j3y}E9uTv~2P9R54zvIN-6oNnyER2~>0FG>v&#ye6 zXV3=1PaspV3tpAZPy@|T=c;3kVmI+qT)O*fJ7$L>;DfjmASG%4BGS&=a-$t|DAY&@ zCRmglVC$WrKt9Tg5IJZ`RhzgIN!vP%=m#L%+e91GsBtUk{1kd zqWY!XidmWYkKPpPSJg%)(TNS^p0=A9XE8WzZXFjchauT){>^B!>f$TY^N-`xpDd}7 z)3|J%hGz4lzhA3aCvieMN;IlugqS)2D2F@YF^E>&Qv z)FIH7ppzl>fV4!L3519wVVDrYUdtHxqxC%zAuXV1GzZG<3%B z0BEv4!Xyy#qC8pbZtbJd!csI?UXpKj7Fua(b{5`xc4LzL#Bc_aV^&q_h(K^$v8+<1 zpr`m!gw%ALzSujzY*HVS8`_NT$Q{LbnbyuGu8gRGLh19i4<+8V-Omc1QLCoIPqXm+1){YmM6Ie#C19h8Jt{%gQtnHYSDJ2Cg_PUN1W0l$ z99(f;hMe@^pOmY=LdlZb-HvhQCc(iX^<=`%p4;;#;YHTQsaPLC$2sg$PO zOC`wY09n?{DUku||HPv;F?LEuSU1!OSiQzf+!Yy^jJi@VHFEb;kd-xzAJx30*W8u3 z5mouc6fANPq|}TFkotE`at`fT-EiAUm}SqLiwB2pZKSwt#?3MIB>SV=8+%e;Tr+D>Wv~Dk=Upf%&Lgi$$*S?FQ zs;VJC2thttR%4H_Bs#M;YkiT^VdaorrM3N{3MYaZDUh;F_~;-^AgZGxVN?dGZ*1RAotzCin;I->CZ|Q{q{Zq4Yo9iT+y50+GB@c zAG2$QT-4>zlO1yjY0i&a_yLD3%w;Hi88`m)6z`12vWKqX*x%`@g`e}FUvJYxz z>*j!OXQ%I!gnp1 zN84v7Q$)PUc%Q(*-^}6Nor5;OH5aH}$Dqmu7IY8 zp{Nr{mj-So_f3t)WJ32RNzyN)$lQ=1?xz(?i+jc-^0Q2|$OdNQZh00CTG^y(O3s+l z-NsBrP{x($88H^>9HH*L=Y&zg(C>zYz_kl-?;kW@t1+R*NSA9`H_EL*H8OV@Dr%@= zTub*CV>pC=4^m0R{^J-OBTIZS(eR0gthG1?t>J;CrSwBBA|i9nf7VyupKM%PwS(6M z;1aW(&mh`uWB(X9-AF;EH&mHG4H0Phpb8QX$D{6X_JzHG^cHzaU^;0ytcYPqMLLaZ z{7$9%FdmYd4{pRF9=e1ku+^?pr8f*H8Pt8s6IdW5z5?H4&p%`I*lKS(g&htE4~eW= zUNLv$!+;kR>Nu<4yasN^ftlupiDAA6&UTPNB#;*H6x@x|`lATz_YF&ufvZgk!w`zE z_n-EiT%a|V2#O1s3e4@m0{K=ORyOWy^Jmf<7Kv&j7r*mACzxeDN?Czny|zsgJa5SU ztr4pkd-Hz358_8ak4zsJPR$~--z`leA{~*W{cDPcMNyi#a ztEYWv5G?hzqbSLA9%o3x(?v3hkz zTM#|$UT~Add5D0$0pT^Qc}-AKMO6gD9&|{?g13CGk;z4jce`G-sCYgaUofo zt4beu7dEu?MbC2KT^E1bPDHXKQgiMlP>{%T$WU&;CvLp?t}1*rCCC09??qgIX+qUy z&fI7({*%S#!n~a?Izf_bgu_fP6#VT+-Q~op9{A=2n1fhYMZ%eT6&{{lq;=0 zt&I*f)7qG$9Jq!NkKn@aB!jX&u}nZxxM}Bo3*#RBY>GNaCZ%@r{v)MIN`2=kxIa}e z7d@GNr7!gDMMD|vv9Krs(mt4y`%D@2br``BLs*4CZ1B3I^0w}0OyZUG$IUEu_U{M3 zhqK4E=FDHqCN`N#dPB{LnO+46OeUCHIOP%42x7E*Q2qHyH!>^|=e#J1N6*;Od)9-a1V(0R3JC7NNicszu~ zw`gKD)!w$w<%E9*0i$O#V2#dq&8?_sLf1n8JzW9h_CYjkmp-p`djIT@Ja#iZEjMvm zC%w|C@Sq9DkY?XWN}hh~sPdy}E|+d+gUU>!eD@^su4^!#> zVE=DQn`GRANc*>SN@ME(nWNp`u5$nDLGC|Bg#KM+?E=@*ac$_P-DfcILYh*nkY;6m zO1REQGD$1akkW`UOeeY+IF=j<5uygbTvOsB+YWvkKrt!-1K$dm2#crPMKA}hvIa?}nlV!OM3pGpsmlC(Nrga_`HAymT0?eSMYk6cyL6TeX~#GkqcqcbJ3fAvBaXQG zKXFMBdnTQI99!hjj4&nx{)p-OK-c>8+yUevWzp8Zb}ej;lGg$5X<7*F<6l^BF?Klrc4C!LRo^`Qx+?0UO|##l;;8*@y+;d?CiGEV8D%H&!+2k^_8W zdBo>NlW=yHo_fBeYWutG>kvHS)KSLL&W1C1WH)CGbbo zi+V2I>Li#5y@m6`O83(W5QnPR0J=aKPhh7(`~ z@=DjPY{mK4R5-meyQ4%Y@=OwZvn-+_sq;=~rWAi*AaID&C^CXLl}aXX&|MlHAeKEN z-F#=`jtEvT`Fp+;gvDT9SM-}gZtc(}T=98<1mjuAe}HHE_Y%S9_cF)?q+j`ov`3kx z9`p+MZQNe#39xwuWNKt*C}_!vamoPK$c__pQ?+n&faG`8@)+ritjTm>>iWBYvjXvi^A;gQi#?k(76 zXQ)Q~fq?c<3_CxLFVak^rS$+eq?F@}*c>2YYQjQ~2;tJ)mq$dQk8jOuTBXcKz`0JA zPXSOJXmj)@Sph>YzO2Q@onzo|`{zi+;kC*ZVKC z1rP$o1F#&BCXT^i;zOvl_}@>^f7rZTGTSVbo=>5X#lL6tYj1dv_V)F7 zBfZ}?HF;8;Bh&yWEIzsXnt9Y53ryh|8Xv~^4LYqg(?|mB*A+ABlIXY!g2^P&pa#UG zJ>KtrF?Py=aUN(eFTU9!3W_Wk{W_?f>|x_jyQUF`73LX?Z63c#5_fb2VR7L-$ak=A z8Wq6zcMV@86B}+|=a^##1&D8dQuuE#88`Z54#e)ZJj!*fn$WxDGF&8d5K#z)aKs*P zhZ>@p?G$!*Rix;=!IV0(YmlOJMRN5%MHK@bL>p+4{VJeEez&kP!A@c90nA-F!1M!? zk4>Ur5L+ji;Z9hUoqm>IE*(^o~d-VFfyps zf)!Mi#2~?1!H@o6=dyX3cN)l#&skH)X2;oC_2wbo;>ra=B9MIT2c`<~2bj>^x7swf zYf2?F&wLyeZ6_`<=$!p#D22-1h}U_xjUJ|`TD03sw`F7L&9CIQSsHf1?~6{)BYsvA z@I0%TCGz%vkZ7NqKMh=Ly`{v+FnL5`09M1H&yHoN8_;>VE-VM{$ux?+{vHnNA6DFcs{PhDE-I4}*!U zu|bF^t6>Z$%?%e<;&oqRhkXddGC55s)8E1fuyp@6j9t(SvL)0D{m2GpKz2WS3IoNY zvE^*v&TEf1(N|ufby<5VH_*w?i7|0|ZWKIJV);z;n^5i-wl}N?7CYC-L$>;Sn-F51 z!dqk&;1o1WycsIYU4^V&N{TyRos~AINvoEcy!4YQ`l%fc+R`sRnfO8Du>x%QD61s({W1u*b!9_6zcL^Bs{k*4jvKVf_`RZW|$pAqXPWo6R)zv%R_wtVVF zUnlzX%nK3E0PB{$zYGJ&-xq&#p9+B|hN%ApnKFIxOz!HG=aZN2i5#+O zsJgLS(`}k^Gj}D6^6jy-MzbUc=EN{*O+xFPk3a)6Snbao!piO7PKPj{vMrq5+Q8!5 z4qE9F=}r_geX6bnI4s{ZHTv=K=ywNHzIdH>n6%_yIK57Tx*NYi zGup%q{bKlPkp3G76iX~c%i0J5jhJ?pzPJUV82>Q9A|`WYx|LJZ4Xqx${neU~hxnjs zKCK$eH+g4rbyX-p;8|lpz=Xgx25C#-yn)3={MW-0Y-!a}2W2N~S~+FqZ!o`ofFjC@ zfCEoPKd;$|GG8QHU>*|-Uw5d+Kx$ojx3NE9C)B4vk5n235I@m>{Z5_6I{Ltotq55& zf>u22P@lB?I6y{~WOI-Oo&b{`aE5IWKYcSl_AeFk!k2b?y=L8_!MP*PH!dWP&JTW9 zM5-yRcPKdSSxV}^KWT|8xpvVpt`tJEqx>av^g^*+Ip+)9 zvX`NcET*1fu#B7Ay$Fn7{3;mZTKwH-zrfF%-1URUr{lokxvaU=@zYtFUaQoK{%W&| zJY=CAmzFGru2|CK#OeO6aIH3)en6S4vuN>Nj~dX$HnIKvT($)j~XVda=NYb zgrdX7(Ek36S~jRrQ)f+scwSH2*zU@s(=rwQbb{qPAsxN0MGAz=QYYF;gfiqKCqbo4 z<=o2W$&KR^6(21>04pm_!1!y*a)WK@Sk}d~!k?_I^jPD;dexlBF&3& z^SsFOiZ2jwIS^Z^CVwid@Mdu_vB-!SejDi44(ZJD2qiy=o{&1!b)7O9mW-z6{UbFUF~FYI#kncN->Un%4sk-!;4(f5#E`e;2YiX z;h~`ftbHZz`m5Vypc)h3pLvGv+uq{M(yjRwcn$aizo+A)kgUOi!$3}lnRq3~n03D; zZUxe^Ys2!7ckvOo*&wX_R3^f8&D?0ss+0(P#L!}soRzfzk{2gdqCT%(-Q(lHmiebN zi>>sHdN~nJ{jB>w5|}bELNg>-aU~LE%QEV{gzL=3We&F`Ykwv;gHZa#==*MD7xB1- z;??Tv_S>6T;MI~zkla-?>ZN+l=8NT|8^wgph`E1b&|n@W;fSX4;HWjEE`CHM5f3WSnAwo^)%I z7ML&MOLA0st|CN#qW#*7E*kRw+=(0(E>2W(du-n|C7)rpgy8QOp#YjW$LqeoP37la zJ@;s^M|Vfv`*WHGP7w&)?cM@5X0}u9X>1$Ba}3kEg;~cXU+J&qqYvD_`rJhwe?+6Y zP~(*;p0~p7?MLn~lATxMQfb})2iXwRuxBb-eZajRh>aY@<7fddtlQb4_oEZ)=!J=K z4W4X?m4=#jgez$cw%q=@g^85r=hm>~MS6JdSr_&CpQ7aAgZjC}o|xL{as9jr&6mkG zFGm6lo{j~*=fx!%!9SYpP}pnLC$N<>z#3V&Kacd+8%tMEiuGD8_F-2w)E#U?FPeG< zn;0Zm6Jwcd5_~#mVHnp>JpwK~Hb9%HC=vG70kQMfTOso6k{S-iq|J47GAvXeKkLr< zH&!%A<+e0V1b!QV+b0qPoTt&2JRB*pG-wS^;gj*E=vF)Ob(-$1rEJEC-p%(ln5+oO zi>UTT=5O|*DswuRk|pQGUIBuD@$b2aunW&=g`2XU*1?c=G^y1qeB$f0l9h|<#o314 zsMGGrvQes=EUfSZPW*KJxV-?gzHi9jTMatl5-;H?+@Qxxkcf`R6XR4E=2l`{9Ue?m z)}8n^t5Ud}{ViVObf1gQ_&8d2Jx*cw~Lt(2_^<33dKCi_&>f5!Cr9hl)nKX*7 zVpeYcXV96w`2~6UVHuP$O2=p;i5`6odrz84IlHPd)xyO^U8;D7E*@$m!#!z&Laj7w zNK#dxQAIq_FLP`!eO%F^P+pU_$i6dt{HEicU?{Rk;{e7G1z6QHK$>^Y2W7xblL@wt zp)K}$uo%GHe(0SOeYXuV>A5YVpyG7dtSJ#9@d5Ui_kpjwJcIa6yoso!MuLA0T0++v z$<`uz!fCI|$X(dbwh7LUu*jQ+MSV|*fnwh)=eQ}|;?Z-J6rFrnJP>=N-}wY_M|+_d zA;XXL%nCX;rQo>RjOpjbq9ccHbKQHZD>El3mi?gblD{l!CTtJi8&>8BW3=W;8SFzT zcf#h%vW?mZc!c*Uan2h8tY(^?hx6pAc%7}AWi+j54w`VQVrhoFwKSr1>JLI6cwn!2 ztil>l#B8P%bSyZYQ}O+yV%Gv4fG9osmXOtdjNKj?hA&zl3^>QpEpx7(Ly+>2=zKdv?IMw3 zNmV>vtpiN$pqkUBk{Z2(s2mL3-}VEg4{DTT_l#99Ya9_8ekEw%8MRS@u-t>X{jBDw zOwY_M%K)C3hEavv`$AD<(0y0O7EY(w9e!(rhp57bK!`s$?>9NG*Cg_VRQ%M;c&DYW z4QVV8Whucqpz59!rW?dpnZ=PDU7kj*0<4h%bc=8X!rUq>jq<6k+iNHgBX}alqyHRD z);;L7;l#b>fh>RB0SbZ(lJs8ZY#R{T(T33s+iPFsbv;Px=P^)$ew6hk{Jh@J53oY# z9kZ(K<7Z7+3w7|3HzSC8p=C^9sg7>@Nuv=Y32nI+tKl6BH170x72c2|@l_$HW|*;+ z(F?83#G}^z+1m|AqTb^fAL(}Bh;>0(_68tD4Tc%grl|Y{8M`>7r)y)}hP%<2d@o?J=a)_CTGCG8j&1B-UB%no9lVt`sfsbrB(w&TVJlzC z(n=(qsQ1fx6cR(0lB&lLSxCyP^1y)3VxsY&quz@0>%7vf68bSlOE7S{Y#v5@dh2L_=5i80Df@2lwpNg+PCWDBdk*CXMb4t{Mfp6B)9{ zT@oof-;%BDYtcdTEBOO_;Yt-f!-0`cZbZW&ce1CG6sNS6Pd7;%3WuRp>qYaA|1 zxL^PP#Qa}}JpHGffd737{U7LuT&Qc=u1fwzKO~}pFC_`f;e>Ne;uj%g0|l*kN>N!E zh2}YE6Jt|*J6xg4=Ub}Anmz%7IF(9S8xq(W^VWJ-Dr*%VZLg9WJr5q$Wk3{vG{=I` z;Z8C(?0ujF+$060SCI&czm99VNskg8Arz-D(opPv;I2q+QeL)s2U0ev6g zYGkn@j2Kp)#7H4l=rUmnp2#knqn>h@Wrblzc0LJoK7xHx2$VJfoW_dlPY{#%h{TP? zF);>_3&wOo3=44-dj7jBylB?8Fz?7c{+gM+pb=9x2K;R1n38JDF=k{);eb30hRCo2 z%O&x%=kA}*OsO0bE$6}x>XXD3UBews8$)*s)^o2IVA_-uOU=UK6ZSq(G@{KsOJZig zY`IWrRH>)=*vO$LaKBOIHC`Z#)QjAg9Pk+*^8gMbgY*}5%v;ei7B-T!2xH_bH`}L% z@jT01+aFx27wvNAgXU%5Di$rBSKXEZf4wnhG_RVWZl^Fe^mh-(5%IHw9>l*DwQwdo zpodU8RT*A}`du?L*rj}nH5oYdn}`dCw&FmGIIA4z$T9d~KwCo;s_qd9Eg}`Yq}egd zx=+>C87=f&5o~A8@;MDjguy~Q1!y@;xg1iO_mevXv1&f}x=jaer{fYMq zb?Q~Xdv~wdn_Y>_UPEe%ZI+Nw4ROQON}oWI-C2!OFXc=X7Y@T0&RQ4EYMoOm zhe^cN0rYHLy|I zjY?`-`PnKbM%aaV!E>b0Q3&-I=G;nmqQW*1XL|>3Lfe_#3iqprM3sAMXOx4pOM%4dEv6bcDhs}*)hWf%j`o^B z&?O~Y*Ev3onawSQHz$ENeF1LNOvZg0vyt4!_)um`Atije<{RSIsp(f6)zxm;mWD&v z6u!ati|)ivEwW?X7sQJen5J&x^hj|u?5^`GnI{{Ha(ie2>I zGmA8(9M?FIzCqykzm5osF)UmyWo!3@?K5yy-o-`g;xiOuAS5v2LC^sTOPD^d)?j^6 zvg>$5%^X7LnFMmO^?m@@T^qw^^`xfU2;U(@fYk3ZNUy;73^~{=N!z;-*OPpY=peuP zZ_Xw?eewvFXnx{$1TOv*UHVigqd+f3*raGuzz&&qg~>!0$f=MP zOy2S1dAK^`s1NTX%+;b2Mz$dURk3jPFLGac!ewHPj~{Cv0Yb~$rzzG1v0zM-QUx!` zm~yaTVGe^9BZflI%V4Qr&O_c8j#d1yV(RkAYra*Z4JSZrm$ z*paQKjK@ zj?}9_64jaWHNgctQ_hFCj%Sc(o~z&1p+Jn#vt(O#D^KLbVy8IwMc@f-5=~tn1?B>CuV|`Z?r1Og z07wh1bm?UZ!pvr-&IJ6HPF34COEtX-=-FvqgG<)4hr+m5xft2JMirgBN7I;k23)@) z_SDtaWoQW$vI(#MLkeM|9vknn|H2P>d__p(fPnsBg-yqJN|4Twy@_SPIYRVBUUj>Qu@ZSi zEYtXOD)MJ0ldwU%`^V*A-^@_w>tNdwqFIEYUtYJ)&bMI$HtAIr4WtH?OqohjIaDw^ z3eLZor7kTUH)plZ38O4G?*fvXC!a$)`+{^gUE=XpEjVSt?G&aNGN%kpkk?E3ApQh1 zG>(+`^keBo3QJmh+W>Su+mK^V=5vadZCe^ppXeRgvg3*o_@FMcK`Q}4>I{RHi?|U# zu)`>j-KjrgOpexfHj!)>=jzgy5H@E2a1A;VQB&v3w@@Lmz7h1y))dwNb@=cy3cA>k zT`(v2?go%b6GMu?A=JAPq%LDO-5wl%Ev=(#NZ^(1EJL*|whUFL>pnWvj&!qrt~t#q zO+YM;nJsR}+d!lTaFw|qGgcB->TwyU3*SkC465e#N7{&9t6C*8Y&xJKjJpM^6D7>SB<=J9 zvoJ&1mnXysC7G1QY~sG&3ve3$tt@(F1AZBD(Zdd4E0NCBB_D$~dJPX=bz4sL{yI`6 z77iZ{+3cKv6vTx^o?K0zy%U(&6Xh!%;8fxJtK^6GySme~T&;kNyW!LJ9A@mK^pch4 zNH<_G_2q~gptaA!_I{65jrA2_Q~C=HY^hkjgwnb{BDx|}^Mkq9)~&(1(Nl@GZeJZA zzpVkDu0d8&RyFW_!|zwfCsk2ttus&R^Uz>$&nO(MUnC=H0Wf|b)7;nD$oZTvNpM<_ zah0+SC?veqQ-HHoNbT0)yr%`>l|QP8UErbnz>MvEzL0BmLPYjFsr6%pVXHZA^ZQUm z)`C=v$Ax-Mqtm1wWIoa5sal|d?zRt7;*Av5L#u# zW#YV@!6oznmvWXP3{5%DzvH5I{u~x6C%y6)1R(F}##mQ8?g;P%;L;9uG!+_zs>S!k zLdgN;(2{%-ok`iEp77e3JiCg<-L)>;D6jo_qs#beCaA@Z<`b`nM_YrLQ_wgv6zib> z!$upqfvcY@86?dhvbqZ&WK7`V*Mvtv9@=c{06fewm^KvG!)1<()lFNAx5qhOu9NVU z{+w4pJo}6j$!^u%1!Sc94N0*m?CRE%#2dF19)E^~(baz2^u~Czf(}c0SQ30Rw7+TT zzUG?Jg6kaEN$CefzsvsJZ|6Uixc5<7^^)1E-s0Ll_@UPLTyod0>zkbRF5*Hc?QsTx zOwqMdQqQ;u)JEl=4Yt$!>#h3sae6i|Ynb;u>c{5r8YmWxEfzIkOj4!{Dtq3gEhVDo zRy5ACdN>OH@ZWxkVJH13=rqgX%*Dxax9Rmz?qbXN4Ni!g#cNQnBW9CGMj|7nGB0tJ zffLHUkfr?A#f;R=XN6L`bq}(bN${K>xM#e8tb^;qs|02BgL511)>o^I<)SRLGigN` z$vn(;)f>eqBtK4$Tv}bqlno7HCBgI^BhVWrB{w;Kpk%=~IA{fE#!o%vkg8Baj>|FN!z#CO)Z^=;Ber!JI5DYP$ zgAOT3S&>6JUsSqF$-Tz~UC7k&ToP84*F$WH4@lWV*{{#E>^3MvZ06cX?>M8p8qG0> z9?RN7J;NQ{uO8po&}&_{cbbdakzyOXuc}9p(U7O)89^?qs6WF!$7b8&y6riYf2rF$)I3OKWlbR_MMZe z_MLRix6ik=RMZNME)-j&BPXP4cT_ki5EYvJRMq@Ba5^9bU*=E?i(VavAHFJ5tn`FC zTVyHk74iJv^LHjYM zKh|~%t+T78NAgC`Icm3ogk}vBI-2>-n{Wj*KkBt+Wiq22Szq2n1>n0|v2Veif4`e- zLXDFtyitd5C`WRYh(d+l`MI{9o>+!_)SOjUKIOVQtS2w;4{x&BAr0I3!V$;qC0mmW z!02K2h-$z}NPOTrDep)m63Wplq*BOyh z&CA_z(_%+LAh&nNyWP{9x;5V|PzNVZCkAeIeLeg6@%jDl*}>y;l&((0-^EwUqsRBZ z36Xo4)y3Ysrec8jnMJ+BC?VC(;zR*iLA#GE8AHu(K*XgENwcBZv#1lk-Q$HRGv_{{La#Vp2mrEMSmOV(`KWHnKsT4WV~Yq zBDDPBvR4j?2p9#k`3M;Z^p1?`of9g_3eO|z4mUv6v^B8lT65i`-WK^uyTz)j)Uraw zZyL#(=_n5x0{*{J21PVn)1 z1OlSGYJbYTUMRpz?E3#e(+{u&_;T<9V#JNmEJfgR$}A1-#r^#CyyiC3`x$rg=k3a^ z&W-vs-F33qP*Ek(JM68PesVrwR9~5{wA$&$E8HhUqLj0W=V<$=F95V3qrQoYHo2)v zL+67UrTmuhb~2=*RHq*X9_{SW6yN_@LeU5A7Y`!)y0Yu9;Dip$_r7-|f2aa<)P#8q z6}}97f%WkL8@0&&J2fx|(6q0>PP~Bn$Z8QiU%ADEMN14{fJemN@ipV!`5?|T8cK9&+r?0abBTVxM}Pkq4V=t2 zN+?<3&+|AI!WTv&G8n2E#I!bXa&E-5)_*Mfo8WEDOyAZ$`leQFYKh&u9K=cE^C-P%+|^@4UM}8L;)m zUD=Y2Os>#)YdSPS4AbrCIG`d^xM5T1r>fW-xIQ71c{MnR4fu;wAJ6Oo2{?(n4O2Q8 z>>=`1>Ng^7-BxtyIiEvS#vr}1b-NPt%FF7*aZ45n=PDMZKUQ>5RN_AV@bd*7N?9U> zpT`UzV7$=n~XWnt6PR*`3OIzLdm>WhV+x!7wfp7|wOizRn!sQ-Hor>= zR!S875R_X<3|{|u2b8cB3%E~NM^J;!6bQ|ova}=@Dw^CKwMUo$D1*W{0|Tg3VaZBI z7h&D7aQd;t6vph=*0!brx@lhyFG0P2v#IoxMncL9Ng1V8W`yGO{+V#Nc6b=C{kBAU zXMKHzU4H3aIw^er;c#K_p)A>UyYkVKF>{w|RuN7uVA? zxhad$ZH4XHT|~>68yabKLezK-4I)Je6;Ikd86Th7U+IJPqf%8DhR_qL@UL1%Nv_PK z2^`H`7Ik+Rh+0LMrP#m+Jtzdhv$R*0S1<=|CI$AR0KQTSgO3-OTg41$iCy1d6Ms~G zY6!GCH72Y|*sOZK97SN=DnmsBdMVkxLF~{hZqt5q=E!`)U@@i>&RwF_%gDz1_#zMCs3$NoU5MYIx_zaceF365VybV{1W-H_oO@tj zlXY~SA~;hAa05N#g2Ap?O9xDwb@Pg^K$xc~dETK9(*&{VmOLTF;23w_0kikHd7pmE*9;o1q2~&ffW8`Yl{rBp( zl(K@`>2uy(H9$onj8DO3(K8L>6fO{F=q4uonzC1L%>F{*re<>ro}}c`hc#kJ&;2|Z zQb+aIvVwz)RYi=SMf065NS3&vbT|6DKZfu?16oCbQQlNJ?s&W-?MdTOxiTd5O8ioMDnct=H4%?u z0_Qnk7m#nsAK+&g1_Ob>AZl`n{agmC^S_PO@Xv3U)fM5seC<0| zAX|iF6X0TV!eV#i!s#bmju(i*4X-OV zd(3ET&#Y3q_ASA`KFhE=A@EY}K*%nWz<&3bi1KwHpOrMA~qk z`V;PKKI<3um85{%GAPKU(Na@BS%*hh@=g(F8Lj+96;H>>l$;~pKQppBX;qkYSjhst zu)oeQsxlw#mm0T9p{-`IG&CdD!JR#qiuR^BbJ;Ja&K7@uLpd0Y;598Tc`FyaQvK9w zvR^0x*u&wd`l<5f*a1#cCwh$hm2s`iZa8a|YY)HyTHbMu{kepf5y6C@hnq?H5Dh$1 z3w``{jSY6H6_vLJZQnx+HX@zc*i`zx&ig9XWOfq^m_)ot-iLwDRzpHt`m_q|RQ|^I#g43HrNC3HRCXH<_szCYE*4cfj1o ze~3Y~^!=JyB^U!_6%8h0ZHmcbqSBY2ws`^oT-o6a?EkIZ{7h8*rwVGMy%uNg2Ogu|OA~`3kjA>%I8%SO& z4SIy_5jbZF{H@IHWZcs#ZI?Igs`*;sw1tX7y?d$kQsTSVwu>DLxGQR2%3yaRZIChy zo?3&;FsuCoR%~Vdy?M7w$_}w`3z7{CcuTEYi>uaJ`s!(E$ziCzic^-T#To)rDvykm-;!E^3+&li!Zg@QOilCdzEkpb5sX0ggnon6D4b&}Cce@#B z>tM5b2s^1p0S|Rl`Ff@VtwssR6;CND*6;V({??ypy4W2Yz3iT|0{o@xd`WvYH~Bu> zb8cjN{O1k!mQ!a6DoMukjpRGaof80r&dB@_}N>}Gdb*wd&ilISKUJAVC+F)Rv$0* zEiM4h!x8ftp$Vxmf+*jJ-nV03FgM78pXC=!cr-}hz|g)>(92x0SLpTb1vkZOb4nx+ zMt#o~8sU$*ck=q&+%zZ5o>RjZm8_ml!0hRF0i{u3jzqLzWOinXzlpd6TUUr%4)Phq z2n&gmx2B3*TI7)92SKa-!EwT4J2fomez9FNA3OQ!(t^LGKuRg_;*$E%kL}~QrERq_ z0?argIVPgX?%qBb?Us*717tu8+8bt;ChgwBrqt{&g_H?wOo2tBTL!Tmfu;Pano4h> z>2tMFhGJaSgmX^8(*#SiU#lE;`G8OXBK}=@Bm%zAxAdrumr`-&{>d5hxlA;;W~ERC zirn&yRy|1im@Q5mW-*V;6_zPX9?3Zni5r*gu^T!d85GX9FfUQrQ%%B`V9t%7;oUa! zbZP@Z`-gP3!0DMO!jC%S4+FZM)J{*DgJ{WzPkzx1ZYn$Z(IWEs`Q77sk*RyeNuSKs zodyu}^KVq=b)7}w=38Le^5*M_ZV*5*$SsI-2}ltyF@zZ~dD$Ey6*>eQ%R7?Uro=;b zKWh$<#tPY&gJp9!df1+U5#b?ORP5Hv>Y9f2E+9jq7<&ms+gF3HcWZMwt(kjk6bz|J z!r)&KbQ)-?bC*Y~U`jrQbhnHB&AJypa7#>OQfLMGH4EtX$sw98lxc7dYTw?{)0x0d zvZXcj+ER(S?@Js@G4;t$OEh>s9-aC*+1AHYdaBY@bO{WM?pu5SrQ|ecLHRKmiC7@{ zicDh^kE1VU6@WGV3^scYWIWo#L`5rPQV{oNeog?o0CEctPK_L?iglI2?oQ6ILnXdF zkc+_TbJiTT;twQH>_NG8_Iu}0evBG8X%5M#|p$4d+HE(3}xiPM6h8W?Q zO%*KIajlf2)z2U&4cq{ozK~O0t?jMY@L^TWy8eX^aCo$ zM2|9Ns4?Y_socmGq`b`|wRduVw$BvQr2n(sh0{r*>}UzAz+{tgFYuON%Mqeyo4-Si zKz`AfaK}e&4gL(-%0ov9Xp8fGDoch6sQ8~=7ajWTG!8u4(mwW4J-f6AhudC~?;5*QV;r7@+AlNb7trx4$ zsnmhyhOFBJgfdkzcPxYy;F#kPY`Zw}(#QK^qhz*$TGe&%j#Sn(AVJhE}1q&lFZWVdJa})tv37LI<=Qz6?o8#+J?w$k zH5A*w^E7WyfEh;hFw`YL+f5T9c$W{jPbkFhm8}{wj{Wi5hb&1UjoW&)=L}nHRk?ag zC`G4unr~|tZ~g&lAg-w$MFq8atJSmR*k&kldgUle8Z*USjCnC1UWZC#h;zfKg8zm&u;u(#xd|lWu;q?ByDR`E^dt?@IHC*jw-9zTF+_n= z6%g($;2mRHw{JoT?x>7}=sb>yW`U{E@=UtLeM?Gx({YYgQxuvuxO?%?zXT~~w#*^E zJ;6Vo&%XK)H3zOqb(1L6NK&dnruaT+6!WQ0TV#afi1SitCQSYL`LyEQD=DhW){&5A z#wQ?D>k(hhcZ4bqSM1zcv^rF(E{Bb_r)Vy71NFrZR^(&W+b?*aGLm;|{FLZ^jV!Ph zK$agZP*PyeqlzhrON!$!YCt-;vABgd?}?{7r9;)3as^%;f$p+nCHUCOgdX_Zhq2?u z;)1*}WOs9N=f%Tsf4pp4FnRNmncs}<+PLs!!_0^|{1EE?n<+S#D+F*}0M0Wfq6J|2 z*jygXY~NISa)rN4pLGU9-b_1uspv!UG-k$#x{QcKa&QD`8iqO~6c_~ZJ*j%8LZc-* z)cJKl7Cj<3PR<(+QCBeTEk8^~o!g&Fx&?(hQrXz&XMs5lihK5+Lc2=$Q%|AUC(8EI z@;96Kpk^L#;iG+AqgFo5CbnO&PV0s&BCa27$cS%&p_I_$25ncKVX489R_fM*$Mbb*B4p#zVM(qzL%MmLQw<3e;JpP@+sG>ZOOHhRuLM;Gj&Xy9z z{&)(yECL6A2b)_wDhT@#E((7d<_;)JK~V{=`G?(}B-XHQ=T%3R5rQaJ zgi~STHiir9s!`I6-jPZwnXU)XNrY=N`CuHGt~0jOA9DgksSkHpK;!3$BD-ndavM}A{7 zHMeJ4FPOqn6tbz*UVlBd>sVHAE_Cm%Hky3S1sP$8KYURv10aMUQPSWl%G%&N;l4p@ zO!fLB`@22=v_ub_+pQ>OK7Q^*OM)@){H*?_<=1+A2%1fbbdz)PL3d)XHlzdWRSDm$P)snQ}&6@CjQ zRwW9u1>gaTgsY^s?*(z_0K#-E;|PL$POmupgAo8ER5s1h^5Emf><{0X2GD2p@c8(7 z$LF5>xI=Cslz>}5G;Z3pu=}lhML9%{aF~pNI_P{>vSF=D7P1$YTY>g2m07RJi< zAl}Q|-Ys`Ok6=TS;__$rCR}Cv(}hYEL3)8n%>dNP9X*e6{kZPHkS)%86U?va>CI$G z!G3`cNey+)E7yMC2i5GLP(h{mG+=wOLoqXJwx5~0KBx);=_GG#^~vdzsdQb=!t5B!JXj%#6^5++A6Lr4EJ|)baHvX#Xh!P;3K0OpueDNq?@2Y>MqUU z@tzn_Gkgtcm$IpQdzllqd}9i@cLRV*Gn=c&f6Q4=F>$9H6p0HUhr!%im2vNg`e`4h zPqNnHJwj`@nW;1wThpb8cZ_81o6_De4^TTz(vG!G+&KE=_&~3+cH9sUWI1IOGPWFs za`V%*^|ek_%m@o-1)QPT5TJPYxH@|`Q^^iK1 zw5t*=;qXv$4J7h_3-)`15}SNcW>Txy?5_l!q|f6t=!L5vW_k)+AcIs zDfsXq*WPWp0IC_Cb#w{r^XMv>a+4_t;I?`;nVDcTOG2}H2!RPRl&!dak(ObF_lhvxox;Pa5 z!D>3cs=*p>%q4#1$sm($lBnuoxGKyKgdK{H?DbxID~I`X6}t~m`am=8Fpn?Lg)isz zS1&}hFbw;>IpJS%0XOuviaqj@dO&wye%3A;Y3bcs)mr>KS(^cPYedq1lJwMRS`;be zWk6*jCsK334`Q-->(1Xf`q|NcQaqr4Wm{+FlyRF`i0geqos+Eoqq740*QGwVp9#*4 zdDa$q{MGAYjPW?|;YeEyJ@)+GbklinnmD(Ns#~s^DzE*AEq_6RAqu0Ra2UQ0wfQhM zpHIe8OwcYY{?@u&!4-QO+T|8sl_dZ(!lNAzz>I_<|8cF_NKC;5f?F0UL3BvEkxctf z<}K>zL0DUzZtUa&Y({_@S8QbSd7v8cM{V~G!)5*4)^tBhCiVPOW_oV2x-r?@)qz2R&H=K=0$ z?NVwHjqGQ5cB9+j%$t!pkp#~DrHy#6atGl8<~d!E*M#sVrm;egVQi0sdOqATp=9_z=O-CrzX_SN{<1iS>tRmG&$>KL{Yxpm-#E0NAEl>dBY1rSlE<79@ffeDLB0_7j z7CwZJ+5V3@6dES?K&22vg%a_WXh9NpVS`*mZ_#5C#mvoF^d;$2tR_*((yZtn0u08H zCN4Vfg*3Gdk&eETQ0SrP4bmdm(}-c!-4MBmDoM+i?Ooh8x*Ge}!L)=^EGUs)v%j53 zonvYX^(FD3Q$shSY)pY4?&bnakf$7YnG*!qp3(pp+7q5LXLK%ptClrs&;Xg~z%g-N zBqO?R8|j4=6_qX9uK!3K{%i6@KO{c=U<^qk)-J>*aC+EA5C$t1=Hql&$f$Ec6Fa#m z&%ir#S(DmlaP<>3ojtW*&JQGL4(|6HKCGB6&>I6rFDEbdK-kyE%jcfE154n-i-Q9f z4^A|AnQ%8(=+`ZAHcV)k?cZi!_)q@(?2CBlW@D-pdb!f6))5biGNO^iS+xN(T+?OZ zL^2fV2@_(ZyXvWd2t$KJFdJwI+xP5C4p`}1;P>o{>2$&xh}-TTj^l#0PbP^-ji}(G zt{5<`Oi9?hRZ?gu+I@rk4wF^%uB^80H*UKo$NEl=fgY=u+K<=+Ag@{XfaV>K4Q{Bj z?7idBc8?KT<1r=CoN>lov6BeOL18?zbYQuP8JMOmhNxG)C9yVRUlt*iLIXc6^TlfP|(PILK*NZUwU+{DWQ--EfFu`%M_PVib=uB zH<+bTThda(sm09D@>B>JG{`iq(mfpZ2zm@~ zHj%fkTkqGGtrlbunO)1k1>-y(lzj`Zik94Pp zi9SoDcN=&Q1BO(%q`Ab)0~O&KY9LsguJBvVhLI*ajOHA0Zn>%afw4%^=j{*}%*%A& zfAFK7f&M#w>&P%- zx_hfysNYp_` z62nNTuR_w8nY`qgoMBU75Z>-*2Gk;lm$4S1g-OcdDAXdCVhvlxP}`Nmwpq&J8=yS2 z`g6S#<*Kzt@WsQTZU^qf8xpkFEzMwO=SmsJ zpJ?L3oRtJ?Bxv@t&IDL!(zlhvVK>Wu>ZJ(ehB-{^v!2Bf)CKvsH%flDWPC5Z&+>C+ z@in~5%9nigy8yl&?e^0k6IMUMGlX-Bv8Tqhdmp_IAKjnurxji1IuEJchE{raV@(oy zs>y;F2hKtd>l?3&b8!cy%!jmHl~wOn@~X+)w~rs*=U8!4Va{%XLN~$MjXHu!Dnye` zeX18(hwh&W?Yb$_0{s>60UIIrWwSm(4wBwXFcq|Qw!iSz(kElJlIHJl7gw)sd16)7 z>={-z?lq3ujyu!Tr0bzaM_Y$6SH=Y_h7Kw!)Caz)F9&=nl<*x&GIVv8;2&7OmeW42 zdpRobW0shrH&d-64^4U=gXwimv)g%nuO)piEUz=}t0wB52ZT2BgH)Rhj>H!*dy&CI z+wpTl9-fpI;$y=etld{>cI}M|W8I+9Kg!Bgl|(l4lF2kf!A+#>chppaVcH5{hA`Id zz}3-$b5oZ@IH(u{AREwLIZ_Yz40cWRDIECQrtxMU!p z0JYQbpB{U_z+#gMx%CXZ^C%jpm#Yn*E@+F}=7HQsHzu?WM98MdwGxAYz>(MV$_`ye z+SLxKhhXgrr)6BZ87~<95Hl)t8Ou~kS_o3LjwL5GEgorJq627J5i%!hqTx~@j@PlF zC3lzMVKxiN#r@Bz8^#np!?rYA#~}9 zMJn|5?~!=KNmNrNUU;48kspc)C*-PXmd#AHP;=(^{=$lSA~O(`(rn;M8$sKI+5_AN z)~VDJQp8%b`_?p2(3QI>s1=7EG+G%;j0$n`sNa6va9-C;hF05b#+&^K-dj8K>-%ke z1}$2mn~Jf?dN4wvL2l(2CZ5ktWwLrJ9#qkSEkBc$iiVq54?r!3yulhN^%DZ+NXz&v zs#(T!=-($*?vZ7*OG~W+h@I@Q^X+)d!3QX@<>6Ov2F~2q$>ZY=s`%+@>sCkhj*c9h zSoyLVqomn7)4TEXW9Z3VU8h5n?>lEetU@{VtqUlDXOmUr6F3}&=|Q0uDId2` zh*F&~iCerC??Vire^9%~#VA4KND6miA;>_GrDQbM7EBIwQ_SWEG3_A0LE&1#nKHZY zGRulycI%62W@u&H?bj~=DwfcGOxk;>Xk~~M4d34GZM+;l?w+Zvf}J<)GW-lx4*J4{ z!*|z;90a|A$?demoX#hTtD$bm(&o2OmG|YAHT4}>|M_BpN&T2TVpkcxVDXd8xed9w z98rcdN*Ruly)S0rp`639QH?EKt&U_pg>aIMFu1VcVEE1n#X=C{5^ugzDQ!F8()UDL zY5cH1Z#dw`DX{ zF>JV#%wiQT-5%E*B<5C4I(M8qPr?Ag&P2h&V}jPq|311Qww$Cw=mh&jjke|D&f0bI zuf2ET8;L~Ybn0isCY5jyK3%4D^0AUp2jT!QgRd-2*56wW%%hZQxo4Eu2Y>n@oRQnN zEgkmsMy#KYZPh35S0U>sS|+tzczL?ETicwI5>8>>m8mF%_`*H}F7X6|A`m?ApHNgZB53~`G2*q{eR#bzMKBe>tZOrFLkSC z?*N!o4TTG6Q3MR4}f=i^pf+sN+_RHAYlI}<~Z_^XPr3XOP*>!3Z;A(y8-6D@@XAF?Bg<6em=*1m@t2 z7*5^Nw8mn@bH@j1>4D5BsK8t1t}c*&GB<)=2ir+fp-_@Mh&0U*PM`>Y>PVtFXNFET zRWAa5y&8mscNBgLeMm)UyqSbh8Hnn9)uc@Mb8_w2viz+^14h%zru!GHZ!cV2-*N(C zbZ+L;B_X%pi*`9*-G7p@0BaED0I#OoF$8i+alHc=Ck1sa9QjLN`=T6#RorI|K(u~< z?6PMjk{4lSOya7je!+}X>^LlFN+ zorE|S*&v}i4ve&5^A9-Fi8EG?)`N=(BhC;jYtFB!kvjyZmPIAUyL+OY0KvE>*PCrYb!e{ppxUfCR(G)~Nr=CaLl2#70yWO9E zhnatSZaVs?Suvy&5Iax-JQAsN3RDDs2{Cid<{-c0n$OR3rK)32Sqg<7KwtgA_^fNi ztjZBCL6r6P6A)0i^d|vTC_3dNwnQ9ZB|~A0JxikxZ5g*jj!e|5acW2~fkN^{=i;XO zp)D@;lVV9|=OLM61`?F102Xe<^pyc;perisS>q+z%eGigs8G0!$iOdd@du70{TYbjkzXi(rf?oy&X z&}k|Q-q8e*wM|+ZEY3I}+|bIUwfSiNWZVd!7@~XGRB;%R{p|Q+N{sR46#@yA-FkZX z8>fOq_8JC?!)m7ZE`2&ueEUW|jO?^ZLYZ11y3N6R`$p&HTQB5n8AGLXKH(FVYJlb(MRhf{xc0i~fNSVxKJ zeyk*^b3|4_FT+{>u7i0Xi7ma^tRWTnAAcjzJx+6LHMgpawSw?Tl>(n zZ_dFNVZpRm-BO{aNzfpk%zq#}X7O{+?PVslf>3d=pn@;r>6{XpL5EIP;F=<<9+{8| zpCMqgS%5a|h=>^0Hh~#(T!F#r>Jh-hMy4oQ@y^0^IxNAkrcDB-+SQjZ+EKc6`Rn@? z#_cS$2`59sG1p(k1&z-L!r#R4fn3gVf0pLtt;F#JGvKUgdN}kB!0ISC*CX{Mg2U~c z&EoEtvpj2<3@=(SdO=R%Op0*?kY2S}w#}mv1o2+NU2aoTsT)hgwB{ZQsIurT8COll z`T!~|K+J>I9<~#8*`Qi3okT-9&kX`0mI_z_&(frseLhijWQRU?RZcCtZ5X!9c!qw+ z78Hf-8jGnfvGQzW@v-_}6b+D2ElbuB-_uIQe7Q%f882$xLhx=g3v(Lf8D_CB>8W4M zo=Ifi`15QK4%)DZoOrHOK=+S8ong6uDQl&pt_w9GEkfM5ZM(>`s98ou^Ts_yQ+pvW z2eR$Il?8HpYm%YL{r(d#XjV z5I?l=qt^duPV70}=;olU2=XeG%=n0uZB=zM3*w6~5{#H^Hb}E?Y~@T$h&MlZ%>-ze4jVtappPhm^3LEz#XcmHw&Wk zMJ`72lZx?;>uS#M_K|yQB<5sYEw=X@-(+Y9dw7}TX5_~KjIDM@JT}WmBjOJqZh{oKz+`=7Qkim2KY!Yo4A!P^)rjj`#dHRz$lMhpIDAo>yA z!Rv$STf8>tTW7;p>|thIHTuZE?XLCFt1)h39hNy<(6YRKe00#~rTvMqY%V$0Sas%} zt3mREM9J8m_b7Yv1!I5~Z{Uvr;yr?WT3B?j9N z1K#-Qt4dw(ce%dgLW%Ta);*S~N=KXugZ@Y3Mby?#$DH6ydVfoe^#S!$vWs}t8?U)F z9hAp64ezZtMp3Ka_kt4fgI2;i_k59$qV z|8QGjR9y1AnOr9W(`uO_ZD9U5?qRnl$H4oAU}qXVZUiJ3G=WfB5`IQKZ>N|r!X^7CkVl*KvUI%L?aF`HpB zF-4>)Hp$7J8AyPClf*}+`Zcj%~(eJy`mKuO_$(Q70zU{iHTu|94zOAIgPPE2}rSnq75Ea{nia5zg zvV^oVOGtgehEAFiC%~rs=lf!Pf($rpmP9EgZ=sBw=PXPYlyBZ`7+1HxI)_TO;m+$Z z5&a4ZfIcUj!#`gq4r|AAyiq(t#&Rh95+q#p)R{ftXvLw&3g|?7qu}J>?s0i2v$7~2C2MxB>igA$$jD2g2-a5 zyW^G+Lio~SSgQ@6H??GCF)p$tdX8^H$!!bACzLGr_aQ`AOw_mOQql@=vZ zh1WAn;#-Ztw%jEDZ zIp4HO9H?P22%>Ba1dVYVz?-q1@>eHMZES`-1>H`ChYn~iNW9;W zx-QT;^t^FW^6vTY5s9rhCmgnTT*$5-C`Mm+l17nKPZCW!Aynhe#yV*KPQ|}G1C@k6 zn>_zml@TEoMRVmdb=j=<`Qze=3nA7i|FKZtbJb7Y5m!Epp4WEyJ$={$M)cxF$13v9 z2AGIgs~{b5O{1DKh)$aBL&Ug-a`UVZyi|gJKxLshN^2~^yADcWQv`}Uh%&mA{Px3u zEAtuSaN%?>ZfpenmF4x;kii!Nwv6EofIaE%>eP@0b72b?W?0^VA8Y3sfYQtayw@y~ zmmo9oARB6Rk*<*LxW854^UIz z$0*n*Zj@vCXyE`lW4R1jiJ)4?=z;}bToMl(Q=-NRxv+35+r1`@2!Tq2NUcZ>--CGl zWxZpy;l3%fqhAyJn76YF1`=DXoVRw7uHpp|EPydIR)V}M%NVR*3=6kZ#(JymfYYwxR`6ynEKBp()X0Ai^p54BC9Sl>4o=!AlFMG z2~Zqmbj7q(Qfp=NnEQ3BSyX+Rb3$u>Lzm7uj|0l$%)=WC9!dE*<(3C#2X&x9b_R&W zH|Y%5KA-aYwy0RtzRSpEORn3@J5;Dr^)|SUU!|6ZORcloOzDDoq(K6ORee~iceo}I z%E!~U14e%y)tmyE(p1aXB2|r2w?zJrvYh}!&#K5#5rs8FiDeknFeh}R|y`R z#iS#f2c_lNW0%ZB;pD18EtOQ#`1XsW`F6{s9VLc!*Q~MZavn1lAFq8Ec)!hsNQ;Fn zC#>7dZYk>pv>7_>6M$0f(BC^zV<2tyN65Nox#(8(DopE3hKf-mw2E`on2S;pn_Uqo zbuWs(iKrXT+ol~?+g{>$+9^=fII4Kfvv){>T#t2@0Leo)E&9{Y!>k~NIb9C7;t0gMX%U>$xm>s3O@wx1nl)zLj;C++8>KmZVh0P2bIS{wR0rIqKKwDlwy+ybt9o%?xZvvSwVf2%aVP zSN)Plew4F={_J`9J8S4it6K$tzk4zM-40`7$Y{uFX3D@|!p>>R$ic#3#BR#U#LURf z$;@oZX==pEX3D|A#KK1ZH>^Py2ZH|7_wmCW8UPUFua5-z<`?|kBdNbaff3edM}NOt z^L_CBS3=pEx)_=mx){<~IosR)N8G<+|5IGtm_E3E0tC>TPpAP+P%W)|eq*#wC`m-1 zi$07$x|dg`WJxcWa+9j=@4wVi^AXituP0BEiMIBa@4%3bxuF^?qvk30Sf&q1T5`ym zPme)kFqfQyQIOdJRXizD=GCZ8ixKwgQKjt?oP6AH!=Hkt^k3i|{&mS3L_xLAee3t;hyVb*{%!e*85(~V z^&YA&mNw4+h^hW-Q6aehr@QQxrmiySt_>x?atn?XKR{|HaB{dxH;7TbXU-=d)B>`v#V?$U)W-$@@ zpv}wOJm^<#YW?eks1CDfb!pA2c`7VS*a)a`1(HdTy;}@R5p3>NgEGPOq9ws9M`{@nzvtrmwxrm-Aa$ z681ih@Wa`U+)BSJRb3lw_Tu#2qCSQOMSZpN;}~2(bq2BDI{P`y0Y#=4;Jy1&HiKJ` zEx0S~fUxf=83md}+D(u?ttNY%YH>u3M)ybWC?Z-F(o|?LR2)#v3Ft>bt_D&HQ)oU* zQ(Lhk9J^`30p%FPCg|?M{Kf}aWN!L4KZk9Og9cTCew=)5Qyfj+NJ)e`LVCElj|&I6 zuioATR1cznIFGI6cM(BrKAvp|$HU_yrIA2%m%a|4Xy3rs%UtpY$U)tSDK{W7@Uy}@ z))$Key#`fO-7;>??={+%{K1QW=7tr5XGU`NTwftkUK?(=lXpdHa3Gxm5;dGI6;j%g zm)=sQJ&$132FH%(9)%}$3pBVDlXe3==JMrkwlEvj#X;+{_R`yY7){omdWAC@IoG)- zTvU)G)`e?cviRKor>gf;1D3v->w%i>G?said{q-<%Cb-ufuA#xTk~P7uurbZLoL0G z^Y?5q+G1MepwBSdClABQ6NqRg7bd3lZTS81u1v;ueJza}8-W2%CMd3H4Srci?z5a? zk1vR70t9p+){(wv0y)(Rwp9p5*UVIkuc?x=0o8?b)H5x14%FYSvIw0v8lsp5q;>^J15Ha{c~SQ zes)HCs7UF_$#%u?QttMipI<%v7%^Qz+op!V6kH~fT50T}Rd$mfdj6ne(v`=X;>b%n zw<*CaXK0iq)Y#B8!<5C;3wt)C3BFw^f~0OTBip|j$(G3DY9VUKUiZ6y<+vo%x?Hu> z!faq$^5AD!L`l3X3x1HkY~vp7vhhwoME9^hXy1P&2<&h#d>Yr=OZ|v(z@1I-nrGNI@BRU6Zf;;xh)FZXZRP%T1fRn=H5UCisSiil9O0aeUiwB zvJHBs2O+{S+#dYWa?xyC`Mk`+=3v;ih7cR?_nIkNQ3BYaiY_1QBG z$9f#-j~!x(eusy%QUHCZ`z6|BnJ6mqG_Vu`PuID#;Zaf>sjjj^J-4)kvBpw@Ok7KA zPSC;NK(mao=~6U{nFN-Pv9foEosInva@i@^7BmoU0cXMk-piBLhe4zmh^SJ#Q2~F1 zS))`!bZR?pF>(|ae!l964(Pg<>8KuwsRN@M!`K6eZ$2R^*@`qXUSd`9S4bA-3f&y5 znq5#-$~Fxe!VbdDGkrY&2zgmqPSW(;!}Oix$wgAq!t~wK8rty)$ePrbT&{%I!yn{@ zmV2-QnU!fjm#x_+O;NOHaLb_j>X>>wM2z_X+v2qhx;##8j6@0FcNg)(#X`p}?;7i- z#C#0@%Ek0tBwAq%S?cDr~;BJeKW;LWyoHX#v(N4m_-q|_uLI2A0 zw9e~xTW=?PB)XD=r_Ni$C-ruE8bGsCBV8%hhrfc`36&eEi#5&nu@6lh>*fo%1yg-; zVPo`R%e3jyP3LKal}nwWRsuEe~6w+;0K`TZHZO4?CTkP=W%gS(n*@ghIuR@Gcu-wCuAs|ZB!JUHNUK#$gRM}rR ze39_K^@#KL(*w4@P$ECsVKGmn4eT6T)~<(Yob`=Wy3kU)mhNb$O5~ECbKZrX`*sJr z9kfDZlOMT?r}}l?-Ni}>p#uAUAWLW;OGT}f3 zCT-!trnO7w(hxin z8iAbhx6JrNZOYZt{bJXMYgUnzB%trZ(hj!A+^d(LF8597`7}Gt*z&n@CZn~SH`Pwx zojJ4V!R0z624e*0+*%nX#SOtCLo3H((jI1Uf!tdY$jrB>ywm+bm#K|=4W-y_avu|89kuoPMte441@ta` zl#yDjVf1_i$&eb<#c0TnOyU}ywOA}iQCU<{=^DWqP0dYF+}Sgar7{!Jz(I=SBAA3~ zTfCDKVj0nlHkqmd_k_(6xf5D8Mo-*>F9gA+3=>C9k39nt=iZX#`Ry|{)^496wII!4 zOy0wBTlg9CP%7^gjML%PnLab*zb)vB4mUy82$eVFl2G$en!w}+Qsbwm(CDuOP~Hjn z$r5#tPTw?yk;g{dtQoiq>G&oQT~K|BA33Iz_ss~N9t{5WI;T+#L;c7?a$E#52>wm^ zH3NWXK=<&_!>S@ zhU5e}zFhDk#jIDnn4c0?&3L}<<;3z>SeAl}gN<6ZB{%LX59w}cCb6^CBo9V8m=hpA z`!!UB;g|>T)FN35#N%Zb#0Xu$Qi#B?GDpnzrZm^I5xesoyAw6$G&19qE@R*5P&I?VOxoyTj1Tu8 zLedB`vHLe8w4>a+=o1=dw5@TM-oyTe-AdYoDa(8WBYbc|jQN#>^tZ!PG#m*+$<|)n zWYkhFH}Av{k|61G1Y$h3q1?n%x}=gs*F>=?N%ev7iMd5kL0t`ssZb#e;d3faP|i4k zz%zHZi-;WgXIC-He8PtYjXOCvE`N}xZLaTI#$gu>Y_KC|f4Et*mX^4vD(m5n3-K@M>u`ie8<6S7F`i#q112%Bbwq!8~T;GmmZ^JG^g3*BO_3`a~rmLgE0j*?Nv=JP)@CK>t8 z?Xgx%2|~rE*_X8)Z~7)>aQK9rf>dE6xKP?zhPW^Wu}HWv25UDYQLYYXp(QvnFf+Wl zMBJ!b2-A=H4h79dt@Je~ZB;ArQa`=dfUpWvSk6szCgKJm5|;{Q)#38CG79Nv&}BVB zIs%VeOK?DvY|gN-jP-n+j~7?m4su`SHh~>PkTS^g(V;Oc z9p8{XgCQ6*M=L6YZ%6NE^2CUvyyWA30-iJi#eUh5GK?n?Qb~8;J)+O06f($K%X)XG zRDm=IqPU7I>RJ!$TftH_vN=UayX&DS&IwJqTr~kXI-PUlMjR0kbY0UE6oqKR@^J1N z?7UZUik!LOW2`dqbrLx1*l8zXGUQ*$%aLRV2JAoY^{~iHH}SC$F-=yCgfmxf$#jbHC=$m>@~AJ} zHPWmm9vcf~zf+O%YSq<-vzuoohwk;Wcqy7!v$jENn8nx~(!rX$#9VLH6A6aa8)!*V z79aIKny#5(Pg-f>Ad1Lx6Y=XW*22aC)kyV|ib5E<$thF%}3BO8NXMIw@@KPB1cU5KTl)HWs2eHIz$05tNSfMNMHVR6=(Jl#G|3l_xv1 z(sU7WgkJ{hOpfU$44GstQzRs>W@4>8P2w)SIUCus-c`n}TK9KZZ4pnV-l9VH4 z?vy!fWAJ^<)VNkw=2WeInUZlltLv7Lpg0JtNYgk${wsx(^Nk&|> zs#h--j4(AmSV_!(jV8|<`if>0y;CiE40Ff52nV)5`p$Emd2wE6dQ*f&kI#*csk$^C z!lc3J1uoONqEefPVrgs=qiCJ+DLtqvo_ zm;1MV`bZR#Wi?5Pw8q6_HYw32^0W~u*P@Z1hr~g9`;O?s#j8XM3>qHQz3KO~=!?fP z)pIb=vHS^aE;ZVzuefODNAppw)g_Lh_dGS$9;pi#agKr~w#8w(v@!E}a7l3$Hb9D0 zh9Aa-j=Ff-lx>5#Due@8|Nf4Rbz~}9paDUuNYHz&ewHU(5;sh-+ervU3j@RAr=f$| znywlOUNER-A=_4`*h1qJrMfIR#^iQKnr}m5+o~T$4MequxX1VgeeEd4rB$_l+4l= zMw`+gY+B|-EmkOaMhf1ParXFy)xLQ_s;j2G@8*Z7si`?rVw3xF znCvrJ=$FIEmsTgj?Wsmz_MqN3p{U?kV6rKO-k!lBo($N=Sp(j<{iHSJEzdC7*T<=b z*3?%O#xWc)H{cI}Cj=QTV{!XNNgt1!U9|bVun%YbQs7%%*V~N;5PB>FO-$vYUsE7A zs$g2{hE(#wv3*0citpQ4eqkH z89ORnj5A*~(^Dp$V-gHC!#6)8l*Eb`eJP1-uv@^uelvQbIF*$qFw>~!2OpTO<-@nxqI zeg61nhy2MJ{HN>GEao2vV)#cDt3OWsntQa1!qM9GL{{ zJ&*8=x@_ySEV65qe8c7T_JwKT;j(?)=6BB9O95|ZPM&Xzyo%AUrH{TFHX>bkk$T2o zEIon}L}u&yCJEQ)@)JyCL<1rQeCptk7U8y8wrFPDv*8F`++Iq-jWH2pL5=S82p;grRHL z72p>FtNk$exu^z9orFE6e^ES=qockq4uE)Fd`Q|P=~ z&c4D_3KW4)6Wy0vC4F-54B6ty6S+2((#HX(I51fCm4dv9uSsDfjTj+Fsb>$q?-Fhw z=t}8yt#vF>9RazIOVH1a`RE3``9KmjYChm`7K5xot6nVDHzJGBPwh^8K-L`#uOZqm z$2jgZC;HYjx)26&Z3l;)yWepwC|s{b2EwzE%zUlcl-cSoXYG>Sn5wkrIqBVt)oFKh z-4@3``Nur|bT(`}eb>~PJpn~r#JO6ib^?C2=<&zgFoX@1sYp4xLV5`HoMq}I2b(kW zl(aM%*(N3A#3>5s(#Y>HQ_rxOMEC_D(a=4)rJP-bB;T!O0acx$2rU^qujs>rYO~@y z2^}u$juxf;1Zjf=rl~Jaj)?%ZJK}nfpTUgTW`x3(%ok^TY-Wi;6eLUM9WU6uvY?o~ z9?t1&gVRpG6Q_$i6IiyLT+I?cxMB{Hhbqn(LFE)$_w;QurbzN@ui` zJz1jJY>JBW2~xW$KXV$zc1Xx^jirdC!#@>D)Uhk%&t z5WZTdC?_leszl*5c1FiVnu1kF;2cjVf>pUaktxAkMDoUOrLke}aRX!G6GrxHk80MRfOU~uZQ2) zh}}$4{cyL~D)iP=j+kY+fLa@8yw&@aCe0yeBdJMszKYhyUM*4+@c{*U!{Qho$jNTn zRvM`tmbNX4Mck)(=+rEe`raz{wk`e5A_K?ncO#KGz9LX*lr~0_FL`M^ZB2!|b8dC8 zYldZUu-jM>Mh&Xnxq#i;=u)Hrg$^PKuZ$oX>*|kLVB>$@*CCVaPZ+-*DTie{91yi@G&*6Z(#6B;;&e)dh2h ztan?G*c8@5SD8taW05-tp+FLq2p3dF&bA0A3zrT;%Q6J^TQK-YPS1GzF5OcZCE+_m zjCme$=WVH1O6dE|N(A^P-6IH6ZOY?X7>kgIN=Qg{ASE>(1^MFADzQFO4(NVDCe`TJ zmzssrm?1_T_xNVd;^PwDaU6IXaCQw!C&3R)}S7vxm-i(n-}^inwjGd%O6?NADGe zo;{+fy}m#uwQRXXZ(&MJrw94j0d!6g+P=ha!7%39S=?5mNmIjVU zff@c1woNN>8eOq8XiTMbX)&+X1*_o;xrZ);2HJ)hQbM(<%h-o9xMsxHEG~mSBV@Pi zPB36xtBjOeNN(j1k6j@{%Pn3x$DI}i~gg;x)6=l2_d`>=&pbRceC@|yBf||wBGoy|Hah=_u~fVcU(_ zssYANWVy}N1@n+vn+>VF&MHHUSlfl3Yj!^FkA%>OhAPUm23~M@)Z5s)yQ4hl&s&vS zFIU+cH<7rRWi2*&JHofToV7k&(AJysiBK>ag((+$AdEX=xt@0#>K&YT8;gb@Tq=4$ zkH-re6zlngCd54gnce*<)QnzlM7vX>SP?=l<-fm1O4_2jSqhP>=%BnU=9g5L+b(OC zw{_36RGDUjE9JwxG|R_N-{_8*ttqeN=5sjQmXn-RVWY4%&;BjN?gI@8AdHaqlgXf&s1G$K<`d+2(>xm#6 zu^)7ML7ocVyUEI|9l5j(Il&MKdd-b-ZQ|SjX&+V}e`JZB(AZjT1Ye;i5>?Lq+J15Z z@AWB&NWzLJj^w*b$|BbOeM{wX-tI(Qg;wKT-7OO@U)rz`M%AIykjn<@_{$8h$MGiWnv;59xFfHW~s?G`FcEH0$dd&&c7DcDl-B z;b-iwlDJ^sdE9&h(V}lCAocQ9-5Vt&%doEu_njA#YDUj0xQUcD54?*TW3qBRTew@I zOB+aTADo=?X4*)-QNxMxt_bSFRX}zw&f?($46Ru3QnX`w^D)n2|kckQG*s z-#;EbGf5+m_K=0oLi8zR1z)dMaNBdhfKmD=<@O0uONceDV~o@{th?RBPgCCHqtDZG zqss}bl#zAtG0Tzq`dxi4?ymE<*#vj7n@5J$`4)DWb+$2Fb(sV7a5|#|6)0vFWdp>U z3$Ber>qo6K$W-f%b<{(gZ+*SD=WkK^2EC@XY|iSk#866Kkt{M=@W0enj8$%lP0y@@Bmi++~*=nj)GQnV#601EZqJYvc1lE>KP2O z3}&Idd^gYGHX45jZL!GdaPQgH^lJg$3?Y4}Ux65XxjEIswR4Ro{+95TfT1fZS8 zP=P&AEWYJ=HhDMHix89?@_y+R)~WoJHVgTvC0djcc`+nhgO_ZaUeVpiVd)or$Qw;V z1&c8sr{T2sQZE)2?Xjjxn>4mP&8C>nAiy%Fu}DkpgoAAwflI)&6>X=3N$J>#L@pEZ zYYoWju1|g+_u%1G>Cz(L{g$(ihIAIFFI5ET%v?sY6E<)%T?w}-KFohGD+Z|~M|5xB3j|Jmesxvd!r8XVsmbxw*8P1L%wgs zK8rLWOxtFDANo8vZ^r{~^k?iU^ihPUay ztiuq>&SAMsff!@(0&}=I@vLr}@P{0y1}ul*0`a??<8n6XuE!>#p>4#g?X<0vd;oA&UN;^okzhsRm(dBoRWTHfpN-H3^Bsaj(i z?6RBML)tfD?C|TGx>BOX%zN8-bm*(?21LFXF;6qht@n+XcX7qR`$mi*JYd937W<~s z8J3Q09vCt4f$_A{>IisGGR}^wJJS*JkPs^N%Z!v^14fLNM3;+>GM!J8&U}QN5a^yD z7Np*F5wf92b-mshDr9p?kajMB5tH1cY3qQlR2w=_+h$G-$yl2h5aR68Aa2%xr&8t{ zySZFxS3IMtIT7a~LZG{;9#<#LzQWv0v(EdZN=Ld&vU6~_j%{(hp~||wvBrS0L&lQW z$`>zD;u z$mFjFdtos@LiWK*^vOlCv~ne7p@M?l4G5_EqL#CjT_3k&!#?XBnAzMEhc-uUeqJc< zbiN>fcngcagjx8rES`9Igcqd=h&Jc#qPJ3bX3ljF^!(+Kk% z!IEeC?>x%R=DDnhCJZC!(4LX+XY=XdRdcpz6*q3OJPj`69z|)4^opq); zy4OWAG2UM1RACW%DN4Gyq}@<Iy5FO0HH<+M~61)1M|4 zQ(XZ%m_lEt|eb8Lo*V$V123|aS5>v4EO23!H!S1O`JO{3f|OoKsNc87#_f^W$}|IuLvMx}^J6bFiyz#VG^XN?0`>HN+?N*Q;V6DJBg zn)oMl_4xGpaqh|5G)Oa>C1)CVAt|cio3mpiJN66a-Dek&Kj-&8+^5w}yyZV}@4FR*1Lx`IQ?PT9LX8JQ8@%n>WV4*YGI_V` zc@+`y63gqimZzqss&7Tx@qD`Jy(%frFHe=~xFBJ2_oZ&Ho~!tzsiB*QA|$Y^K;ur{h|>$0kOQTg}B};yg&r)GPQ2 zDgGhEJR~1g2a)S}fhi|Up2CL)^SUuum|Y}Fu%fS!#UC_HU{R#vR&vB)3pkN6mE#+r z?wl9TDhlk{4j|47CZ_TgH+mJ3vIkt60|`Y8eQ@lg?a(P71cVlf7>gP8RV*f_X2 zI1HINK*0YqIACP|-;9i|eU#rV)uRswu$KTo{9ud{j`P`nQxD<(*Y^1zsaqLE9XcBH zV;iMHAA|b0gF-;yt^IHR`;gH09&-5Wd|-jc0M2tAIq*O1{rl3Zj)*`A41xa%5&Uz2 z=;(ov0)qhw9K=3JAilt`1=(3U*cyWD4*KR1<020R$p3T!?H{fCEmVik(5Qf+!T@fT zIK?o1LG`@_jfC#}yel6}Py1bYSw>alH87Cx19MW?H)#9QQ`#ScW@Tw@WM*upZ(soe zKP}H_>|kLbVr^joGPF0dwqkSy+1dervoT&|v^FsR@3HZnQe)vc4HJNpE$|ZvMoAoS z&;CfXujt#Ee!ISN{~y57e@2j{jlIi>*?hFRdtnD)viq+FvPS$vY`)j9j1INW=}@}0 z)16rfP|^S>g@ZK^D^RZcBMqeT>ppinoMN92sm1`D>VcmCFixc?e~8mhJKd>_AnxIZ zzSjUE4!}<^7#TRUKSV~z)>hx;`&EIbJBG+VNUy~KT%G_wL128?(f=-=Q)wQiB<-5> zz}S%jJbqb9B*`{-JO(O}0W$o0k9PHUS zIvxcuJg&e+Hz%Gg4<9u7?=1WCCer|e1q-C&Q-}3+@67MOJ1n`3!QdtQNqAs;XTD(l z4Gkval8CVg$o6IcnfpIjf#D5kFfN=w7)mg#UlKi_S`MEh`rm!@aI~$#qWzNKZ!xfR zu&_6?)VDcM<-ZYj81!Bd3P9w(2VQ=O1`E4C;ok@SOM#*c-01Mn?NR^L7~l18tRrl& zIPpuMeFY5r2H@3!uW9_Cod^W}I;WqB$s;p*$l}n~1N1y1dYG{pRu$pDMbhADz&It5q$+(1A^9dseka`@jt#g-8a-7!-)?mI zuc`RwJqKJQfn-iIOouiY|4!5nr)_YNwDBk5fz7JFE0Qb}F@ari5D=4;5D?B_b4!Bk z9}FcJRxpwD8#(!)BOH!2xIhvDb|;-Ae|?!kzKxed9RUpexBT_HA+J-jx0V8ut^-g> z`&tG#NKo(pKIoq(-QQ@0@4`qZ*F~5YNVoyOqW^1Q@PN-}tH0g|KTEhrVgt#lyeJA> zd^88h*RPe^12$`Rf1S-QlkJfx@%O@!l>+*K3MgZMHxQ)zU#Il7!+opk?$>np2ikwn zuHUD-3*O-uzwk2oM#!Dj=UkiSpo=jFnq zG|#FT!rBB-L4yUBfL>q;#VPWy^ZChL-~XjBzIU=b#&nzvV8}EBwV)U<7Fe-=oyFH7 z^CeGyd&}(b9mxMh?B~*n^B-adF1#0=yLZ<`htz%-xj(i;79|$)oZe&#}#2WiU`5Pal;1!S$X%^ZiDFE48e6 zrx?gMuE3UvuLTC6tO(Q~<21YVY?q7lmR&qH~<@Rvd#R@Fe z%vin<@;RbikUVmgMlV@oMqk#{7ej|7SIEn^b zLR6h5oKuq!!Y@xTNQcVxzZ0{=X$@RL^#4J0$C428`5N=LfQ_oev=9(ZV3Ug7_@4_T z7*sF`@f#J~gSq2yoWbQo&CFi{e`NUpeGbFc7)ZZc)`#VT;q2eW{PV>08%^+CJ}3q; z7N`TZ-vkW=#7(gN6T17i>HJ#_9f`_YFQZTVfFCdeD50 z;NIb{gCE>0KEc<&89PTr0KS)uivIZgzpaPAbcG|r0N-$*ei|^oFG!Av1>9vKV>pG7 zfUii7hzEQxS>~zY`Ef~dL|EW^$(R{WGfY2Qll%{OhqW^JUb4nN2@g!^f9d`I!x-D2 z2EgA8`*9*PWcq`l1jG7^i!}jf@0Y^N)i&{OQO4_;C{fcwGut?AYv2ln21;Qjw>C;@D{b+}c7HKY2h- zlm)=+QqiXg=LAUr+}a|#e2PIjg&Y80mn!^&=)k7c-%SDFmnr`^gUVd_bAbeddZG*f je!1a~_&pT<68>W(fc?F85D=!oA2Trsh%)W{_4WS&VWWy> literal 0 HcmV?d00001 diff --git a/kb-importer/src/test/resources/CVE-2014-0094.zip b/kb-importer/src/test/resources/CVE-2014-0094.zip new file mode 100644 index 0000000000000000000000000000000000000000..e322940085726da7b066b38ba923a1fedc330303 GIT binary patch literal 24527 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 QKm18R0RX@i{_@@b17T-EvH$=8 literal 0 HcmV?d00001 diff --git a/kb-importer/src/test/resources/CVE-2016-2048.zip b/kb-importer/src/test/resources/CVE-2016-2048.zip new file mode 100755 index 0000000000000000000000000000000000000000..3aed4dcf8145f4e22895a0515a619a99993ef701 GIT binary patch literal 141723 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�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�zze1-?*@O2eAQ7HQ(H6%O+oq%TMb%a#8OH&m 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

    Getter for the field vulnId.

    diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index bb08c3f81..7461fcbf0 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -45,11 +45,17 @@ public void execute() { if (tarFile != null) { extract(tarFile, dirPath); + manager.setVulnStatus(this.vulnId, Manager.VulnStatus.EXTRACTING); } else { - if (this.skipClone) { + List commits = vuln.getCommits(); + if (commits == null || commits.size() == 0) { + return; + } else if (this.skipClone) { log.info("Skipping clone for vulnerability " + this.vulnId); manager.setVulnStatus(this.vulnId, Manager.VulnStatus.SKIP_CLONE); } else { + manager.setVulnStatus(this.vulnId, Manager.VulnStatus.CLONING); + log.info("Cloning repository for vulnerability " + this.vulnId); clone(vuln, dirPath); } } @@ -106,14 +112,6 @@ public void extract(File tarFile, String dirPath) { public void clone(Vulnerability vuln, String dirPath) { List commits = vuln.getCommits(); - if (commits.size() == 0) { - log.warn("No commits for vulnerability " + this.vulnId); - //manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); - return; - } - - log.info("Cloning "); - for (Commit commit : commits) { String repoUrl = commit.getRepoUrl(); String commitId = commit.getCommitId(); From 16f9e37954ed29cb2be21773b8242c32fba08350 Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Thu, 19 May 2022 11:58:34 +0200 Subject: [PATCH 30/83] Small changes. Removed unused classes --- .../java/org/eclipse/steady/kb/Import.java | 4 -- .../eclipse/steady/kb/ImporterController.java | 20 +++--- .../java/org/eclipse/steady/kb/Manager.java | 5 +- .../org/eclipse/steady/kb/command/Help.java | 57 ----------------- .../eclipse/steady/kb/command/Version.java | 63 ------------------- .../exception/CommandLineParserException.java | 54 ---------------- .../kb/exception/ValidationException.java | 46 -------------- .../steady/kb/task/ExtractOrClone.java | 18 ++---- .../kb/task/ImportAffectedLibraries.java | 5 -- .../steady/kb/task/ImportVulnerability.java | 6 -- .../eclipse/steady/kb/util/ConstructSet.java | 1 + .../org/eclipse/steady/kb/util/Metadata.java | 6 -- .../org/eclipse/steady/kb/ImportTest.java | 29 +-------- 13 files changed, 22 insertions(+), 292 deletions(-) delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java delete mode 100755 kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 216221797..55c4451aa 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -92,17 +92,13 @@ public void run() { String statementPath = findStatementPath(); if (statementPath != null) { - //System.out.println("d"); Vulnerability vuln; try { - // System.out.println("getFromYaml..."); vuln = Metadata.getFromYaml(statementPath); - // System.out.println("after getFromYaml"); } catch (IOException e) { log.error("Error while reading Yaml file for [{}]", vulnId); return; } - //System.out.println("e"); if ((vuln.getCommits() == null || vuln.getCommits().size() == 0) && (vuln.getArtifacts() == null || vuln.getArtifacts().size() == 0)) { log.warn("No fix commits or affected artifacts for vulnerability " + vuln.getVulnId()); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 97623aa01..47c64c66c 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -29,8 +29,8 @@ public class ImporterController { private Thread importerCacheFetch = null; - final String defaultRefetchAllMs = - Long.toString(VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb.importer.refetchAllMs", -1)); + final long defaultRefetchAllMs = + VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb.importer.refetchAllMs", -1); private final Manager manager; @@ -55,10 +55,11 @@ public ResponseEntity start(@RequestParam(defaultValue = "false") boole args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); args.put(Import.VERBOSE_OPTION, verbose); args.put(Import.SKIP_CLONE_OPTION, skipClone); + long timeToWait; if (Long.parseLong(refetchAllMs) != 0) { - args.put(Import.TIME_REFETCH_ALL_OPTION, Long.parseLong(refetchAllMs)); + timeToWait = Long.parseLong(refetchAllMs); } else { - args.put(Import.TIME_REFETCH_ALL_OPTION, defaultRefetchAllMs); + timeToWait = defaultRefetchAllMs; } this.importerCacheFetch = @@ -69,7 +70,8 @@ public void run() { manager.start("/kb-importer/data/statements", args); try { - Thread.sleep((long) args.get(Import.TIME_REFETCH_ALL_OPTION)); + log.info("Wait " + Long.toString(timeToWait/1000) + " seconds for next execution"); + Thread.sleep(timeToWait); } catch (InterruptedException e) { ImporterController.log.error( "Interrupted exception: " @@ -121,7 +123,7 @@ public ResponseEntity importSingleVuln(@PathVariable String id, @Reques try { if (this.manager.getIsRunningStart()) { log.info("Importer already running"); - return new ResponseEntity(false, HttpStatus.OK); + return new ResponseEntity(false, HttpStatus.SERVICE_UNAVAILABLE); } else { HashMap args = new HashMap(); args.put(Import.OVERWRITE_OPTION, overwrite); @@ -145,7 +147,9 @@ public String status() { @GetMapping( value = "/status/{id}") public String statusSingleVuln(@PathVariable String id) { - return manager.getVulnStatus(id).toString(); + String statusStr = manager.getVulnStatus(id).toString(); + if (statusStr == null) { + return "Vulnerability not found"; + } else return statusStr; } - } \ No newline at end of file diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 0050105a9..f06bd8085 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -65,7 +65,9 @@ public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { } public VulnStatus getVulnStatus(String vulnId) { - return vulnerabilitiesStatus.get(vulnId); + if (vulnerabilitiesStatus.containsKey(vulnId)) { + return vulnerabilitiesStatus.get(vulnId); + } else return null; } public void addFailure(String vulnId, String reason) { @@ -225,6 +227,7 @@ public String status() { HashMap statusMap = new HashMap(); statusMap.put("count", statusCount); statusMap.put("new_vulnerabilities", newVulnerabilities); + statusMap.put("failures", failures); String statusStr = new Gson().toJson(statusMap); return statusStr; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java deleted file mode 100755 index 6eb95cec7..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import java.util.HashMap; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Options; -import org.eclipse.steady.kb.exception.ValidationException; - -/** - * help command - */ -public class Help { - - /** {@inheritDoc} */ - //@Override - public void run(HashMap args) { - // Showing help of import command - //Command command = new Import(); - //HelpFormatter formatter = new HelpFormatter(); - //formatter.printHelp("java -jar ", command.getOptions()); - } - - /** {@inheritDoc} */ - //@Override - public Options getOptions() { - return new Options(); - } - - /** {@inheritDoc} */ - //@Override - public void validate(HashMap args) throws ValidationException { - // Nothing to validate as help does not have any args - } - - /** {@inheritDoc} - @Override - public Command.NAME getCommandName() { - return Command.NAME.HELP; - }*/ -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java b/kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java deleted file mode 100755 index a74d336c7..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.command; - -import java.util.HashMap; -import org.apache.commons.cli.Options; -import org.apache.commons.lang.StringUtils; -import org.apache.logging.log4j.Logger; -import org.eclipse.steady.kb.Main; -import org.eclipse.steady.kb.exception.ValidationException; - -/** - * version command - */ -public class Version { - - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); - - /** {@inheritDoc} */ - //@Override - public void run(HashMap args) { - String vulasRelease = Main.class.getPackage().getImplementationVersion(); - if (StringUtils.isEmpty(vulasRelease)) { - log.error("unable to get vulas version"); - } else { - log.info(vulasRelease); - } - } - - /** {@inheritDoc} - @Override - public Options getOptions() { - return new Options(); - } - - /** {@inheritDoc} */ - //@Override - public void validate(HashMap args) throws ValidationException { - // Nothing to validate as help does not have any args - } - - /** {@inheritDoc} - @Override - public Command.NAME getCommandName() { - return Command.NAME.VERSION; - }*/ -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java b/kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java deleted file mode 100755 index 007362f77..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.exception; - -/** - * Command Line parser exception - */ -public class CommandLineParserException extends Exception { - private static final long serialVersionUID = -4923677968243017658L; - - /** - *

    Constructor for CommandLineParserException.

    - * - * @param message a {@link java.lang.String} object - */ - public CommandLineParserException(String message) { - super(message); - } - - /** - *

    Constructor for CommandLineParserException.

    - * - * @param message a {@link java.lang.String} object - * @param throwable a {@link java.lang.Throwable} object - */ - public CommandLineParserException(String message, Throwable throwable) { - super(message, throwable); - } - - /** - *

    Constructor for CommandLineParserException.

    - * - * @param throwable a {@link java.lang.Throwable} object - */ - public CommandLineParserException(Throwable throwable) { - super(throwable); - } -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java b/kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java deleted file mode 100755 index 543696446..000000000 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb.exception; - -/** - * Validation exception - */ -public class ValidationException extends Exception { - - private static final long serialVersionUID = 4113470472092415302L; - - /** - *

    Constructor for ValidationException.

    - * - * @param message a {@link java.lang.String} object - */ - public ValidationException(String message) { - super(message); - } - - /** - *

    Constructor for ValidationException.

    - * - * @param message a {@link java.lang.String} object - * @param cause a {@link java.lang.Throwable} object - */ - public ValidationException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 7461fcbf0..f6376fa51 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -124,12 +124,8 @@ public void clone(Vulnerability vuln, String dirPath) { manager.lockRepo(repoUrl); try { cloneOnce(repoUrl, repoDirPath); - //System.out.println("after cloneOnce"); createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); - //System.out.println("after createAndWriteCommitMetadata"); writeCommitDiff(commitId, repoDirPath, commitDirPath); - //System.out.println("after writeCommmitDiff"); - } catch (IOException | InterruptedException e) { e.printStackTrace(); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); @@ -146,10 +142,9 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri String commitId = commit.getCommitId(); String commitMetadataPath = commitDirPath + File.separator + Import.METADATA_JSON; File commitMetadataFile = new File(commitDirPath); - // if (!Files.exists(commitMetadataPath)) { HashMap commitMetadata = new HashMap(); - String timestamp; + if (repoDirPath == null) { Path timestampPath = Paths.get(commitDirPath + File.separator + "timestamp"); timestamp = new String(Files.readAllBytes(timestampPath)).replace("\n", ""); @@ -177,10 +172,7 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri manager.addFailure(vuln.getVulnId(), "Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); } } - /* - while ((timestamp = gitShowStdInput.readLine()) == null) { - System.out.println("timestamp : " + timestamp); - }*/ + commitMetadata.put("repository", commit.getRepoUrl()); commitMetadata.put("branch", commit.getBranch()); commitMetadata.put("timestamp", timestamp); @@ -192,14 +184,12 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri public void cloneOnce(String repoUrl, String repoDirPath) throws IOException, InterruptedException { - String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; if (Files.exists(Paths.get(repoDirPath))) { log.info("Folder " + repoDirPath + " exists. Skipping git clone."); - } /*else if (this.skipClone) { - // do something (throw exception?) - } */else { + } else { log.info("Cloning repository " + repoUrl); + String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); /*BufferedReader gitCloneStdInput = new BufferedReader(new InputStreamReader(gitClone.getInputStream())); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index c46f9b7d3..8a43f19e3 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -142,9 +142,4 @@ private void setAfftectedLib(Artifact artifact, AffectedLibrary affectedLibrary) affectedLibrary.setSource(AffectedVersionSource.KAYBEE); } - /** {@inheritDoc} - @Override - public Command.NAME getCommandName() { - return Command.NAME.IMPORT; - }*/ } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 433bc03b3..78f151f79 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -234,12 +234,6 @@ private String getCVEDescription(Vulnerability _vulnerability) { return summary; } - /** {@inheritDoc} - @Override - public Command.NAME getCommandName() { - return Command.NAME.IMPORT; - }*/ - private BackendConnector getBackendConnector() { return backendConnector; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java index 3b5c7d5ea..ab1f8038f 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java @@ -84,6 +84,7 @@ public static Set identifyConstructChanges( } } catch (Exception e) { ConstructSet.log.error("Error while analyzing {} : {}", c, e.getMessage()); + e.printStackTrace(); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 33a9d7a33..1a1e91067 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -120,19 +120,13 @@ public static Vulnerability getVulnerabilityMetadata(String rootDir) } public static Vulnerability getFromYaml(String metadataPathString) throws IOException { - // Yaml yaml = new Yaml(new Constructor(Vulnerability.class)); Path metadataPath = Paths.get(metadataPathString); Yaml yaml = new Yaml(); - // String metadataString = File.readString(dirPath + "/metadata.yaml"); String metadataString = new String(Files.readAllBytes(metadataPath)); - // Vulnerability vulnerability = yaml.load(metadataString); Map vulnerabilityMap = yaml.load(metadataString); - // ObjectMapper objectMapper = new ObjectMapper(); - // Vulnerability vulnerability = objectMapper.convertValue(vulnerabilityMap, - // Vulnerability.class); Vulnerability vulnerability = new Vulnerability(); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java index 259ba4114..3a710511b 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java @@ -28,39 +28,12 @@ import org.apache.commons.cli.Options; import java.io.IOException; -import org.eclipse.steady.kb.exception.ValidationException; import com.google.gson.JsonSyntaxException; import org.eclipse.steady.backend.BackendConnectionException; import org.junit.Test; public class ImportTest { - /*@Test - public void getOptions() { - Command command = new Import(); - Options options = command.getOptions(); - assertEquals(options.getOptions().size(), 4); - assertTrue(options.hasOption("d")); - assertTrue(options.hasOption("u")); - assertTrue(options.hasOption("v")); - assertTrue(options.hasOption("o")); - } - - @Test - public void validate() throws ValidationException { - Command command = new Import(); - HashMap args = new HashMap(); - args.put("d", ImportTest.class.getClassLoader().getResource("testRootDir1").getPath()); - command.validate(args); - } - - @Test(expected = ValidationException.class) - public void validationFail() throws ValidationException { - Command command = new Import(); - HashMap args = new HashMap(); - args.put("d", "invalidDir"); - command.validate(args); - }*/ - + @Test public void testImportSkipExistingBug() throws JsonSyntaxException, IOException, BackendConnectionException { From 4b6d78781cf0b37f4d89cdb0c3e3c99963c042e8 Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Thu, 19 May 2022 18:00:18 +0200 Subject: [PATCH 31/83] Removed some comments --- .../steady/kb/task/ExtractOrClone.java | 43 ++----------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index f6376fa51..e237b84df 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -44,8 +44,8 @@ public ExtractOrClone(Manager manager, Vulnerability vuln, File dir, boolean ski public void execute() { if (tarFile != null) { - extract(tarFile, dirPath); manager.setVulnStatus(this.vulnId, Manager.VulnStatus.EXTRACTING); + extract(tarFile, dirPath); } else { List commits = vuln.getCommits(); if (commits == null || commits.size() == 0) { @@ -66,23 +66,6 @@ public File getTarFile(String dirPath) { if (FileUtil.isAccessibleFile(dirPath + File.separator + Import.SOURCE_TAR)) { return new File(dirPath + File.separator + Import.SOURCE_TAR); } else return null; - /* - File tarFile = null; - File[] cveFiles = dir.listFiles(); - for (File cveFile : cveFiles) { - String filename = cveFile.getName(); - String[] splitted = filename.split("[.]"); - if (splitted.length == 0) { - continue; - } - String extension = splitted[splitted.length - 1]; - if (extension.equals("tar") - || (splitted.length > 2 && splitted[splitted.length - 2].equals("tar"))) { - tarFile = cveFile; - break; - } - } - return tarFile;*/ } public void extract(File tarFile, String dirPath) { @@ -184,25 +167,12 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri public void cloneOnce(String repoUrl, String repoDirPath) throws IOException, InterruptedException { - if (Files.exists(Paths.get(repoDirPath))) { log.info("Folder " + repoDirPath + " exists. Skipping git clone."); } else { log.info("Cloning repository " + repoUrl); String gitCloneCommand = "git clone " + repoUrl + " " + repoDirPath; Process gitClone = Runtime.getRuntime().exec(gitCloneCommand); - /*BufferedReader gitCloneStdInput = - new BufferedReader(new InputStreamReader(gitClone.getInputStream())); - BufferedReader gitCloneErrorInput = - new BufferedReader(new InputStreamReader(gitClone.getErrorStream())); - String line; - while ((line = gitCloneStdInput.readLine()) != null) { - System.out.println("git clone"); - System.out.println(line); - if ((line = gitCloneErrorInput.readLine()) != null) { - System.out.println(line); - } - }*/ gitClone.waitFor(); } } @@ -236,20 +206,18 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename String beforeOrAfter = before? "before" : "after"; // for each file modified in the commit... String gitCatCommand = - "git -C " + repoDirPath + " cat-file -e " + commitStr + filename;// + " &> /dev/null"; + "git -C " + repoDirPath + " cat-file -e " + commitStr + filename; Process gitCat = Runtime.getRuntime().exec(gitCatCommand); log.info("Executing: " + gitCatCommand); BufferedReader gitCatErrorInput = new BufferedReader(new InputStreamReader(gitCat.getErrorStream())); gitCat.waitFor(); if (gitCat.exitValue() == 0) { - //System.out.println("git cat-file works"); String filepath = commitDirPath + File.separator + beforeOrAfter + File.separator + filename; File file = new File(filepath); File dir = file.getParentFile(); - // Paths.createDirectories(dir.getPath()); dir.mkdirs(); - // git -C $repo_dir show $commit_id~1:$F > $vulnerability_id/$commit_id/before/$F + String diffFileCommand = "git -C " + repoDirPath @@ -277,11 +245,6 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename public void writeCmdOutputToFile(Process process, String filepath) throws IOException { BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); - /*BufferedReader errorInput = - new BufferedReader(new InputStreamReader(process.getErrorStream())); - if ((line = errorInput.readLine()) != null) { - System.out.println(line); - }*/ String line; String lines = ""; while ((line = stdInput.readLine()) != null) { From 38eeda34f9263012d879d10213bc7fd2cab2fd6f Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 25 May 2022 11:49:45 +0200 Subject: [PATCH 32/83] Renamed Import to ImportCommand --- java-files.txt | 2 +- .../kb/{Import.java => ImportCommand.java} | 8 ++++---- .../eclipse/steady/kb/ImporterController.java | 16 ++++++++-------- .../main/java/org/eclipse/steady/kb/Manager.java | 14 +++++++------- .../eclipse/steady/kb/task/ExtractOrClone.java | 8 ++++---- .../steady/kb/task/ImportAffectedLibraries.java | 6 +++--- .../steady/kb/task/ImportVulnerability.java | 6 +++--- .../java/org/eclipse/steady/kb/ImportTest.java | 2 +- .../org/eclipse/steady/kb/TestConstructs.java | 2 +- .../eclipse/steady/kb/TestPythonConstructs.java | 2 +- .../steady/kb/task/TestExtractOrClone.java | 6 +++--- 11 files changed, 36 insertions(+), 36 deletions(-) rename kb-importer/src/main/java/org/eclipse/steady/kb/{Import.java => ImportCommand.java} (96%) diff --git a/java-files.txt b/java-files.txt index 1209da978..7356a3f28 100644 --- a/java-files.txt +++ b/java-files.txt @@ -303,7 +303,7 @@ kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java -kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java similarity index 96% rename from kb-importer/src/main/java/org/eclipse/steady/kb/Import.java rename to kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 55c4451aa..539939606 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -21,7 +21,7 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.shared.util.StopWatch; -public class Import implements Runnable { +public class ImportCommand implements Runnable { public static final String METADATA_JSON = "metadata.json"; public static final String STATEMENT_YAML = "statement.yaml"; @@ -46,7 +46,7 @@ public class Import implements Runnable { private HashMap args; Manager manager; - public Import(Manager manager, HashMap args, BackendConnector backendConnector) { + public ImportCommand(Manager manager, HashMap args, BackendConnector backendConnector) { this.manager = manager; this.backendConnector = backendConnector; this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); @@ -156,7 +156,7 @@ public String findStatementPath() { file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { return file.getAbsolutePath() + File.separator + STATEMENT_YAML; } else { - Import.log.warn( + ImportCommand.log.warn( "Skipping {} as the directory does not contain statement.yaml file", file.getAbsolutePath()); } @@ -164,7 +164,7 @@ public String findStatementPath() { } } } else { - Import.log.error("Invalid directory {}", vulnDir); + ImportCommand.log.error("Invalid directory {}", vulnDir); } return null; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 47c64c66c..26dcc2826 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -51,10 +51,10 @@ public ResponseEntity start(@RequestParam(defaultValue = "false") boole this.importerCacheFetch.interrupt(); } HashMap args = new HashMap(); - args.put(Import.OVERWRITE_OPTION, overwrite); - args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); - args.put(Import.VERBOSE_OPTION, verbose); - args.put(Import.SKIP_CLONE_OPTION, skipClone); + args.put(ImportCommand.OVERWRITE_OPTION, overwrite); + args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); + args.put(ImportCommand.VERBOSE_OPTION, verbose); + args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); long timeToWait; if (Long.parseLong(refetchAllMs) != 0) { timeToWait = Long.parseLong(refetchAllMs); @@ -126,10 +126,10 @@ public ResponseEntity importSingleVuln(@PathVariable String id, @Reques return new ResponseEntity(false, HttpStatus.SERVICE_UNAVAILABLE); } else { HashMap args = new HashMap(); - args.put(Import.OVERWRITE_OPTION, overwrite); - args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); - args.put(Import.VERBOSE_OPTION, verbose); - args.put(Import.SKIP_CLONE_OPTION, skipClone); + args.put(ImportCommand.OVERWRITE_OPTION, overwrite); + args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); + args.put(ImportCommand.VERBOSE_OPTION, verbose); + args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); return new ResponseEntity(true, HttpStatus.OK); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index f06bd8085..df12d899b 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -132,9 +132,9 @@ public synchronized void start( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); - args.put(Import.DIRECTORY_OPTION, vulnDirStr); - Import command = new Import(this, args, BackendConnector.getInstance()); - if (mapCommandOptionValues.containsKey(Import.SEQUENTIAL)) { + args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); + ImportCommand command = new ImportCommand(this, args, BackendConnector.getInstance()); + if (mapCommandOptionValues.containsKey(ImportCommand.SEQUENTIAL)) { command.run(); } else { executor.submit(command); @@ -152,7 +152,7 @@ public synchronized void start( } private void setUploadConfiguration(HashMap args) { - Object uploadConstruct = args.get(Import.UPLOAD_CONSTRUCT_OPTION); + Object uploadConstruct = args.get(ImportCommand.UPLOAD_CONSTRUCT_OPTION); VulasConfiguration.getGlobal() .setProperty( CoreConfiguration.BACKEND_CONNECT, @@ -203,9 +203,9 @@ public void importSingleVuln( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); - args.put(Import.DIRECTORY_OPTION, vulnDirStr); - Import command = new Import(this, args, BackendConnector.getInstance()); - if (mapCommandOptionValues.containsKey(Import.SEQUENTIAL)) { + args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); + ImportCommand command = new ImportCommand(this, args, BackendConnector.getInstance()); + if (mapCommandOptionValues.containsKey(ImportCommand.SEQUENTIAL)) { command.run(); } else { executor.submit(command); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index e237b84df..3bad732d7 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -16,7 +16,7 @@ import org.eclipse.steady.shared.util.FileUtil; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.kb.model.Commit; -import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.Manager; @@ -63,8 +63,8 @@ public void execute() { } public File getTarFile(String dirPath) { - if (FileUtil.isAccessibleFile(dirPath + File.separator + Import.SOURCE_TAR)) { - return new File(dirPath + File.separator + Import.SOURCE_TAR); + if (FileUtil.isAccessibleFile(dirPath + File.separator + ImportCommand.SOURCE_TAR)) { + return new File(dirPath + File.separator + ImportCommand.SOURCE_TAR); } else return null; } @@ -123,7 +123,7 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri throws IOException { String commitId = commit.getCommitId(); - String commitMetadataPath = commitDirPath + File.separator + Import.METADATA_JSON; + String commitMetadataPath = commitDirPath + File.separator + ImportCommand.METADATA_JSON; File commitMetadataFile = new File(commitDirPath); HashMap commitMetadata = new HashMap(); String timestamp; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 8a43f19e3..88e0f6ab1 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -26,7 +26,7 @@ import org.apache.logging.log4j.Logger; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; -import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.model.Artifact; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.shared.enums.AffectedVersionSource; @@ -59,7 +59,7 @@ public void execute( if (artifacts == null || artifacts.isEmpty()) { return; } - if (args.containsKey(Import.DELETE) && (boolean) args.get(Import.DELETE)) { + if (args.containsKey(ImportCommand.DELETE) && (boolean) args.get(ImportCommand.DELETE)) { backendConnector.deletePatchEvalResults(vuln.getVulnId(), AffectedVersionSource.KAYBEE); } @@ -77,7 +77,7 @@ public void execute( vuln.getVulnId(), purlGroup, purlArtifact, purlVersion, AffectedVersionSource.KAYBEE); if (affectedLibs != null && affectedLibs.length > 0) { AffectedLibrary affectedLibrary = affectedLibs[0]; - Boolean overwrite = (Boolean) args.get(Import.OVERWRITE_OPTION); + Boolean overwrite = (Boolean) args.get(ImportCommand.OVERWRITE_OPTION); if (overwrite || affectedLibrary.getAffected() == null) { setAfftectedLib(artifact, affectedLibrary); affectedLibsToUpsert.add(affectedLibrary); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 78f151f79..989d3837a 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -39,7 +39,7 @@ import org.eclipse.steady.backend.BackendConnector; //import org.eclipse.steady.kb.command.Command; //import org.eclipse.steady.kb.command.Import; -import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Note; import org.eclipse.steady.kb.model.Vulnerability; @@ -68,7 +68,7 @@ public void execute( this.backendConnector = _backendConnector; List commits = new ArrayList(); - File file = new File((String) args.get(Import.DIRECTORY_OPTION)); + File file = new File((String) args.get(ImportCommand.DIRECTORY_OPTION)); File commitDirs[] = file.listFiles( @@ -96,7 +96,7 @@ public boolean accept(File file) { Map> allChanges = new HashMap>(); for (Commit commit : commits) { changes = ConstructSet.identifyConstructChanges(commit, allChanges); - if (args.containsKey(Import.VERBOSE_OPTION) && (Boolean) args.get(Import.VERBOSE_OPTION)) { + if (args.containsKey(ImportCommand.VERBOSE_OPTION) && (Boolean) args.get(ImportCommand.VERBOSE_OPTION)) { for (ConstructChange chg : changes) { log.info(chg.toString()); } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java index 3a710511b..d68d55eb4 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java @@ -45,7 +45,7 @@ public void testImportSkipExistingBug() args.put("v", false); args.put("d", ""); Manager manager = new Manager(); - Import command = new Import(manager, args, mockBackendConnector); + ImportCommand command = new ImportCommand(manager, args, mockBackendConnector); command.run(); assertNull(mockBackendConnector.getUploadJson()); } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java index 73d50412c..2e8ada67d 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java @@ -50,7 +50,7 @@ public void setup() { } @Test - public void testImport() { + public void testImportCommand() { Commit commit = new Commit(); commit.setBranch("master"); commit.setCommitId("b2b8f4adc557e4ef1ee2fe5e0ab46866c06ec55b"); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java index 4d2a19058..b85bac440 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java @@ -50,7 +50,7 @@ public void setup() { } @Test - public void testImport() { + public void testImportCommand() { Commit commit = new Commit(); commit.setBranch("master"); commit.setCommitId("adbca5e4db42542575734b8e5d26961c8ada7265"); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index a3de218b3..c35ae0cb3 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -10,7 +10,7 @@ import java.util.Arrays; import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.Import; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.Manager; import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.shared.util.VulasConfiguration; @@ -63,8 +63,8 @@ public void testClone() throws IOException { HashMap args = new HashMap(); args.put("v", false); - args.put(Import.OVERWRITE_OPTION, false); - args.put(Import.DIRECTORY_OPTION, ""); + args.put(ImportCommand.OVERWRITE_OPTION, false); + args.put(ImportCommand.DIRECTORY_OPTION, ""); ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, this.dir, false); extractOrClone.execute(); From 65346d7df9c22bc86aa0bc5df71b7cfd4bf1d118 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 15:29:20 +0200 Subject: [PATCH 33/83] Removed static variable that caused Empty Stack Error --- kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java | 4 ++-- .../main/java/org/eclipse/steady/java/sign/ASTSignature.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index df12d899b..676d33740 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -30,8 +30,8 @@ public class Manager { private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); - (ThreadPoolExecutor) Executors.newCachedThreadPool(); - // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + // (ThreadPoolExecutor) Executors.newCachedThreadPool(); + (ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); diff --git a/lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java b/lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java index 3fd33d664..c2e977e14 100644 --- a/lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java +++ b/lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java @@ -58,7 +58,7 @@ public ASTSignature(EntityType label, String value) { @SuppressFBWarnings( value = "MS_PKGPROTECT", justification = "Subclasses can be in different packages") - protected static JavaMethodBodyConverter + protected JavaMethodBodyConverter sMethodBodyConverter; // Visitor for generation of the AST of construct bodies /** Constant sInjector */ From 2f8a01f9b69b1004ff489746e38cb93b77c2d3e9 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 16:19:50 +0200 Subject: [PATCH 34/83] Changed variable name in properties file --- .../src/main/java/org/eclipse/steady/kb/ImporterController.java | 2 +- kb-importer/src/main/resources/steady-kb-importer.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 26dcc2826..56b5f222e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -30,7 +30,7 @@ public class ImporterController { private Thread importerCacheFetch = null; final long defaultRefetchAllMs = - VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb.importer.refetchAllMs", -1); + VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb-importer.refetchAllMs", -1); private final Manager manager; diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties index c641d1149..108b4b0ef 100644 --- a/kb-importer/src/main/resources/steady-kb-importer.properties +++ b/kb-importer/src/main/resources/steady-kb-importer.properties @@ -19,4 +19,4 @@ # # 1 day -vulas.kb.importer.refetchAllMs = 86400000 +vulas.kb-importer.refetchAllMs = 86400000 From 7b12ce64c9481894cc93d3d0f7a9eeb6d237643a Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 16:23:43 +0200 Subject: [PATCH 35/83] Removed thread from importSingleVuln --- .../main/java/org/eclipse/steady/kb/Manager.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 676d33740..0ac4e976b 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -192,24 +192,14 @@ public void stop() { public void importSingleVuln( String vulnDirStr, HashMap mapCommandOptionValues, String vulnId) { - - // Should have a lock per vulnerability - + log.info("Initializing process for directory " + vulnDirStr); - if (this.executor.isShutdown() || this.executor.isTerminated()) { - this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); - } - // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); ImportCommand command = new ImportCommand(this, args, BackendConnector.getInstance()); - if (mapCommandOptionValues.containsKey(ImportCommand.SEQUENTIAL)) { - command.run(); - } else { - executor.submit(command); - } + command.run(); } public String status() { From 738c8f1ee5c3c0e5b8c93b7deb5dcebeac77f599 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 16:49:10 +0200 Subject: [PATCH 36/83] Added licenses. Removed one file --- .../eclipse/steady/kb/ImporterController.java | 19 +++++++ .../main/java/org/eclipse/steady/kb/Main.java | 19 +++++++ .../steady/shared/enums/GoalClient.java | 52 ------------------- 3 files changed, 38 insertions(+), 52 deletions(-) delete mode 100755 shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 56b5f222e..19ca78407 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -1,3 +1,22 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ + package org.eclipse.steady.kb; import org.springframework.web.bind.annotation.RestController; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index c0b495755..bb92dcead 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -1,3 +1,22 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ + package org.eclipse.steady.kb; import java.util.Arrays; diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java deleted file mode 100755 index 6e015c7b2..000000000 --- a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.shared.enums; - -/** - * The client running goal(s). - */ -public enum GoalClient { - CLI((byte) 10), - MAVEN_PLUGIN((byte) 20), - REST_SERVICE((byte) 30), - AGENT((byte) 40), - SETUPTOOLS((byte) 50), - GRADLE_PLUGIN((byte) 60); - - private byte value; - - private GoalClient(byte _value) { - this.value = _value; - } - - /** - *

    toString.

    - * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (this.value == 10) return "CLI"; - else if (this.value == 20) return "MAVEN"; - else if (this.value == 30) return "REST"; - else if (this.value == 40) return "AGENT"; - else if (this.value == 50) return "SETUPTOOLS"; - else if (this.value == 60) return "GRADLE"; - else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); - } -} From 0930dea7e28dfe1c780105810c40f71812fb20ad Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 17:00:46 +0200 Subject: [PATCH 37/83] Added license to kb-importer/pom.xml --- kb-importer/pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 08a60d0ce..96560263f 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -1,4 +1,18 @@ + 4.0.0 From 8e3f885516f51fdc6d49034ae87b26ff1da99fbb Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 17:15:12 +0200 Subject: [PATCH 38/83] Fixed code style --- java-files.txt | 841 +++++++++--------- .../org/eclipse/steady/kb/ImportCommand.java | 24 +- .../eclipse/steady/kb/ImporterController.java | 268 +++--- .../main/java/org/eclipse/steady/kb/Main.java | 14 +- .../java/org/eclipse/steady/kb/Manager.java | 22 +- .../steady/kb/task/ExtractOrClone.java | 44 +- .../kb/task/ImportAffectedLibraries.java | 1 - .../steady/kb/task/ImportVulnerability.java | 7 +- .../java/org/eclipse/steady/kb/task/Task.java | 4 +- .../org/eclipse/steady/kb/ImportTest.java | 5 +- .../java/org/eclipse/steady/kb/MainTest.java | 3 +- .../steady/kb/task/TestExtractOrClone.java | 56 +- .../eclipse/steady/kb/util/MetadataTest.java | 3 +- 13 files changed, 645 insertions(+), 647 deletions(-) diff --git a/java-files.txt b/java-files.txt index 7356a3f28..c6e7baa7a 100644 --- a/java-files.txt +++ b/java-files.txt @@ -1,596 +1,591 @@ -shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java -shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java -shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java -shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java -shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java -shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java -shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java -shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java -shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java -shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java -shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java -shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/Constants.java -shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java -shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/StringList.java -shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java +shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java +shared/src/main/java/org/eclipse/steady/shared/package-info.java +shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java +shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java +shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java +shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java +shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java +shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java +shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java +shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java +shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java +shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java +shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java +shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java +shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java -shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java -shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java -shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java +shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java -shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java -shared/src/main/java/org/eclipse/steady/shared/package-info.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java -shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java -shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java -shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java -lang/src/main/java/org/eclipse/steady/Construct.java +shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java +shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java +shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java +shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java +shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java +shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java +shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java +shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java +shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java +shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java +shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java +shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java +shared/src/main/java/org/eclipse/steady/shared/util/Constants.java +shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/package-info.java +shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java +shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java +shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java +shared/src/main/java/org/eclipse/steady/shared/util/StringList.java +shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java +shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java +shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java +lang/src/main/java/org/eclipse/steady/DirAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java +lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java +lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java +lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java +lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java +lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java +lang/src/main/java/org/eclipse/steady/sign/Signature.java +lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java +lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java +lang/src/main/java/org/eclipse/steady/FileAnalyzer.java lang/src/main/java/org/eclipse/steady/ConstructId.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java +lang/src/main/java/org/eclipse/steady/tasks/package-info.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java +lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java +lang/src/main/java/org/eclipse/steady/tasks/BomTask.java +lang/src/main/java/org/eclipse/steady/tasks/Task.java +lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java +lang/src/main/java/org/eclipse/steady/FileAnalysisException.java +lang/src/main/java/org/eclipse/steady/report/Report.java +lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java -lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java -lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java -lang/src/main/java/org/eclipse/steady/goals/GoalContext.java lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java +lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java -lang/src/main/java/org/eclipse/steady/goals/TestGoal.java -lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java -lang/src/main/java/org/eclipse/steady/goals/package-info.java -lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java lang/src/main/java/org/eclipse/steady/goals/ReportException.java +lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java +lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java +lang/src/main/java/org/eclipse/steady/goals/package-info.java lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java +lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java +lang/src/main/java/org/eclipse/steady/goals/GoalContext.java lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java -lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java lang/src/main/java/org/eclipse/steady/goals/BomGoal.java -lang/src/main/java/org/eclipse/steady/report/Report.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java -lang/src/main/java/org/eclipse/steady/tasks/package-info.java -lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java -lang/src/main/java/org/eclipse/steady/tasks/BomTask.java -lang/src/main/java/org/eclipse/steady/tasks/Task.java -lang/src/main/java/org/eclipse/steady/FileAnalyzer.java -lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java -lang/src/main/java/org/eclipse/steady/sign/Signature.java -lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java -lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java -lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java -lang/src/main/java/org/eclipse/steady/ConstructChange.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java -lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java -lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/goals/TestGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java +lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java +lang/src/main/java/org/eclipse/steady/Construct.java lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java +lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java -lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java +lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java -lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java -lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java -lang/src/main/java/org/eclipse/steady/core/util/package-info.java +lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java +lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java +lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java -lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java -lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java -lang/src/main/java/org/eclipse/steady/FileAnalysisException.java -lang/src/main/java/org/eclipse/steady/DirAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaId.java -lang-java/src/main/java/org/eclipse/steady/java/PomParser.java -lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java -lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java -lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java -lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java +lang/src/main/java/org/eclipse/steady/core/util/package-info.java +lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +lang/src/main/java/org/eclipse/steady/ConstructChange.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java +lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java -lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java -lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java -lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java -lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java -lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java -lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java +lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java +lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java +lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java -lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java +lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java +lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java +lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java +lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java +lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java +lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java +lang-java/src/main/java/org/eclipse/steady/java/JavaId.java +lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java +lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java +lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java +lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java -lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java +lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java +lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java +lang-java/src/main/java/org/eclipse/steady/java/PomParser.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java +lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java +lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java +lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java +lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java +lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonId.java -lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java -lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java -lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java +lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java -repo-client/src/main/java/org/eclipse/steady/git/GitClient.java -repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java +lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java +lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java +lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java +lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java +lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java +lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java +lang-python/src/main/java/org/eclipse/steady/python/PythonId.java repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java repo-client/src/main/java/org/eclipse/steady/package-info.java -repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java -repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java +repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java +repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java +repo-client/src/main/java/org/eclipse/steady/git/GitClient.java +repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java +patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java +patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java kb-importer/src/main/java/org/eclipse/steady/kb/Main.java -kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java -kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java +kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/ValidationException.java -kb-importer/src/main/java/org/eclipse/steady/kb/exception/CommandLineParserException.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Version.java -kb-importer/src/main/java/org/eclipse/steady/kb/command/Help.java -kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java -cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java +kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java +cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java +plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java +rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java +rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java +rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java +rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java +rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java -rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java +rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java +plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java +shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java +shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java +shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java +shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java +shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java +shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java +shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java +shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java +shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java -shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java -shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java -shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java -shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java -shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java -shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java -shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java -lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java +lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java +lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java +lang/src/test/java/org/eclipse/steady/report/ReportTest.java lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java -lang/src/test/java/org/eclipse/steady/report/ReportTest.java -lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java -lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java -lang-java/src/test/java/ClassWithoutPackage.java -lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java -lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java -lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java -lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java -lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java +lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java +lang-java/src/test/java/NestedDeclarationMess.java +lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java +lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java +lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java +lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java +lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java +lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java +lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java +lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java -lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java -lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java -lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java +lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java +lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java +lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java +lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java +lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java +lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java -lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java +lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java +lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java -lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java -lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java -lang-java/src/test/java/NestedDeclarationMess.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java +lang-java/src/test/java/ClassWithoutPackage.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java +lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java lang-java-reach-soot/src/test/java/SootCallGraphTest.java +lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java -lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java +lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java +lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java repo-client/src/test/java/org/eclipse/steady/git/GitTest.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java +patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java +kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java +plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java +rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java +rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java +rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java +plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 539939606..8a61e6c85 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -46,7 +46,8 @@ public class ImportCommand implements Runnable { private HashMap args; Manager manager; - public ImportCommand(Manager manager, HashMap args, BackendConnector backendConnector) { + public ImportCommand( + Manager manager, HashMap args, BackendConnector backendConnector) { this.manager = manager; this.backendConnector = backendConnector; this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); @@ -85,8 +86,8 @@ public void run() { } } else { - manager.addNewVulnerability(vulnId); - log.info("Bug [{}] does not exist in backend", vulnId); + manager.addNewVulnerability(vulnId); + log.info("Bug [{}] does not exist in backend", vulnId); } String statementPath = findStatementPath(); @@ -99,21 +100,25 @@ public void run() { log.error("Error while reading Yaml file for [{}]", vulnId); return; } - if ((vuln.getCommits() == null || vuln.getCommits().size() == 0) + if ((vuln.getCommits() == null || vuln.getCommits().size() == 0) && (vuln.getArtifacts() == null || vuln.getArtifacts().size() == 0)) { log.warn("No fix commits or affected artifacts for vulnerability " + vuln.getVulnId()); vuln.setCommits(new ArrayList()); } else { ExtractOrClone extractOrClone = - new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString()), (boolean) args.get(SKIP_CLONE_OPTION)); - + new ExtractOrClone( + this.manager, + vuln, + new File(this.vulnDir.toString()), + (boolean) args.get(SKIP_CLONE_OPTION)); + this.stopWatch.lap("ExtractOrClone"); extractOrClone.execute(); } - + if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE && manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.SKIP_CLONE) { - + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTING); ImportVulnerability importVulnerability = new ImportVulnerability(); @@ -138,7 +143,8 @@ public void run() { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); } this.stopWatch.stop(); - log.info(vuln.getVulnId() + " StopWatch Runtime " + Long.toString(this.stopWatch.getRuntime())); + log.info( + vuln.getVulnId() + " StopWatch Runtime " + Long.toString(this.stopWatch.getRuntime())); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 19ca78407..66d775104 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -16,7 +16,6 @@ * SPDX-License-Identifier: Apache-2.0 * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors */ - package org.eclipse.steady.kb; import org.springframework.web.bind.annotation.RestController; @@ -24,151 +23,156 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.data.repository.query.Param; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.util.concurrent.TimeUnit; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.eclipse.steady.kb.Manager; import org.eclipse.steady.shared.util.VulasConfiguration; @RestController @CrossOrigin("*") public class ImporterController { - private static Logger log = LoggerFactory.getLogger(ImporterController.class); - - private Thread importerCacheFetch = null; - - final long defaultRefetchAllMs = - VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb-importer.refetchAllMs", -1); - - private final Manager manager; - - @Autowired - ImporterController() { - this.manager = new Manager(); - } - - @RequestMapping(value = "/start", method = RequestMethod.POST) - public ResponseEntity start(@RequestParam(defaultValue = "false") boolean overwrite, @RequestParam(defaultValue = "false") boolean upload, - @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone, @RequestParam(defaultValue = "0") String refetchAllMs) { - boolean started = false; - try { - if (this.manager.getIsRunningStart()) { - log.info("Importer already running"); - } else { - if (this.importerCacheFetch != null && this.importerCacheFetch.isAlive()) { - this.importerCacheFetch.interrupt(); - } - HashMap args = new HashMap(); - args.put(ImportCommand.OVERWRITE_OPTION, overwrite); - args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); - args.put(ImportCommand.VERBOSE_OPTION, verbose); - args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); - long timeToWait; - if (Long.parseLong(refetchAllMs) != 0) { - timeToWait = Long.parseLong(refetchAllMs); - } else { - timeToWait = defaultRefetchAllMs; - } - - this.importerCacheFetch = - new Thread( - new Runnable() { - public void run() { - while (true) { - manager.start("/kb-importer/data/statements", args); - - try { - log.info("Wait " + Long.toString(timeToWait/1000) + " seconds for next execution"); - Thread.sleep(timeToWait); - } catch (InterruptedException e) { - ImporterController.log.error( - "Interrupted exception: " - + e.getMessage()); - } - } - } - }, - "ImporterCacheFetch"); - this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); - - this.importerCacheFetch.start(); - started = true; - log.info("Importer started"); - } - return new ResponseEntity(started, HttpStatus.OK); - } catch (Exception e) { - log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); - return new ResponseEntity(started, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - - @RequestMapping(value = "/stop", method = RequestMethod.POST) - public ResponseEntity stop() { - boolean stopped = false; - try { - if (this.manager.getIsRunningStart() || (this.importerCacheFetch != null && this.importerCacheFetch.isAlive())) { - stopped = true; - this.manager.stop(); - this.importerCacheFetch.interrupt(); - log.info("Importer stopped"); - } else { - log.info("Importer not running"); - } - return new ResponseEntity(stopped, HttpStatus.OK); - } catch (Exception e) { - log.error("Exception when starting kb-importer cache refresh: " + e.getMessage(), e); - return new ResponseEntity(stopped, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - @RequestMapping( - value = "/start/{id}", - method = RequestMethod.POST) - public ResponseEntity importSingleVuln(@PathVariable String id, @RequestParam(defaultValue = "false") boolean overwrite, - @RequestParam(defaultValue = "false") boolean upload, @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone) { - - try { - if (this.manager.getIsRunningStart()) { - log.info("Importer already running"); - return new ResponseEntity(false, HttpStatus.SERVICE_UNAVAILABLE); - } else { - HashMap args = new HashMap(); - args.put(ImportCommand.OVERWRITE_OPTION, overwrite); - args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); - args.put(ImportCommand.VERBOSE_OPTION, verbose); - args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); - manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); - return new ResponseEntity(true, HttpStatus.OK); - } - } catch (Exception e) { - log.error("Exception when importing vulnerability: " + e.getMessage(), e); - return new ResponseEntity(false, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - @GetMapping("/status") - public String status() { - return manager.status(); - } - - @GetMapping( - value = "/status/{id}") - public String statusSingleVuln(@PathVariable String id) { - String statusStr = manager.getVulnStatus(id).toString(); - if (statusStr == null) { - return "Vulnerability not found"; - } else return statusStr; - } -} \ No newline at end of file + private static Logger log = LoggerFactory.getLogger(ImporterController.class); + + private Thread importerCacheFetch = null; + + final long defaultRefetchAllMs = + VulasConfiguration.getGlobal() + .getConfiguration() + .getLong("vulas.kb-importer.refetchAllMs", -1); + + private final Manager manager; + + @Autowired + ImporterController() { + this.manager = new Manager(); + } + + @RequestMapping(value = "/start", method = RequestMethod.POST) + public ResponseEntity start( + @RequestParam(defaultValue = "false") boolean overwrite, + @RequestParam(defaultValue = "false") boolean upload, + @RequestParam(defaultValue = "false") boolean verbose, + @RequestParam(defaultValue = "true") boolean skipClone, + @RequestParam(defaultValue = "0") String refetchAllMs) { + boolean started = false; + try { + if (this.manager.getIsRunningStart()) { + log.info("Importer already running"); + } else { + if (this.importerCacheFetch != null && this.importerCacheFetch.isAlive()) { + this.importerCacheFetch.interrupt(); + } + HashMap args = new HashMap(); + args.put(ImportCommand.OVERWRITE_OPTION, overwrite); + args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); + args.put(ImportCommand.VERBOSE_OPTION, verbose); + args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); + long timeToWait; + if (Long.parseLong(refetchAllMs) != 0) { + timeToWait = Long.parseLong(refetchAllMs); + } else { + timeToWait = defaultRefetchAllMs; + } + + this.importerCacheFetch = + new Thread( + new Runnable() { + public void run() { + while (true) { + manager.start("/kb-importer/data/statements", args); + + try { + log.info( + "Wait " + + Long.toString(timeToWait / 1000) + + " seconds for next execution"); + Thread.sleep(timeToWait); + } catch (InterruptedException e) { + ImporterController.log.error("Interrupted exception: " + e.getMessage()); + } + } + } + }, + "ImporterCacheFetch"); + this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); + + this.importerCacheFetch.start(); + started = true; + log.info("Importer started"); + } + return new ResponseEntity(started, HttpStatus.OK); + } catch (Exception e) { + log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); + return new ResponseEntity(started, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @RequestMapping(value = "/stop", method = RequestMethod.POST) + public ResponseEntity stop() { + boolean stopped = false; + try { + if (this.manager.getIsRunningStart() + || (this.importerCacheFetch != null && this.importerCacheFetch.isAlive())) { + stopped = true; + this.manager.stop(); + this.importerCacheFetch.interrupt(); + log.info("Importer stopped"); + } else { + log.info("Importer not running"); + } + return new ResponseEntity(stopped, HttpStatus.OK); + } catch (Exception e) { + log.error("Exception when starting kb-importer cache refresh: " + e.getMessage(), e); + return new ResponseEntity(stopped, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @RequestMapping(value = "/start/{id}", method = RequestMethod.POST) + public ResponseEntity importSingleVuln( + @PathVariable String id, + @RequestParam(defaultValue = "false") boolean overwrite, + @RequestParam(defaultValue = "false") boolean upload, + @RequestParam(defaultValue = "false") boolean verbose, + @RequestParam(defaultValue = "true") boolean skipClone) { + + try { + if (this.manager.getIsRunningStart()) { + log.info("Importer already running"); + return new ResponseEntity(false, HttpStatus.SERVICE_UNAVAILABLE); + } else { + HashMap args = new HashMap(); + args.put(ImportCommand.OVERWRITE_OPTION, overwrite); + args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); + args.put(ImportCommand.VERBOSE_OPTION, verbose); + args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); + manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); + return new ResponseEntity(true, HttpStatus.OK); + } + } catch (Exception e) { + log.error("Exception when importing vulnerability: " + e.getMessage(), e); + return new ResponseEntity(false, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/status") + public String status() { + return manager.status(); + } + + @GetMapping(value = "/status/{id}") + public String statusSingleVuln(@PathVariable String id) { + String statusStr = manager.getVulnStatus(id).toString(); + if (statusStr == null) { + return "Vulnerability not found"; + } else return statusStr; + } +} diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index bb92dcead..074b07f4d 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -16,23 +16,17 @@ * SPDX-License-Identifier: Apache-2.0 * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors */ - package org.eclipse.steady.kb; -import java.util.Arrays; -import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Main { - public static void main(String[] args) { - SpringApplication.run(Main.class, args); - } - + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 0ac4e976b..c6aae9a41 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -1,6 +1,5 @@ package org.eclipse.steady.kb; -import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.Set; import java.util.Map; @@ -26,12 +25,13 @@ public class Manager { - private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private static final org.apache.logging.log4j.Logger log = + org.apache.logging.log4j.LogManager.getLogger(); private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); // (ThreadPoolExecutor) Executors.newCachedThreadPool(); - (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + (ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); @@ -40,7 +40,7 @@ public class Manager { private static Map failures = new HashMap(); Map repoLocks = new HashMap(); - + private boolean isRunningStart; public enum VulnStatus { @@ -93,7 +93,7 @@ public boolean getIsRunningStart() { } public synchronized void start( - String statementsPath, HashMap mapCommandOptionValues) { + String statementsPath, HashMap mapCommandOptionValues) { this.isRunningStart = true; if (this.executor.isShutdown() || this.executor.isTerminated()) { this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); @@ -122,7 +122,6 @@ public synchronized void start( log.info("Found vulnerability directory: " + vulnDir.getName()); String vulnId = vulnDir.getName().toString(); setVulnStatus(vulnId, VulnStatus.NOT_STARTED); - } BackendConnector backendConnector = BackendConnector.getInstance(); for (Path vulnDirPath : vulnDirsPaths) { @@ -172,7 +171,9 @@ public void kaybeeUpdate() throws IOException, InterruptedException { public void kaybeePull() throws IOException, InterruptedException { // TODO : write directories as option/property - Process pullProcess = Runtime.getRuntime().exec("/kb-importer/data/kaybee pull -c /kb-importer/conf/kaybeeconf.yaml"); + Process pullProcess = + Runtime.getRuntime() + .exec("/kb-importer/data/kaybee pull -c /kb-importer/conf/kaybeeconf.yaml"); pullProcess.waitFor(); if (pullProcess.exitValue() != 0) { log.error("Kaybee pull failed"); @@ -191,8 +192,8 @@ public void stop() { } public void importSingleVuln( - String vulnDirStr, HashMap mapCommandOptionValues, String vulnId) { - + String vulnDirStr, HashMap mapCommandOptionValues, String vulnId) { + log.info("Initializing process for directory " + vulnDirStr); // It is necessary to copy the arguments to avoid concurrent modification @@ -208,7 +209,7 @@ public String status() { if (!statusCount.containsKey(vulnStatus)) { statusCount.put(vulnStatus, 0); } - statusCount.put(vulnStatus, statusCount.get(vulnStatus)+1); + statusCount.put(vulnStatus, statusCount.get(vulnStatus) + 1); } HashMap newVulnStatus = new HashMap(); for (String vulnId : newVulnerabilities) { @@ -221,5 +222,4 @@ public String status() { String statusStr = new Gson().toJson(statusMap); return statusStr; } - } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 3bad732d7..f6f3b51c6 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -8,9 +8,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.HashMap; -import java.util.ArrayList; import org.apache.logging.log4j.Logger; import org.eclipse.steady.shared.util.FileUtil; @@ -99,11 +97,15 @@ public void clone(Vulnerability vuln, String dirPath) { String repoUrl = commit.getRepoUrl(); String commitId = commit.getCommitId(); String commitDirPath = dirPath + File.separator + commitId; - //System.out.println("commitDirPath : " + commitDirPath); + // System.out.println("commitDirPath : " + commitDirPath); File commitDir = new File(commitDirPath); commitDir.mkdir(); - String repoDirPath = dirPath + File.separator + - GIT_DIRECTORY + File.separator + repoUrl.replace("https://", "").replace("/", "_"); + String repoDirPath = + dirPath + + File.separator + + GIT_DIRECTORY + + File.separator + + repoUrl.replace("https://", "").replace("/", "_"); manager.lockRepo(repoUrl); try { cloneOnce(repoUrl, repoDirPath); @@ -148,11 +150,14 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri BufferedReader gitShowError = new BufferedReader(new InputStreamReader(gitShow.getErrorStream())); String repoUrl = commit.getRepoUrl(); - log.error("Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); + log.error( + "Failed to get commit timestamp for repository " + repoUrl + " commit id " + commitId); String error = gitShowError.readLine(); log.error("git show: " + error); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); - manager.addFailure(vuln.getVulnId(), "Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); + manager.addFailure( + vuln.getVulnId(), + "Failed to get commit timestamp for repository " + repoUrl + " commit id " + commitId); } } @@ -198,15 +203,14 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename String commitDirPath = dirPath + File.separator + commitId; String commitStr; - if (before) { + if (before) { commitStr = commitId + "~1:"; } else { commitStr = commitId + ":"; } - String beforeOrAfter = before? "before" : "after"; + String beforeOrAfter = before ? "before" : "after"; // for each file modified in the commit... - String gitCatCommand = - "git -C " + repoDirPath + " cat-file -e " + commitStr + filename; + String gitCatCommand = "git -C " + repoDirPath + " cat-file -e " + commitStr + filename; Process gitCat = Runtime.getRuntime().exec(gitCatCommand); log.info("Executing: " + gitCatCommand); BufferedReader gitCatErrorInput = @@ -217,20 +221,14 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename File file = new File(filepath); File dir = file.getParentFile(); dir.mkdirs(); - - String diffFileCommand = - "git -C " - + repoDirPath - + " show " - + commitId - + "~1:" - + filename; + + String diffFileCommand = "git -C " + repoDirPath + " show " + commitId + "~1:" + filename; log.info("Executing: " + diffFileCommand); Process gitDiffFile = Runtime.getRuntime().exec(diffFileCommand); - + writeCmdOutputToFile(gitDiffFile, filepath); - + gitDiffFile.waitFor(); } else { @@ -243,8 +241,7 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename } public void writeCmdOutputToFile(Process process, String filepath) throws IOException { - BufferedReader stdInput = - new BufferedReader(new InputStreamReader(process.getInputStream())); + BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; String lines = ""; while ((line = stdInput.readLine()) != null) { @@ -255,5 +252,4 @@ public void writeCmdOutputToFile(Process process, String filepath) throws IOExce Files.write(path, bytes); } - } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 88e0f6ab1..71201c9bb 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -141,5 +141,4 @@ private void setAfftectedLib(Artifact artifact, AffectedLibrary affectedLibrary) affectedLibrary.setAffectedcc(Collections.emptyList()); affectedLibrary.setSource(AffectedVersionSource.KAYBEE); } - } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 989d3837a..9f27def79 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -37,8 +37,8 @@ import org.eclipse.steady.ConstructChange; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; -//import org.eclipse.steady.kb.command.Command; -//import org.eclipse.steady.kb.command.Import; +// import org.eclipse.steady.kb.command.Command; +// import org.eclipse.steady.kb.command.Import; import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Note; @@ -96,7 +96,8 @@ public boolean accept(File file) { Map> allChanges = new HashMap>(); for (Commit commit : commits) { changes = ConstructSet.identifyConstructChanges(commit, allChanges); - if (args.containsKey(ImportCommand.VERBOSE_OPTION) && (Boolean) args.get(ImportCommand.VERBOSE_OPTION)) { + if (args.containsKey(ImportCommand.VERBOSE_OPTION) + && (Boolean) args.get(ImportCommand.VERBOSE_OPTION)) { for (ConstructChange chg : changes) { log.info(chg.toString()); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java index d6310244b..0dc9eef2e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java @@ -2,7 +2,7 @@ import java.util.HashMap; import org.eclipse.steady.backend.BackendConnector; -//import org.eclipse.steady.kb.command.Command; +// import org.eclipse.steady.kb.command.Command; import org.eclipse.steady.kb.model.Vulnerability; /** @@ -14,7 +14,7 @@ public interface Task { * * @return name of command */ - //Command.NAME getCommandName(); + // Command.NAME getCommandName(); /** * Task Executor diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java index d68d55eb4..a0c29933d 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java @@ -21,11 +21,8 @@ import org.eclipse.steady.kb.task.MockBackConnector; import org.eclipse.steady.kb.model.Vulnerability; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; import java.util.HashMap; -import org.apache.commons.cli.Options; import java.io.IOException; import com.google.gson.JsonSyntaxException; @@ -33,7 +30,7 @@ import org.junit.Test; public class ImportTest { - + @Test public void testImportSkipExistingBug() throws JsonSyntaxException, IOException, BackendConnectionException { diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java index ed3dd3b99..28b283547 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java @@ -18,12 +18,11 @@ */ package org.eclipse.steady.kb; -import org.junit.Test; public class MainTest { private static final String SPACE = " "; -/* + /* @Test public void testHelp() { String args = "help"; diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index c35ae0cb3..835c948f5 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -2,9 +2,6 @@ import java.io.IOException; import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Arrays; @@ -13,15 +10,11 @@ import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.Manager; import org.eclipse.steady.kb.util.Metadata; -import org.eclipse.steady.shared.util.VulasConfiguration; -import com.github.packageurl.MalformedPackageURLException; -import com.google.gson.JsonSyntaxException; import org.junit.After; import org.junit.Test; import org.junit.Before; import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; import org.junit.runner.RunWith; import org.apache.commons.io.FileUtils; @@ -45,20 +38,17 @@ public TestExtractOrClone(String dirName) { this.dirPath = classLoader.getResource(dirName).getPath(); this.dir = new File(dirPath); } - + @Parameterized.Parameters public static List directories() { - return Arrays.asList(new Object[][] { - { "testRootDir6" }, - { "testRootDir7" } - }); + return Arrays.asList(new Object[][] {{"testRootDir6"}, {"testRootDir7"}}); } @Test public void testClone() throws IOException { String statementPath = dirPath + File.separator + "statement.yaml"; - + Vulnerability vuln = Metadata.getFromYaml(statementPath); HashMap args = new HashMap(); @@ -69,26 +59,43 @@ public void testClone() throws IOException { ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, this.dir, false); extractOrClone.execute(); - File commitDir1 = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); - File commitDir1before = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "before"); - File commitDir1after = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + File.separator + "after"); - File someJavaFile = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8/after/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java"); - File commitDir2 = new File(dirPath + File.separator + "d3acf45ea4db51fa5c4cbd0bc0e7b6d9ef805e6"); - File commitDir3 = new File(dirPath + File.separator + "e0de9126ed8cf25cf141d3e66420da94e350708"); + File commitDir1 = + new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); + File commitDir1before = + new File( + dirPath + + File.separator + + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + + File.separator + + "before"); + File commitDir1after = + new File( + dirPath + + File.separator + + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8" + + File.separator + + "after"); + File someJavaFile = + new File( + dirPath + + File.separator + + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8/after/spring-expression/src/test/java/org/springframework/expression/spel/SpelCompilationCoverageTests.java"); + File commitDir2 = + new File(dirPath + File.separator + "d3acf45ea4db51fa5c4cbd0bc0e7b6d9ef805e6"); + File commitDir3 = + new File(dirPath + File.separator + "e0de9126ed8cf25cf141d3e66420da94e350708"); org.junit.Assert.assertEquals(commitDir1before.exists(), true); org.junit.Assert.assertEquals(commitDir1after.exists(), true); - + org.junit.Assert.assertEquals(commitDir1before.list().length == 1, true); org.junit.Assert.assertEquals(commitDir1after.list().length == 1, true); - + org.junit.Assert.assertEquals(someJavaFile.exists(), true); org.junit.Assert.assertEquals(commitDir2.exists(), true); org.junit.Assert.assertEquals(commitDir3.exists(), true); - } - @After public void cleanup() { try { @@ -97,5 +104,4 @@ public void cleanup() { System.out.println(e.getMessage()); } } - -} \ No newline at end of file +} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java index f8dbce45e..a1d54707c 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java @@ -102,7 +102,8 @@ public void testInvalidCommitMetadataDir() throws JsonSyntaxException, IOExcepti public void testGetFromYaml() throws IOException { ClassLoader classLoader = getClass().getClassLoader(); - String path = classLoader.getResource("testRootDir1").getPath() + File.separator + "statement.yaml"; + String path = + classLoader.getResource("testRootDir1").getPath() + File.separator + "statement.yaml"; Vulnerability vuln = Metadata.getFromYaml(path); assertEquals(3, vuln.getArtifacts().size()); From ee870ddb457719a7ad6ee3cbe1890d4a92fefcf4 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Fri, 27 May 2022 17:31:46 +0200 Subject: [PATCH 39/83] Fixed name and description in kb-importer pom.xml --- kb-importer/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 96560263f..00954f147 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -25,8 +25,8 @@ org.eclipse.steady kb-importer 3.2.3-SNAPSHOT - demo - Demo project for Spring Boot + Knowledge Base Importer + 1.8 From c827f2837e1b6bb6fbb6329594128fb287b91652 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 09:32:00 +0200 Subject: [PATCH 40/83] function to retry failed vulnerabilities --- kb-importer/pom.xml | 1 - .../org/eclipse/steady/kb/ImportCommand.java | 7 +- .../java/org/eclipse/steady/kb/Manager.java | 48 ++++++-- .../kb/task/ImportAffectedLibraries.java | 3 +- .../steady/kb/task/ImportVulnerability.java | 2 +- .../backend/BackendConnectionException.java | 2 + .../steady/backend/BackendConnector.java | 110 +++++++++--------- .../backend/requests/BasicHttpRequest.java | 10 +- .../requests/ConditionalHttpRequest.java | 2 +- .../steady/backend/requests/HttpRequest.java | 2 +- .../backend/requests/HttpRequestList.java | 2 +- .../steady/core/util/CoreConfiguration.java | 4 +- .../eclipse/steady/goals/AbstractAppGoal.java | 4 +- .../steady/shared/enums/GoalClient.java | 52 +++++++++ 14 files changed, 172 insertions(+), 77 deletions(-) create mode 100644 shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 00954f147..f15725110 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -20,7 +20,6 @@ org.springframework.boot spring-boot-starter-parent 2.6.3 - org.eclipse.steady kb-importer diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 8a61e6c85..7308ff30c 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -67,8 +67,11 @@ public void run() { boolean bugExists = false; try { bugExists = this.backendConnector.isBugExisting(vulnId); - } catch (BackendConnectionException e) { + } catch (BackendConnectionException | IOException e) { log.error("Can't connect to the Backend"); + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_CONNECTION); + manager.addFailure(vulnId, e.toString()); + e.printStackTrace(); return; } Boolean overwrite = false; @@ -131,6 +134,7 @@ public void run() { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); manager.addFailure(vuln.getVulnId(), e.toString()); e.printStackTrace(); + return; } this.stopWatch.lap("ImportAffectedLibraries"); try { @@ -139,6 +143,7 @@ public void run() { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_LIB); manager.addFailure(vuln.getVulnId(), e.toString()); e.printStackTrace(); + return; } manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index c6aae9a41..ee04cccad 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -1,6 +1,7 @@ package org.eclipse.steady.kb; import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.Map; import java.util.HashMap; @@ -30,8 +31,8 @@ public class Manager { private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); - // (ThreadPoolExecutor) Executors.newCachedThreadPool(); - (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + (ThreadPoolExecutor) Executors.newCachedThreadPool(); + //(ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); @@ -51,6 +52,7 @@ public enum VulnStatus { IMPORTING, IMPORTED, FAILED_EXTRACT_OR_CLONE, + FAILED_CONNECTION, SKIP_CLONE, FAILED_IMPORT_LIB, FAILED_IMPORT_VULN @@ -95,9 +97,7 @@ public boolean getIsRunningStart() { public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { this.isRunningStart = true; - if (this.executor.isShutdown() || this.executor.isTerminated()) { - this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); - } + newVulnerabilities = new LinkedHashSet(); try { @@ -110,11 +110,30 @@ public synchronized void start( this.isRunningStart = false; return; } + setUploadConfiguration(mapCommandOptionValues); + List vulnIds = this.identifyVulnerabilitiesToImport(statementsPath); + startList(statementsPath, mapCommandOptionValues, vulnIds); + retryFailed(statementsPath, mapCommandOptionValues); + this.isRunningStart = false; + } + + public void retryFailed( + String statementsPath, HashMap mapCommandOptionValues) { + + List failedVulns = new ArrayList(); + for (String vulnId : failures.keySet()) { + failedVulns.add(vulnId); + } + while (!failures.isEmpty()) { + startList(statementsPath, mapCommandOptionValues, failedVulns); + } + } + public List identifyVulnerabilitiesToImport(String statementsPath) { File statementsDir = new File(statementsPath); File[] subdirs = statementsDir.listFiles(); + List vulnIds = new ArrayList(); - setUploadConfiguration(mapCommandOptionValues); final DirWithFileSearch search = new DirWithFileSearch("statement.yaml"); Set vulnDirsPaths = search.search(Paths.get(statementsDir.getPath())); for (Path dirPath : vulnDirsPaths) { @@ -122,9 +141,21 @@ public synchronized void start( log.info("Found vulnerability directory: " + vulnDir.getName()); String vulnId = vulnDir.getName().toString(); setVulnStatus(vulnId, VulnStatus.NOT_STARTED); + vulnIds.add(vulnId); + } + return vulnIds; + } + + public synchronized void startList( + String statementsPath, HashMap mapCommandOptionValues, List vulnIds) { + + if (this.executor.isShutdown() || this.executor.isTerminated()) { + this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } + BackendConnector backendConnector = BackendConnector.getInstance(); - for (Path vulnDirPath : vulnDirsPaths) { + for (String vulnId : vulnIds) { + Path vulnDirPath = Paths.get(statementsPath, vulnId); File vulnDir = vulnDirPath.toFile(); String vulnDirStr = vulnDirPath.toString(); log.info("Initializing process for directory " + vulnDirPath); @@ -147,7 +178,6 @@ public synchronized void start( log.error("Process interrupted"); log.error(e.getMessage()); } - this.isRunningStart = false; } private void setUploadConfiguration(HashMap args) { @@ -180,6 +210,8 @@ public void kaybeePull() throws IOException, InterruptedException { } } + + public void stop() { try { executor.shutdownNow(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 71201c9bb..4de413556 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -18,6 +18,7 @@ */ package org.eclipse.steady.kb.task; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -51,7 +52,7 @@ public class ImportAffectedLibraries implements Task { /** {@inheritDoc} */ public void execute( Vulnerability vuln, HashMap args, BackendConnector backendConnector) - throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException { + throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException, IOException { log.info("Initiating ImportAffectedLibraries for vulnerability " + vuln.getVulnId()); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 9f27def79..c45660df5 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -214,7 +214,7 @@ private String getCVEDescription(Vulnerability _vulnerability) { String vulnId = _vulnerability.getVulnId(); try { cveString = getBackendConnector().getCVE(vulnId); - } catch (BackendConnectionException e) { + } catch (BackendConnectionException | IOException e) { log.error("Error connecting to NVD service. {}", e.getCause(), e); return null; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java index 65102d8e2..af3f6ad78 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java @@ -35,6 +35,7 @@ public class BackendConnectionException extends Exception { */ public BackendConnectionException(String _message, Throwable _cause) { super(_message, _cause); + this.printStackTrace(); } /** *

    Constructor for BackendConnectionException.

    @@ -58,6 +59,7 @@ public BackendConnectionException( _cause); this.httpResponseStatus = _response_status; this.uri = _uri; + this.printStackTrace(); } /** *

    Getter for the field httpResponseBody.

    diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index fcdf9b5fa..3164c4ea7 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -157,7 +157,7 @@ public void cleanCache() { * @return a boolean. */ public boolean isSpaceExisting(GoalContext _goal_context, Space _space) - throws BackendConnectionException { + throws BackendConnectionException, IOException { Boolean exists = false; if (!cacheSpaceExistanceCheck.containsKey(_space)) { @@ -187,7 +187,7 @@ public boolean isSpaceExisting(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Space createSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.POST, PathBuilder.spaces(), null); r.setGoalContext(_goal_context); r.setPayload(JacksonUtil.asJsonString(_space), null, true); @@ -214,7 +214,7 @@ public Space createSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void modifySpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.PUT, PathBuilder.space(_space), null); r.setGoalContext(_goal_context); @@ -230,7 +230,7 @@ public void modifySpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void cleanSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final Map params = new HashMap(); params.put("clean", "true"); final BasicHttpRequest r = @@ -247,7 +247,7 @@ public void cleanSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void deleteSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.DELETE, PathBuilder.space(_space), null); r.setGoalContext(_goal_context); @@ -265,7 +265,7 @@ public void deleteSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public boolean isAppExisting(GoalContext _goal_context, Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { Boolean exists = false; if (!cacheAppExistanceCheck.containsKey(_app)) { final BasicHttpRequest r = @@ -287,7 +287,7 @@ public boolean isAppExisting(GoalContext _goal_context, Application _app) * @throws org.eclipse.steady.backend.BackendConnectionException */ public void cleanApp(GoalContext _goal_context, Application _app, boolean _clean_history) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (this.isAppExisting(_goal_context, _app)) { final Map params = new HashMap(); params.put("clean", "true"); @@ -308,7 +308,7 @@ public void cleanApp(GoalContext _goal_context, Application _app, boolean _clean * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void purgeAppVersions(GoalContext _goal_context, Application _app, int _keep) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final Map params = new HashMap(); params.put("keep", Integer.toString(_keep)); params.put("mode", "VERSIONS"); // Mode DAYS is not yet support on client-side @@ -326,7 +326,7 @@ public void purgeAppVersions(GoalContext _goal_context, Application _app, int _k * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadApp(GoalContext _goal_context, Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final String json = JacksonUtil.asJsonString(_app, null, Views.Default.class); // The request depending on whose result either POST or PUT will be called @@ -367,7 +367,7 @@ public void uploadApp(GoalContext _goal_context, Application _app) */ public boolean uploadReachableConstructs( GoalContext _goal_context, Application _app, String _lib_digest, String _json) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (this.isAppExisting(_goal_context, _app)) { final BasicHttpRequest req = new BasicHttpRequest( @@ -393,7 +393,7 @@ public boolean uploadReachableConstructs( */ public boolean uploadTouchPoints( GoalContext _goal_context, Application _app, String _lib_digest, String _json) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (this.isAppExisting(_goal_context, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -418,7 +418,7 @@ public boolean uploadTouchPoints( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppConstructIds(GoalContext _ctx, Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (!cacheAppConstructs.containsKey(_app)) { final boolean app_exists = this.isAppExisting(_ctx, _app); final Set constructs = new HashSet(); @@ -458,7 +458,7 @@ public Set getAppConstructIds(GoalContext _ctx, Application _app) * @return a {@link java.util.Map} object. */ public Map> getAppBugs(GoalContext _ctx, Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { // Make request and put in cache if (!this.cacheBugChangeLists.containsKey(_app)) { @@ -523,7 +523,7 @@ public Map> getAppBugs(GoalContext _ctx, Application _a * @return a {@link java.util.Map} object. */ public Map> getAppBugs( - GoalContext _ctx, Application _app, String _filter) throws BackendConnectionException { + GoalContext _ctx, Application _app, String _filter) throws BackendConnectionException, IOException { // Return all change lists if (_filter == null || _filter.equals("")) { return this.getAppBugs(_ctx, _app); @@ -548,19 +548,19 @@ public Map> getAppBugs( } } - /*public VulnerableDependency[] getVulnerableAppArchiveConstructs(Application _app) throws BackendConnectionException { + /*public VulnerableDependency[] getVulnerableAppArchiveConstructs(Application _app) throws BackendConnectionException, IOException { final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET, PathBuilder.vulnArchiveConstructs(_app), null); final VulnerableDependency[] vulndeps = (VulnerableDependency[])JacksonUtil.asObject(req.send().getBody(), VulnerableDependency[].class); return vulndeps; }*/ - /*public VulnerableDependency[] getVulnerableDependencies(Application _app) throws BackendConnectionException { + /*public VulnerableDependency[] getVulnerableDependencies(Application _app) throws BackendConnectionException, IOException { final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET, PathBuilder.vulnArchiveConstructs(_app), null); final VulnerableDependency[] vulndeps = (VulnerableDependency[])JacksonUtil.asObject(req.send().getBody(), VulnerableDependency[].class); return vulndeps; }*/ - /*public VulnerableDependency getVulnerableAppArchiveDependencyConstructs(Application _app, String _sha1, String _bugId) throws BackendConnectionException{ + /*public VulnerableDependency getVulnerableAppArchiveDependencyConstructs(Application _app, String _sha1, String _bugId) throws BackendConnectionException, IOException{ final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET,PathBuilder.vulnerableDependencyConstructs(_app, _sha1, _bugId), null); VulnerableDependency vd = (VulnerableDependency)JacksonUtil.asObject(req.send().getBody(), VulnerableDependency.class); return vd; @@ -575,7 +575,7 @@ public Map> getAppBugs( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppDeps(GoalContext _ctx, Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (!cacheAppDependencies.containsKey(_app)) { final Set deps = new HashSet(); final boolean app_exists = this.isAppExisting(_ctx, _app); @@ -613,7 +613,7 @@ public Set getAppVulnDeps( boolean _include_historical, boolean _include_affected, boolean _include_affected_unconfirmed) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final Set vuln_deps = new HashSet(); final boolean app_exists = this.isAppExisting(_ctx, _app); if (app_exists) { @@ -647,7 +647,7 @@ public Set getAppVulnDeps( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public VulnerableDependency[] getVulnDeps(Boolean unconfirmedOnly) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final Map params = new HashMap(); params.put("unconfirmedOnly", unconfirmedOnly.toString()); final BasicHttpRequest req = @@ -667,7 +667,7 @@ public VulnerableDependency[] getVulnDeps(Boolean unconfirmedOnly) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppTraces(GoalContext _ctx, @NotNull Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { boolean app_exists = this.isAppExisting(_ctx, _app); final Set constructs = new HashSet(); if (app_exists) { @@ -706,7 +706,7 @@ public Set getAppTraces(GoalContext _ctx, @NotNull Application _app * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppDependencies(GoalContext _ctx, @NotNull Application _app) - throws BackendConnectionException { + throws BackendConnectionException, IOException { boolean app_exists = this.isAppExisting(_ctx, _app); final Set deps = new HashSet(); if (app_exists) { @@ -746,7 +746,7 @@ public String getLibrary(String _sha1) throws EntityNotFoundInBackendException { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); else return response.getBody(); - } catch (BackendConnectionException e) { + } catch (BackendConnectionException | IOException e) { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); } @@ -759,7 +759,7 @@ public String getLibrary(String _sha1) throws EntityNotFoundInBackendException { * @return a int. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public int countLibraryConstructs(String _ja) throws BackendConnectionException { + public int countLibraryConstructs(String _ja) throws BackendConnectionException, IOException { int count_existing = -1; String http_response = null; try { @@ -787,7 +787,7 @@ public int countLibraryConstructs(String _ja) throws BackendConnectionException * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final String sha1 = _lib.getDigest(); final String json = JacksonUtil.asJsonString(_lib, null, Views.LibDetails.class); // Override setting @@ -840,7 +840,7 @@ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) * @param _file a {@link java.nio.file.Path} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadLibraryFile(String _sha1, Path _file) throws BackendConnectionException { + public void uploadLibraryFile(String _sha1, Path _file) throws BackendConnectionException, IOException { try (final FileInputStream inputStream = new FileInputStream(_file.toFile())) { final HttpRequestList req_list = new HttpRequestList(); final BasicHttpRequest cond_req = @@ -878,7 +878,7 @@ public void uploadLibraryFile(String _sha1, Path _file) throws BackendConnection * @return a boolean. */ public boolean uploadGoalExecution(GoalContext _ctx, AbstractGoal _gexe, boolean _before) - throws BackendConnectionException { + throws BackendConnectionException, IOException { boolean ret = false; // Application goal @@ -962,7 +962,7 @@ public boolean uploadGoalExecution(GoalContext _ctx, AbstractGoal _gexe, boolean * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadTraces(GoalContext _ctx, Application _app, String _json) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (this.isAppExisting(_ctx, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -985,7 +985,7 @@ public void uploadTraces(GoalContext _ctx, Application _app, String _json) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadPaths(GoalContext _ctx, Application _app, String _json) - throws BackendConnectionException { + throws BackendConnectionException, IOException { if (this.isAppExisting(_ctx, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -1006,7 +1006,7 @@ public void uploadPaths(GoalContext _ctx, Application _app, String _json) * @return a boolean. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public boolean isBugExisting(String _bug) throws BackendConnectionException { + public boolean isBugExisting(String _bug) throws BackendConnectionException, IOException { final HttpResponse response = new BasicHttpRequest(HttpMethod.OPTIONS, PathBuilder.bug(_bug), null).send(); return response.isOk(); @@ -1019,7 +1019,7 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException { * @param _json a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadChangeList(String _bug, String _json) throws BackendConnectionException { + public void uploadChangeList(String _bug, String _json) throws BackendConnectionException, IOException { // The request depending on whose result either POST or PUT will be called final BasicHttpRequest cond_req = @@ -1047,7 +1047,7 @@ public void uploadChangeList(String _bug, String _json) throws BackendConnection * @param _bugId a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void deleteBug(String _bugId) throws BackendConnectionException { + public void deleteBug(String _bugId) throws BackendConnectionException, IOException { final BasicHttpRequest del_req = new BasicHttpRequest(HttpMethod.DELETE, PathBuilder.bug(_bugId)); @@ -1064,7 +1064,7 @@ public void deleteBug(String _bugId) throws BackendConnectionException { * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadCheckVersionResults(String _bugId, String _json) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final HashMap params = new HashMap(); params.put("source", "CHECK_VERSION"); final HttpRequestList req_list = new HttpRequestList(); @@ -1097,7 +1097,7 @@ public void uploadCheckVersionResults(String _bugId, String _json) */ public AffectedLibrary[] getBugAffectedLibraries( GoalContext _g, String _bugId, String _source, Boolean _onlyWellKnown) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final HashMap params = new HashMap(); params.put("source", _source); params.put("onlyWellKnown", _onlyWellKnown.toString()); @@ -1116,7 +1116,7 @@ public AffectedLibrary[] getBugAffectedLibraries( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void deletePatchEvalResults(String _bugId, AffectedVersionSource _source) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final HashMap params = new HashMap(); params.put("source", _source.toString()); final BasicHttpRequest del_req = @@ -1137,7 +1137,7 @@ public void deletePatchEvalResults(String _bugId, AffectedVersionSource _source) */ public void uploadBugAffectedLibraries( GoalContext _g, String _bugId, String _json, AffectedVersionSource _source) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final HashMap params = new HashMap(); params.put("source", _source.toString()); @@ -1222,7 +1222,7 @@ public void batchUpload(GoalContext _ctx) { } else { BackendConnector.log.error("HTTP response status [" + response.getStatus() + "], no AST for GAV [" + _lib + "] and construct " + _cid + " found"); } - } catch (BackendConnectionException e1) { + } catch (BackendConnectionException | IOException e1) { BackendConnector.log.error("Error while retrieving AST for GAV [" + _lib + "] and construct " + _cid + ": " + e1.getMessage(), e1); } return ast; @@ -1239,7 +1239,7 @@ public Signature getConstructSignature(String _sha1, ConstructId _cid) { } else { BackendConnector.log.error("HTTP response status [" + response.getStatus() + "], no AST for SHA1 [" + _sha1 + "] and construct " + _cid + " found"); } - } catch (BackendConnectionException e1) { + } catch (BackendConnectionException | IOException e1) { BackendConnector.log.error("Error while retrieving AST for SHA1 [" + _sha1 + "] and construct " + _cid + ": " + e1.getMessage(), e1); } return ast; @@ -1253,7 +1253,7 @@ public Signature getConstructSignature(String _sha1, ConstructId _cid) { * @return a {@link org.eclipse.steady.shared.json.model.Bug} object. * @param _g a {@link org.eclipse.steady.goals.GoalContext} object */ - public Bug getBug(GoalContext _g, String _bugId) throws BackendConnectionException { + public Bug getBug(GoalContext _g, String _bugId) throws BackendConnectionException, IOException { BasicHttpRequest request = new BasicHttpRequest(HttpMethod.GET, PathBuilder.bug(_bugId), null); if (_g != null) request.setGoalContext(_g); HttpResponse r = request.send(); @@ -1283,7 +1283,7 @@ public String getClassLibraryIds(String _className) { } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1315,7 +1315,7 @@ public synchronized String getAstForQnameInLib( } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1337,7 +1337,7 @@ public synchronized String getSourcesForQnameInLib(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1355,7 +1355,7 @@ public synchronized String getSourcesForQnameInLib(String qString) { */ public synchronized ConstructId[] getArtifactBugConstructsIntersection( String _qString, List c, String packaging, ProgrammingLanguage lang) - throws BackendConnectionException { + throws BackendConnectionException, IOException { String json = null; BasicHttpRequest bhr = new BasicHttpRequest( @@ -1389,7 +1389,7 @@ public String getJarConstructs(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1416,7 +1416,7 @@ public synchronized String getAstDiff(GoalContext _g, String _json) { json = response.getBody(); // ast = (String)JacksonUtil.asObject(json, String.class); } - } catch (BackendConnectionException ex) { + } catch (BackendConnectionException | IOException ex) { log.error(ex); } return json; @@ -1429,7 +1429,7 @@ public synchronized String getAstDiff(GoalContext _g, String _json) { * @return an array of {@link org.eclipse.steady.shared.json.model.Library} objects. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public Library[] getBugLibraries(String _bugId) throws BackendConnectionException { + public Library[] getBugLibraries(String _bugId) throws BackendConnectionException, IOException { final String json = new BasicHttpRequest(HttpMethod.GET, PathBuilder.bugLibraryVersions(_bugId), null) .send() @@ -1448,7 +1448,7 @@ public Library[] getBugLibraries(String _bugId) throws BackendConnectionExceptio * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) - throws BackendConnectionException { + throws BackendConnectionException, IOException , IOException{ String json = null; Artifact[] result = null; @@ -1472,7 +1472,7 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) * @return a {@link org.eclipse.steady.shared.json.model.Artifact} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public Artifact getArtifact(String _g, String _a, String _v) throws BackendConnectionException { + public Artifact getArtifact(String _g, String _a, String _v) throws BackendConnectionException, IOException { String json = null; Artifact result = null; @@ -1496,7 +1496,7 @@ public Artifact getArtifact(String _g, String _a, String _v) throws BackendConne * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public synchronized ConstructId[] getArtifactConstructs(String _g, String _a, String _v) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final String json = new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.artifactsConstruct(_g, _a, _v), null) @@ -1521,7 +1521,7 @@ public synchronized ConstructId[] getArtifactConstructs(String _g, String _a, St */ public synchronized boolean doesArtifactExist( String _g, String _a, String _v, Boolean _sources, String packaging) - throws InterruptedException, BackendConnectionException { + throws InterruptedException, BackendConnectionException, IOException { final Map params = new HashMap(); if (_sources != null && _sources) params.put("classifier", "sources"); @@ -1557,7 +1557,7 @@ public synchronized boolean doesArtifactExist( * @return a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionException { + public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionException, IOException { final String json = new BasicHttpRequest(Service.BACKEND, HttpMethod.GET, PathBuilder.bugs(_l), null) .send() @@ -1577,7 +1577,7 @@ public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionExcept * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public HttpResponse getJarForLib(String _g, String _a, String _v, Boolean _s, String _d) - throws BackendConnectionException { + throws BackendConnectionException, IOException { BasicHttpRequest b = new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.downloadArtifactJars(_g, _a, _v, _s), null); @@ -1592,7 +1592,7 @@ public HttpResponse getJarForLib(String _g, String _a, String _v, Boolean _s, St * @return a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public String getBugsForLib(String _digest) throws BackendConnectionException { + public String getBugsForLib(String _digest) throws BackendConnectionException, IOException { final String json = new BasicHttpRequest(Service.BACKEND, HttpMethod.GET, PathBuilder.libbugs(_digest), null) .send() @@ -1619,7 +1619,7 @@ public AffectedLibrary[] getBugAffectedLibraries( String _artifact, String _version, AffectedVersionSource _source) - throws BackendConnectionException { + throws BackendConnectionException, IOException { final HashMap params = new HashMap(); if (params != null) params.put("source", _source.toString()); BasicHttpRequest request = @@ -1641,7 +1641,7 @@ public AffectedLibrary[] getBugAffectedLibraries( * @return String * @throws org.eclipse.steady.backend.BackendConnectionException */ - public String getCVE(String _bugId) throws BackendConnectionException { + public String getCVE(String _bugId) throws BackendConnectionException, IOException { return new BasicHttpRequest(HttpMethod.GET, PathBuilder.cve(_bugId), null).send().getBody(); } } diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index 1702bff40..6058e8c12 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -210,7 +210,7 @@ private boolean isUploadRequest() { * @return a {@link org.eclipse.steady.backend.HttpResponse} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public HttpResponse send() throws BackendConnectionException { + public HttpResponse send() throws BackendConnectionException, IOException { if (this.response == null) { // Check JSON Exception exception = @@ -334,7 +334,7 @@ public void deletePayloadFromDisk() throws IOException { if (this.payloadPath != null) Paths.get(this.payloadPath).toFile().deleteOnExit(); } - private final HttpResponse sendRequest() throws BackendConnectionException { + private final HttpResponse sendRequest() throws BackendConnectionException, IOException { int response_code = -1; org.apache.http.HttpResponse httpResponse = null; @@ -415,7 +415,7 @@ private final HttpResponse sendRequest() throws BackendConnectionException { requestBuilder.setConfig(config); httpUriRequest = requestBuilder.build(); - try { + //try { do { is_503 = false; @@ -542,7 +542,7 @@ else if (response.isServerError() } } while (repeater.repeat(is_503)); if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); - } catch (BackendConnectionException bce) { + /*} catch (BackendConnectionException bce) { this.logHeaderFields(" Request-header", httpUriRequest.getAllHeaders()); this.logHeaderFields(" Response-header", httpResponse.getAllHeaders()); if (bce.getHttpResponseBody() != null) @@ -557,7 +557,7 @@ else if (response.isServerError() final BackendConnectionException bce = new BackendConnectionException(this.method, uri, response_code, e); throwBceException(httpResponse, bce); - } + }*/ return response; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java index 59dd0f467..70525efd4 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java @@ -91,7 +91,7 @@ public HttpRequest setGoalContext(GoalContext _ctx) { * First performs the conditional requests. Only if all the responses meets the condition, the actual request will be performed. */ @Override - public HttpResponse send() throws IllegalStateException, BackendConnectionException { + public HttpResponse send() throws IllegalStateException, BackendConnectionException, IOException { if (this.conditionRequest == null || this.conditions.size() == 0) throw new IllegalStateException("No condition request or no conditions set"); diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java index 5d3227850..5ab798b48 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java @@ -36,7 +36,7 @@ public interface HttpRequest extends Serializable { * @return a {@link org.eclipse.steady.backend.HttpResponse} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public HttpResponse send() throws BackendConnectionException; + public HttpResponse send() throws BackendConnectionException, IOException; /** *

    getGoalContext.

    diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java index c955b07be..83c156491 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java @@ -83,7 +83,7 @@ public HttpRequest setGoalContext(GoalContext _ctx) { * stop in case of a successful call. */ @Override - public HttpResponse send() throws BackendConnectionException { + public HttpResponse send() throws BackendConnectionException, IOException { HttpResponse response = null; for (HttpRequest r : this.list) { response = r.send(); diff --git a/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java b/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java index 348207d67..8e28b8466 100755 --- a/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +++ b/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java @@ -20,6 +20,8 @@ import java.util.ServiceLoader; +import java.io.IOException; + import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.logging.log4j.Logger; @@ -369,7 +371,7 @@ public static final boolean existsInBackend(Application _app) { exists = BackendConnector.getInstance() .isAppExisting(CoreConfiguration.buildGoalContextFromGlobalConfiguration(), _app); - } catch (BackendConnectionException e) { + } catch (BackendConnectionException | IOException e) { log.error("Error while checking whether " + _app + " exists in backend: " + e.getMessage()); } return exists; diff --git a/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java b/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java index 10376350a..2072c1512 100644 --- a/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +++ b/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Set; +import java.io.IOException; + import org.apache.logging.log4j.Logger; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; @@ -133,7 +135,7 @@ protected void prepareExecution() throws GoalConfigurationException { "Workspace [" + this.getGoalContext().getSpace() + "] cannot be verified: Not present in server"); - } catch (BackendConnectionException e) { + } catch (BackendConnectionException | IOException e) { throw new GoalConfigurationException( "Workspace [" + this.getGoalContext().getSpace() diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java new file mode 100644 index 000000000..37d3f8ab5 --- /dev/null +++ b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java @@ -0,0 +1,52 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.shared.enums; + +/** + * The client running goal(s). + */ +public enum GoalClient { + CLI((byte) 10), + MAVEN_PLUGIN((byte) 20), + REST_SERVICE((byte) 30), + AGENT((byte) 40), + SETUPTOOLS((byte) 50), + GRADLE_PLUGIN((byte) 60); + + private byte value; + + private GoalClient(byte _value) { + this.value = _value; + } + + /** + *

    toString.

    + * + * @return a {@link java.lang.String} object. + */ + public String toString() { + if (this.value == 10) return "CLI"; + else if (this.value == 20) return "MAVEN"; + else if (this.value == 30) return "REST"; + else if (this.value == 40) return "AGENT"; + else if (this.value == 50) return "SETUPTOOLS"; + else if (this.value == 60) return "GRADLE"; + else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); + } +} \ No newline at end of file From e1706242380a26ef7c3dcf6e4591406f4baf37a9 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 14:31:50 +0200 Subject: [PATCH 41/83] Fixed kaybeeconf, removed an unused dependency --- .../kb-importer/conf/kaybeeconf.yaml.sample | 35 +++++++++++++++++++ kb-importer/pom.xml | 4 --- .../eclipse/steady/kb/ImporterController.java | 4 +-- .../java/org/eclipse/steady/kb/Manager.java | 31 +++++++++------- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/docker/kb-importer/conf/kaybeeconf.yaml.sample b/docker/kb-importer/conf/kaybeeconf.yaml.sample index 2e16ea255..7310ae5b6 100644 --- a/docker/kb-importer/conf/kaybeeconf.yaml.sample +++ b/docker/kb-importer/conf/kaybeeconf.yaml.sample @@ -21,3 +21,38 @@ policies: # - CVE-2005-3164 # - CVE-2005-4838 # - CVE-2007-0450 + +export: + # - target: csv + # filename: vulnerabilities.csv + # pre: + # each: | + # {{ if .Fixes }} {{ .VulnerabilityID}},{{ (index (index .Fixes 0).Commits 0).RepositoryURL }}{{end}} + # post: + - target: xml + filename: vulnerabilities.xml + pre: | + + + + each: | + + + {{range .Fixes }} + + {{range .Commits }} + {{end}} + + {{end}} + + {{range .Notes }} + + {{range $link := .Links }} + {{end}} + {{ if .Text }}{{ .Text }}{{ end }} + {{end}} + + + post: | + + \ No newline at end of file diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index f15725110..2e9d39b74 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -45,10 +45,6 @@ spring-boot-starter-test test
    - - org.springframework.boot - spring-boot-starter-data-jpa - commons-io diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 66d775104..0d65256d5 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -88,7 +88,7 @@ public ResponseEntity start( new Runnable() { public void run() { while (true) { - manager.start("/kb-importer/data/statements", args); + manager.start("/kb-importer/data/statements2", args); try { log.info( @@ -154,7 +154,7 @@ public ResponseEntity importSingleVuln( args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); args.put(ImportCommand.VERBOSE_OPTION, verbose); args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); - manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); + manager.importSingleVuln("/kb-importer/data/statements2/" + id, args, id); return new ResponseEntity(true, HttpStatus.OK); } } catch (Exception e) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index ee04cccad..2559f9eec 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -31,8 +31,8 @@ public class Manager { private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); - (ThreadPoolExecutor) Executors.newCachedThreadPool(); - //(ThreadPoolExecutor) Executors.newFixedThreadPool(8); + // (ThreadPoolExecutor) Executors.newCachedThreadPool(); + (ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); @@ -120,18 +120,25 @@ public synchronized void start( public void retryFailed( String statementsPath, HashMap mapCommandOptionValues) { - List failedVulns = new ArrayList(); - for (String vulnId : failures.keySet()) { - failedVulns.add(vulnId); - } - while (!failures.isEmpty()) { - startList(statementsPath, mapCommandOptionValues, failedVulns); + + List failuresToRetry = new ArrayList(); + while (true) { + for (String vulnId : failures.keySet()) { + if (failures.get(vulnId).contains("Got error [500]") || failures.get(vulnId).contains("HttpHostConnectionException")) { + failuresToRetry.add(vulnId); + } + } + if (failuresToRetry.isEmpty()) { + break; + } else { + log.info("Retrying " + Integer.toString(failuresToRetry.size()) + " failed vulnerabilities"); + startList(statementsPath, mapCommandOptionValues, failuresToRetry); + } } } public List identifyVulnerabilitiesToImport(String statementsPath) { File statementsDir = new File(statementsPath); - File[] subdirs = statementsDir.listFiles(); List vulnIds = new ArrayList(); final DirWithFileSearch search = new DirWithFileSearch("statement.yaml"); @@ -152,11 +159,11 @@ public synchronized void startList( if (this.executor.isShutdown() || this.executor.isTerminated()) { this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } - - BackendConnector backendConnector = BackendConnector.getInstance(); + + failures = new HashMap(); + for (String vulnId : vulnIds) { Path vulnDirPath = Paths.get(statementsPath, vulnId); - File vulnDir = vulnDirPath.toFile(); String vulnDirStr = vulnDirPath.toString(); log.info("Initializing process for directory " + vulnDirPath); From 9e4e4b57e8119593f6cab271716566f52b7e4e86 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 14:40:10 +0200 Subject: [PATCH 42/83] fixed code style --- java-files.txt | 591 ------------------ .../main/java/org/eclipse/steady/kb/Main.java | 1 - .../java/org/eclipse/steady/kb/Manager.java | 16 +- .../kb/task/ImportAffectedLibraries.java | 3 +- .../java/org/eclipse/steady/kb/MainTest.java | 1 - .../steady/backend/BackendConnector.java | 26 +- .../backend/requests/BasicHttpRequest.java | 236 +++---- .../steady/shared/enums/GoalClient.java | 2 +- 8 files changed, 143 insertions(+), 733 deletions(-) delete mode 100644 java-files.txt diff --git a/java-files.txt b/java-files.txt deleted file mode 100644 index c6e7baa7a..000000000 --- a/java-files.txt +++ /dev/null @@ -1,591 +0,0 @@ -shared/src/main/java/org/eclipse/steady/shared/connectivity/Service.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/PathBuilder.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/ServiceConnectionException.java -shared/src/main/java/org/eclipse/steady/shared/connectivity/package-info.java -shared/src/main/java/org/eclipse/steady/shared/package-info.java -shared/src/main/java/org/eclipse/steady/shared/cache/CacheException.java -shared/src/main/java/org/eclipse/steady/shared/cache/Cache.java -shared/src/main/java/org/eclipse/steady/shared/cache/ObjectFetcher.java -shared/src/main/java/org/eclipse/steady/shared/json/JacksonUtil.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonBuilder.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonReader.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonWriter.java -shared/src/main/java/org/eclipse/steady/shared/json/JsonSyntaxException.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Application.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Dependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionScope.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionSet.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Library.java -shared/src/main/java/org/eclipse/steady/shared/json/model/PathNode.java -shared/src/main/java/org/eclipse/steady/shared/json/model/LibraryId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Ratio.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/AbstractMetric.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Percentage.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Counter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/metrics/Metrics.java -shared/src/main/java/org/eclipse/steady/shared/json/model/FileChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/IExemption.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Bug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedLibrary.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionBug.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Artifact.java -shared/src/main/java/org/eclipse/steady/shared/json/model/package-info.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructId.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ExemptionUnassessed.java -shared/src/main/java/org/eclipse/steady/shared/json/model/AffectedConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Property.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Version.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Tenant.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenSearchResponse.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/MavenVersionsSearch.java -shared/src/main/java/org/eclipse/steady/shared/json/model/mavenCentral/ResponseDoc.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructIdFilter.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Space.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChangeInDependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/view/Views.java -shared/src/main/java/org/eclipse/steady/shared/json/model/KeyValue.java -shared/src/main/java/org/eclipse/steady/shared/json/model/Trace.java -shared/src/main/java/org/eclipse/steady/shared/json/model/VulnerableDependency.java -shared/src/main/java/org/eclipse/steady/shared/json/model/ConstructChange.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassModification.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/ClassDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/json/model/diff/JarDiffResult.java -shared/src/main/java/org/eclipse/steady/shared/enums/VulnDepOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/Scope.java -shared/src/main/java/org/eclipse/steady/shared/enums/AffectedVersionSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/GoalType.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructChangeType.java -shared/src/main/java/org/eclipse/steady/shared/enums/BugOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportFormat.java -shared/src/main/java/org/eclipse/steady/shared/enums/package-info.java -shared/src/main/java/org/eclipse/steady/shared/enums/CoverageStatus.java -shared/src/main/java/org/eclipse/steady/shared/enums/PropertySource.java -shared/src/main/java/org/eclipse/steady/shared/enums/DependencyOrigin.java -shared/src/main/java/org/eclipse/steady/shared/enums/ProgrammingLanguage.java -shared/src/main/java/org/eclipse/steady/shared/enums/ConstructType.java -shared/src/main/java/org/eclipse/steady/shared/enums/ExportConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/enums/PathSource.java -shared/src/main/java/org/eclipse/steady/shared/enums/DigestAlgorithm.java -shared/src/main/java/org/eclipse/steady/shared/enums/ContentMaturityLevel.java -shared/src/main/java/org/eclipse/steady/shared/util/Constants.java -shared/src/main/java/org/eclipse/steady/shared/util/ConstructIdUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/AbstractFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/FilenamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DigestUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/FileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/StopWatch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/package-info.java -shared/src/main/java/org/eclipse/steady/shared/util/StringUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/VulasConfiguration.java -shared/src/main/java/org/eclipse/steady/shared/util/DirnamePatternSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/DirWithFileSearch.java -shared/src/main/java/org/eclipse/steady/shared/util/ProgressTracker.java -shared/src/main/java/org/eclipse/steady/shared/util/StringList.java -shared/src/main/java/org/eclipse/steady/shared/util/CollectionUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/ThreadUtil.java -shared/src/main/java/org/eclipse/steady/shared/util/MemoryMonitor.java -shared/src/main/java/org/eclipse/steady/shared/util/DependencyUtil.java -lang/src/main/java/org/eclipse/steady/DirAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoop.java -lang/src/main/java/org/eclipse/steady/malice/ZipSlipAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalyzer.java -lang/src/main/java/org/eclipse/steady/malice/MaliciousnessAnalysisResult.java -lang/src/main/java/org/eclipse/steady/FileAnalyzerFactory.java -lang/src/main/java/org/eclipse/steady/sign/SignatureChange.java -lang/src/main/java/org/eclipse/steady/sign/SignatureAnalysis.java -lang/src/main/java/org/eclipse/steady/sign/Signature.java -lang/src/main/java/org/eclipse/steady/sign/SignatureComparator.java -lang/src/main/java/org/eclipse/steady/sign/SignatureFactory.java -lang/src/main/java/org/eclipse/steady/FileAnalyzer.java -lang/src/main/java/org/eclipse/steady/ConstructId.java -lang/src/main/java/org/eclipse/steady/tasks/package-info.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractBomTask.java -lang/src/main/java/org/eclipse/steady/tasks/ReachTask.java -lang/src/main/java/org/eclipse/steady/tasks/BomTask.java -lang/src/main/java/org/eclipse/steady/tasks/Task.java -lang/src/main/java/org/eclipse/steady/tasks/AbstractTask.java -lang/src/main/java/org/eclipse/steady/FileAnalysisException.java -lang/src/main/java/org/eclipse/steady/report/Report.java -lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java -lang/src/main/java/org/eclipse/steady/goals/SequenceGoal.java -lang/src/main/java/org/eclipse/steady/goals/UploadGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalFactory.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutionException.java -lang/src/main/java/org/eclipse/steady/goals/GoalExecutor.java -lang/src/main/java/org/eclipse/steady/goals/AbstractSpaceGoal.java -lang/src/main/java/org/eclipse/steady/goals/GoalConfigurationException.java -lang/src/main/java/org/eclipse/steady/goals/SpaceModGoal.java -lang/src/main/java/org/eclipse/steady/goals/ReportGoal.java -lang/src/main/java/org/eclipse/steady/goals/ReportException.java -lang/src/main/java/org/eclipse/steady/goals/CleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/CheckverGoal.java -lang/src/main/java/org/eclipse/steady/goals/package-info.java -lang/src/main/java/org/eclipse/steady/goals/AbstractGoal.java -lang/src/main/java/org/eclipse/steady/goals/ExecutionObserver.java -lang/src/main/java/org/eclipse/steady/goals/GoalContext.java -lang/src/main/java/org/eclipse/steady/goals/SpaceCleanGoal.java -lang/src/main/java/org/eclipse/steady/goals/BomGoal.java -lang/src/main/java/org/eclipse/steady/goals/TestGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceDelGoal.java -lang/src/main/java/org/eclipse/steady/goals/SpaceNewGoal.java -lang/src/main/java/org/eclipse/steady/Construct.java -lang/src/main/java/org/eclipse/steady/backend/EntityNotFoundInBackendException.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/AbstractHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java -lang/src/main/java/org/eclipse/steady/backend/requests/PutLibraryCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/ContentCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/package-info.java -lang/src/main/java/org/eclipse/steady/backend/requests/RequestRepeater.java -lang/src/main/java/org/eclipse/steady/backend/requests/ResponseCondition.java -lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java -lang/src/main/java/org/eclipse/steady/backend/requests/StatusCondition.java -lang/src/main/java/org/eclipse/steady/backend/HttpMethod.java -lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java -lang/src/main/java/org/eclipse/steady/backend/HttpResponse.java -lang/src/main/java/org/eclipse/steady/core/util/SignatureConfiguration.java -lang/src/main/java/org/eclipse/steady/core/util/package-info.java -lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java -lang/src/main/java/org/eclipse/steady/ConstructChange.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/IDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/decompiler/ProcyonDecompiler.java -lang-java/src/main/java/org/eclipse/steady/java/JavaFileAnalyzer2.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassInit.java -lang-java/src/main/java/org/eclipse/steady/java/JavaEnumId.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/IInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassPoolUpdater.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/Loader.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/PathNode.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/TraceCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/SingleStackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/StackTraceUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/AbstractTraceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/trace/ConstructUsage.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderHierarchy.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/DynamicTransformer.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/slice/SliceInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/UploadScheduler.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/AbstractInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ExecutionMonitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassVisitor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/ClassNameLoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/PrintlnInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentationControl.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/InstrumentorFactory.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/ConstructIdUtil.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointInstrumentor.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/touch/TouchPointCollector.java -lang-java/src/main/java/org/eclipse/steady/java/monitor/LoaderFilter.java -lang-java/src/main/java/org/eclipse/steady/java/JavaMethodId.java -lang-java/src/main/java/org/eclipse/steady/java/JavaClassId.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/JarAnalysisException.java -lang-java/src/main/java/org/eclipse/steady/java/JavaInterfaceId.java -lang-java/src/main/java/org/eclipse/steady/java/AarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignature.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeSerializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTConstructBodySignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/GsonHelper.java -lang-java/src/main/java/org/eclipse/steady/java/sign/gson/ASTSignatureChangeDeserializer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/JavaSignatureFactory.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureChange.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTSignatureComparator.java -lang-java/src/main/java/org/eclipse/steady/java/sign/CompilationUtils.java -lang-java/src/main/java/org/eclipse/steady/java/sign/UniqueNameNormalizer.java -lang-java/src/main/java/org/eclipse/steady/java/sign/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/sign/DistillerUtil.java -lang-java/src/main/java/org/eclipse/steady/java/sign/ASTConstructBodySignature.java -lang-java/src/main/java/org/eclipse/steady/java/JavaId.java -lang-java/src/main/java/org/eclipse/steady/java/ClassFileAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/SpringBootAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/JavaBomTask.java -lang-java/src/main/java/org/eclipse/steady/java/tasks/package-info.java -lang-java/src/main/java/org/eclipse/steady/java/goals/CheckBytecodeGoal.java -lang-java/src/main/java/org/eclipse/steady/java/goals/InstrGoal.java -lang-java/src/main/java/org/eclipse/steady/java/JavaConstructorId.java -lang-java/src/main/java/org/eclipse/steady/java/WarAnalyzer.java -lang-java/src/main/java/org/eclipse/steady/java/ArchiveAnalysisManager.java -lang-java/src/main/java/org/eclipse/steady/java/PomParser.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/BytecodeComparator.java -lang-java/src/main/java/org/eclipse/steady/java/bytecode/ConstructBytecodeASTManager.java -lang-java/src/main/java/org/eclipse/steady/java/JavaPackageId.java -lang-java/src/main/java/org/eclipse/steady/java/JarWriter.java -lang-java/src/main/java/org/eclipse/steady/java/JarEntryWriter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/A2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityConfiguration.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/DepthFirstGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PrunedGraphGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/Callgraph.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/MethodNameFilter.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/ReachabilityAnalyzer.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/NodeMetaInformation.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractGetPaths.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphReachableSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/T2CGoal.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphConstructException.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/PathSimilarity.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/CallgraphPathSearch.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/ICallgraphConstructor.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/spi/CallgraphConstructorFactory.java -lang-java-reach/src/main/java/org/eclipse/steady/cg/AbstractReachGoal.java -lang-java-reach-wala/src/main/java/org/eclipse/steady/cg/wala/WalaCallgraphConstructor.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootConfiguration.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/SootCallgraphConstructor.java -lang-java-reach-soot/src/main/java/org/eclipse/steady/cg/soot/CustomEntryPointCreator.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PyWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipInstalledPackage.java -lang-python/src/main/java/org/eclipse/steady/python/pip/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/pip/PipWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/virtualenv/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/Python3FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/PythonFileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/utils/PythonConfiguration.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestDeserializer.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigestSerializer.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonSignatureFactory.java -lang-python/src/main/java/org/eclipse/steady/python/sign/PythonConstructDigest.java -lang-python/src/main/java/org/eclipse/steady/python/PythonArchiveAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapperException.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/PythonBomTask.java -lang-python/src/main/java/org/eclipse/steady/python/tasks/package-info.java -lang-python/src/main/java/org/eclipse/steady/python/Python335FileAnalyzer.java -lang-python/src/main/java/org/eclipse/steady/python/ProcessWrapper.java -lang-python/src/main/java/org/eclipse/steady/python/PythonId.java -repo-client/src/main/java/org/eclipse/steady/svn/SvnClient.java -repo-client/src/main/java/org/eclipse/steady/package-info.java -repo-client/src/main/java/org/eclipse/steady/vcs/NoRepoClientException.java -repo-client/src/main/java/org/eclipse/steady/vcs/FileChange.java -repo-client/src/main/java/org/eclipse/steady/vcs/RepoMismatchException.java -repo-client/src/main/java/org/eclipse/steady/vcs/IVCSClient.java -repo-client/src/main/java/org/eclipse/steady/git/GitClient.java -repo-client/src/main/java/org/eclipse/steady/git/MyProxySelector.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/FileComparator.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/VulasProxySelector.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchaConfiguration.java -patch-analyzer/src/main/java/org/eclipse/steady/patcha/PatchAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathAssessment2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OrderedCCperConstructPath2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ConstructPathLibResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/Intersection2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactLibrary.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ReleaseTree.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/ArtifactResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/LidResult2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/representation/OverallConstructChange.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/Main.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/ByteCodeComparator.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibManager.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/PEConfiguration.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/utils/CSVHelper2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/LibraryAnalyzerThread2.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BytecodeAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/BugLibAnalyzer.java -patch-lib-analyzer/src/main/java/org/eclipse/steady/patcheval/PE_Run.java -kb-importer/src/main/java/org/eclipse/steady/kb/Main.java -kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/FileComparator.java -kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java -kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Note.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Commit.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Artifact.java -kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java -kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java -cli-scanner/src/main/java/org/eclipse/steady/cli/VulasCli.java -cli-scanner/src/main/java/org/eclipse/steady/cli/package-info.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginT2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginCheckBytecode.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginSpaceClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginUpload.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasSpaceMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginReport.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/AbstractVulasMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginClean.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginBom.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/VulasAgentMojo.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginA2C.java -plugin-maven/src/main/java/org/eclipse/steady/java/mvn/MvnPluginInstr.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffVisitor.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmd.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/dependencyfinder/ClassDiffVisitor.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConfigurationController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/MainController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ConstructController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ArtifactController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/rest/ClassController.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/package-info.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ArtifactDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/NexusWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryDispatcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/MavenCentralWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/CacheFilter.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepositoryWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/ClassDownloader.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/FileAnalyzerFetcher.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/RepoException.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/HeaderEcho.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/util/PypiWrapper.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusLibId.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusNGData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusResolvedArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactResolution.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearchNGResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusData.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusDescribeInfo.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifactInfoResourceResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusArtifact.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/nexus/NexusSearch.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiResponse.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiRelease.java -rest-lib-utils/src/main/java/org/eclipse/steady/cia/model/pypi/PypiInfo.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporterThread.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/StatisticsContributor.java -rest-backend/src/main/java/org/eclipse/steady/backend/component/ApplicationExporter.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/V_AppVulndepRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TracesRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ApplicationRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PathRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/DependencyRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/TenantRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/PropertyRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructChangeRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/SpaceRepositoryCustom.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/ConstructIdRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/BugRepository.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/LibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/AffectedLibraryRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/repo/GoalExecutionRepositoryImpl.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/HubIntegrationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryIdController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ConfigurationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/SpaceController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/ApplicationController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/MainController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/TenantController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/BugController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CveController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/CoverageController.java -rest-backend/src/main/java/org/eclipse/steady/backend/rest/LibraryController.java -rest-backend/src/main/java/org/eclipse/steady/backend/package-info.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/TokenUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/PyPiVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifierEnumerator.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/CacheFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ConnectionUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ResultSetFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/SmtpClient.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ArtifactMaps.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/Message.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DigestVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/MavenCentralVerifier.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ReferenceUpdater.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/VerificationException.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/ServiceWrapper.java -rest-backend/src/main/java/org/eclipse/steady/backend/util/DependencyUtil.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/CveReader2.java -rest-backend/src/main/java/org/eclipse/steady/backend/cve/Cve.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Application.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Dependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Path.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Library.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PathNode.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/LibraryId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeType.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/TouchPoint.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Bug.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/GoalExecution.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedLibrary.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructId.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/PackageStatistics.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/AffectedConstructChange.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Property.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyIntersection.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Tenant.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructIdFilter.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Space.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChangeInDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/DependencyUpdate.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/V_AppVulndep.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructSearchResult.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/view/Views.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/Trace.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/VulnerableDependency.java -rest-backend/src/main/java/org/eclipse/steady/backend/model/ConstructChange.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPluginCommon.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/AbstractVulasTask.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradleProjectUtilities.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginApp.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginClean.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginA2C.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/VulasPlugin.java -plugin-gradle/src/main/java/org/eclipse/steady/java/gradle/GradlePluginReport.java -shared/src/test/java/org/eclipse/steady/shared/categories/RequiresNetwork.java -shared/src/test/java/org/eclipse/steady/shared/categories/Slow.java -shared/src/test/java/org/eclipse/steady/shared/categories/Integrated.java -shared/src/test/java/org/eclipse/steady/shared/cache/CacheTest.java -shared/src/test/java/org/eclipse/steady/shared/json/JacksonUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/json/JsonBuilderTest.java -shared/src/test/java/org/eclipse/steady/shared/json/VulnerableDependencyJsonTest.java -shared/src/test/java/org/eclipse/steady/shared/json/model/metrics/MetricsTest.java -shared/src/test/java/org/eclipse/steady/shared/enums/ScopeTest.java -shared/src/test/java/org/eclipse/steady/shared/util/TestDirWithFileSearch.java -shared/src/test/java/org/eclipse/steady/shared/util/StopWatchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/StringListTest.java -shared/src/test/java/org/eclipse/steady/shared/util/VulasConfigurationTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileSearchTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DirUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/util/DigestUtilTest.java -shared/src/test/java/org/eclipse/steady/shared/model/IExemptionTest.java -shared/src/test/java/org/eclipse/steady/shared/model/generic/VersionTest.java -shared/src/test/java/org/eclipse/steady/shared/model/ApplicationTest.java -lang/src/test/java/org/eclipse/steady/malice/MaliciousnessAnalyzerLoopTest.java -lang/src/test/java/org/eclipse/steady/malice/ZipSlipAnalyzerTest.java -lang/src/test/java/org/eclipse/steady/report/ReportTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceNewGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/SpaceDelGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/BomGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/CleanGoalTest.java -lang/src/test/java/org/eclipse/steady/goals/AbstractGoalTest.java -lang-java/src/test/java/NestedDeclarationMess.java -lang-java/src/test/java/org/eclipse/steady/java/decompiler/IDecompilerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaFileAnalyzer2Test.java -lang-java/src/test/java/org/eclipse/steady/java/JarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/JarWriterTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ConstructTransformerTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/AbstractGoalTest.java -lang-java/src/test/java/org/eclipse/steady/java/monitor/ClassVisitorTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassPoolUpdaterTest.java -lang-java/src/test/java/org/eclipse/steady/java/AarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/SpringBootAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/ClassFileAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/UniqueNamePreprocessorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/ASTSignatureComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/gson/ASTDeserializeSignComparatorTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/SignatureFactoryTest.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarity.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityLevenshtein.java -lang-java/src/test/java/org/eclipse/steady/java/sign/StringSimilarityNGrams.java -lang-java/src/test/java/org/eclipse/steady/java/WarAnalyzerTest.java -lang-java/src/test/java/org/eclipse/steady/java/PomParserTest.java -lang-java/src/test/java/org/eclipse/steady/java/JavaIdTest.java -lang-java/src/test/java/org/eclipse/steady/java/JsonHelperTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigurationKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestClass$NoNestedClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/EnumTest.java -lang-java/src/test/java/org/eclipse/steady/java/test/Generics.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarationMess2.java -lang-java/src/test/java/org/eclipse/steady/java/test/OuterClass.java -lang-java/src/test/java/org/eclipse/steady/java/test/HttpRequestCompletionLog.java -lang-java/src/test/java/org/eclipse/steady/java/test/NestedDeclarations.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestInterface.java -lang-java/src/test/java/org/eclipse/steady/java/test/ConfigKey.java -lang-java/src/test/java/org/eclipse/steady/java/test/Vanilla.java -lang-java/src/test/java/org/eclipse/steady/java/test/TestAgainAnon.java -lang-java/src/test/java/org/eclipse/steady/java/test/HelloWorldAnonymousClasses.java -lang-java/src/test/java/org/eclipse/steady/java/test/DrinkEnumExample.java -lang-java/src/test/java/org/eclipse/steady/java/ArchiveAnalysisManagerTest.java -lang-java/src/test/java/ClassWithoutPackage.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/Examples.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/CallgraphConstructorFactoryTest.java -lang-java-reach/src/test/java/org/eclipse/steady/cg/DummyCallgraphConstructor.java -lang-java-reach-wala/src/test/java/org/eclipse/steady/cg/wala/WalaCallGraphTest.java -lang-java-reach-soot/src/test/java/SootCallGraphTest.java -lang-python/src/test/java/org/eclipse/steady/python/ProcessWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonArchiveAnalyzerTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PyWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/pip/PipInstalledPackageTest.java -lang-python/src/test/java/org/eclipse/steady/python/virtualenv/VirtualenvWrapperTest.java -lang-python/src/test/java/org/eclipse/steady/python/PythonFileAnalyzerTest.java -repo-client/src/test/java/org/eclipse/steady/git/GitTest.java -patch-analyzer/src/test/java/org/eclipse/steady/patcha/IT01_PatchAnalyzerIT.java -patch-analyzer/src/test/java/org/eclipse/steady/patcha/FileComparatorTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/VersionTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/CiaTest.java -patch-lib-analyzer/src/test/java/org/eclipse/steady/patcheval/package-info.java -kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/TestPythonConstructs.java -kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java -kb-importer/src/test/java/org/eclipse/steady/kb/ZipUtil.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java -kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java -cli-scanner/src/test/java/org/eclipse/steady/cli/VulasCliTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/AbstractGoalTest.java -cli-scanner/src/test/java/org/eclipse/steady/cli/FileAnalyzerTest.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/AbstractVulasMojoTest.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/TestProjectStub.java -plugin-maven/src/test/java/org/eclipse/steady/java/mvn/VulasAgentOptionsTests.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/dependencyfinder/JarDiffCmdTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT04_ConstructControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT01_ArtifactControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT03_ClassControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/rest/IT02_SpringControllerTest.java -rest-lib-utils/src/test/java/org/eclipse/steady/cia/model/maven/ArtifactTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/component/ApplicationExporterTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/TenantControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/ApplicationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/BugControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/LibraryControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/HubIntegrationControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/IT02_CoverageControllerIT.java -rest-backend/src/test/java/org/eclipse/steady/backend/rest/SpaceControllerTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/PyPiVerifierTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ConnectionUtilTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/package-info.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/SmtpClientTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/util/ArtifactMapsTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveTest.java -rest-backend/src/test/java/org/eclipse/steady/backend/cve/CveReader2Test.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/VulasBaseTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/GradleTestProject.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/AndroidLibsTest.java -plugin-gradle/src/test/java/org/eclipse/steady/java/gradle/JavaLibTest.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index 074b07f4d..3c38f4938 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -18,7 +18,6 @@ */ package org.eclipse.steady.kb; - import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 2559f9eec..7ae82943d 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -97,7 +97,7 @@ public boolean getIsRunningStart() { public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { this.isRunningStart = true; - + newVulnerabilities = new LinkedHashSet(); try { @@ -117,21 +117,21 @@ public synchronized void start( this.isRunningStart = false; } - public void retryFailed( - String statementsPath, HashMap mapCommandOptionValues) { - + public void retryFailed(String statementsPath, HashMap mapCommandOptionValues) { List failuresToRetry = new ArrayList(); while (true) { for (String vulnId : failures.keySet()) { - if (failures.get(vulnId).contains("Got error [500]") || failures.get(vulnId).contains("HttpHostConnectionException")) { + if (failures.get(vulnId).contains("Got error [500]") + || failures.get(vulnId).contains("HttpHostConnectionException")) { failuresToRetry.add(vulnId); } } if (failuresToRetry.isEmpty()) { break; } else { - log.info("Retrying " + Integer.toString(failuresToRetry.size()) + " failed vulnerabilities"); + log.info( + "Retrying " + Integer.toString(failuresToRetry.size()) + " failed vulnerabilities"); startList(statementsPath, mapCommandOptionValues, failuresToRetry); } } @@ -161,7 +161,7 @@ public synchronized void startList( } failures = new HashMap(); - + for (String vulnId : vulnIds) { Path vulnDirPath = Paths.get(statementsPath, vulnId); String vulnDirStr = vulnDirPath.toString(); @@ -217,8 +217,6 @@ public void kaybeePull() throws IOException, InterruptedException { } } - - public void stop() { try { executor.shutdownNow(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java index 4de413556..1ff42ee86 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportAffectedLibraries.java @@ -52,7 +52,8 @@ public class ImportAffectedLibraries implements Task { /** {@inheritDoc} */ public void execute( Vulnerability vuln, HashMap args, BackendConnector backendConnector) - throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException, IOException { + throws MalformedPackageURLException, BackendConnectionException, JsonProcessingException, + IOException { log.info("Initiating ImportAffectedLibraries for vulnerability " + vuln.getVulnId()); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java index 28b283547..c0d7078df 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java @@ -18,7 +18,6 @@ */ package org.eclipse.steady.kb; - public class MainTest { private static final String SPACE = " "; diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 3164c4ea7..8a3a62d56 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -523,7 +523,8 @@ public Map> getAppBugs(GoalContext _ctx, Application _a * @return a {@link java.util.Map} object. */ public Map> getAppBugs( - GoalContext _ctx, Application _app, String _filter) throws BackendConnectionException, IOException { + GoalContext _ctx, Application _app, String _filter) + throws BackendConnectionException, IOException { // Return all change lists if (_filter == null || _filter.equals("")) { return this.getAppBugs(_ctx, _app); @@ -746,7 +747,7 @@ public String getLibrary(String _sha1) throws EntityNotFoundInBackendException { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); else return response.getBody(); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException | IOException e) { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); } @@ -840,7 +841,8 @@ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) * @param _file a {@link java.nio.file.Path} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadLibraryFile(String _sha1, Path _file) throws BackendConnectionException, IOException { + public void uploadLibraryFile(String _sha1, Path _file) + throws BackendConnectionException, IOException { try (final FileInputStream inputStream = new FileInputStream(_file.toFile())) { final HttpRequestList req_list = new HttpRequestList(); final BasicHttpRequest cond_req = @@ -1019,7 +1021,8 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException, IOE * @param _json a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadChangeList(String _bug, String _json) throws BackendConnectionException, IOException { + public void uploadChangeList(String _bug, String _json) + throws BackendConnectionException, IOException { // The request depending on whose result either POST or PUT will be called final BasicHttpRequest cond_req = @@ -1283,7 +1286,7 @@ public String getClassLibraryIds(String _className) { } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1315,7 +1318,7 @@ public synchronized String getAstForQnameInLib( } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1337,7 +1340,7 @@ public synchronized String getSourcesForQnameInLib(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1389,7 +1392,7 @@ public String getJarConstructs(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException | IOException ex) { log.info(ex); } return json; @@ -1416,7 +1419,7 @@ public synchronized String getAstDiff(GoalContext _g, String _json) { json = response.getBody(); // ast = (String)JacksonUtil.asObject(json, String.class); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException | IOException ex) { log.error(ex); } return json; @@ -1448,7 +1451,7 @@ public Library[] getBugLibraries(String _bugId) throws BackendConnectionExceptio * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) - throws BackendConnectionException, IOException , IOException{ + throws BackendConnectionException, IOException, IOException { String json = null; Artifact[] result = null; @@ -1472,7 +1475,8 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) * @return a {@link org.eclipse.steady.shared.json.model.Artifact} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public Artifact getArtifact(String _g, String _a, String _v) throws BackendConnectionException, IOException { + public Artifact getArtifact(String _g, String _a, String _v) + throws BackendConnectionException, IOException { String json = null; Artifact result = null; diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index 6058e8c12..b1f067760 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -415,133 +415,133 @@ private final HttpResponse sendRequest() throws BackendConnectionException, IOEx requestBuilder.setConfig(config); httpUriRequest = requestBuilder.build(); - //try { - do { - is_503 = false; - - final long start_nano = System.nanoTime(); - - if (!this.hasPayload()) { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); - } else if (this.binPayload == null) { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + ", size=" - + StringUtil.byteToKBString(this.payload.getBytes(StandardCharsets.UTF_8).length) - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); + // try { + do { + is_503 = false; + + final long start_nano = System.nanoTime(); + + if (!this.hasPayload()) { + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); + } else if (this.binPayload == null) { + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + ", size=" + + StringUtil.byteToKBString(this.payload.getBytes(StandardCharsets.UTF_8).length) + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); + } else { + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + ", size=" + + this.binPayload.available() + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); + } + + SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).build(); + HttpClient client = + HttpClients.custom().setDefaultSocketConfig(socketConfig).useSystemProperties().build(); + + // Read response + httpResponse = client.execute(httpUriRequest); + response_code = httpResponse.getStatusLine().getStatusCode(); + response = new HttpResponse(response_code); + // If the response body contains a JAR file, save it + if (response.isOk() + && httpResponse.getFirstHeader("Content-Type") != null + && httpResponse + .getFirstHeader("Content-Type") + .getValue() + .contains("application/java-archive")) { + String fileName = ""; + Header disposition = httpResponse.getFirstHeader("Content-Disposition"); + if (disposition != null) { + String dispositionValue = disposition.getValue(); + // Extracts file name from header field + int index = dispositionValue.indexOf("filename="); + if (index > 0) { + fileName = dispositionValue.substring(index + 9, dispositionValue.length()); + } } else { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + ", size=" - + this.binPayload.available() - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); + // Extracts file name from URL + fileName = this.path.substring(this.path.lastIndexOf("/") + 1, this.path.length()); } - SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).build(); - HttpClient client = - HttpClients.custom().setDefaultSocketConfig(socketConfig).useSystemProperties().build(); - - // Read response - httpResponse = client.execute(httpUriRequest); - response_code = httpResponse.getStatusLine().getStatusCode(); - response = new HttpResponse(response_code); - // If the response body contains a JAR file, save it - if (response.isOk() - && httpResponse.getFirstHeader("Content-Type") != null - && httpResponse - .getFirstHeader("Content-Type") - .getValue() - .contains("application/java-archive")) { - String fileName = ""; - Header disposition = httpResponse.getFirstHeader("Content-Disposition"); - if (disposition != null) { - String dispositionValue = disposition.getValue(); - // Extracts file name from header field - int index = dispositionValue.indexOf("filename="); - if (index > 0) { - fileName = dispositionValue.substring(index + 9, dispositionValue.length()); - } - } else { - // Extracts file name from URL - fileName = this.path.substring(this.path.lastIndexOf("/") + 1, this.path.length()); + String saveFilePath = null; + if (this.dir != null) { + // create directories if not existing + if (!Files.exists(Paths.get(dir))) { + Files.createDirectories(Paths.get(dir)); } + saveFilePath = dir + File.separator + fileName; + } else { + saveFilePath = + Paths.get(this.getVulasConfiguration().getTmpDir().toString()).toString() + + File.separator + + fileName; + } - String saveFilePath = null; - if (this.dir != null) { - // create directories if not existing - if (!Files.exists(Paths.get(dir))) { - Files.createDirectories(Paths.get(dir)); - } - saveFilePath = dir + File.separator + fileName; - } else { - saveFilePath = - Paths.get(this.getVulasConfiguration().getTmpDir().toString()).toString() - + File.separator - + fileName; + try ( + // Opens input stream from the HTTP connection + InputStream inputStream = httpResponse.getEntity().getContent(); + // Opens an output stream to save into file + FileOutputStream outputStream = new FileOutputStream(saveFilePath); ) { + int bytesRead = -1; + byte[] buffer = new byte[inputStream.available()]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); } - try ( - // Opens input stream from the HTTP connection - InputStream inputStream = httpResponse.getEntity().getContent(); - // Opens an output stream to save into file - FileOutputStream outputStream = new FileOutputStream(saveFilePath); ) { - int bytesRead = -1; - byte[] buffer = new byte[inputStream.available()]; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - - response.setBody(saveFilePath); - } - } else if (response.isOk() || response.isCreated()) { - final String body = this.readResponse(httpResponse); - if (StringUtils.isNotBlank(body)) response.setBody(body); + response.setBody(saveFilePath); } + } else if (response.isOk() || response.isCreated()) { + final String body = this.readResponse(httpResponse); + if (StringUtils.isNotBlank(body)) response.setBody(body); + } - // Stats - final long end_nano = System.nanoTime(); - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " completed with response code [" - + response_code - + "] in " - + StringUtil.nanoToFlexDurationString(end_nano - start_nano) - + " (proxy=" - + isProxySet() - + ")"); - - // 503: Retry - if (response.isServiceUnavailable()) { - is_503 = true; - } - // 5xx: Throw exception - else if (response.isServerError() - || response.getStatus() == 400 - || response.getStatus() == 403) { - final BackendConnectionException bce = - new BackendConnectionException(this.method, uri, response_code, null); - throwBceException(httpResponse, bce); - } - } while (repeater.repeat(is_503)); - if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); + // Stats + final long end_nano = System.nanoTime(); + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " completed with response code [" + + response_code + + "] in " + + StringUtil.nanoToFlexDurationString(end_nano - start_nano) + + " (proxy=" + + isProxySet() + + ")"); + + // 503: Retry + if (response.isServiceUnavailable()) { + is_503 = true; + } + // 5xx: Throw exception + else if (response.isServerError() + || response.getStatus() == 400 + || response.getStatus() == 403) { + final BackendConnectionException bce = + new BackendConnectionException(this.method, uri, response_code, null); + throwBceException(httpResponse, bce); + } + } while (repeater.repeat(is_503)); + if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); /*} catch (BackendConnectionException bce) { this.logHeaderFields(" Request-header", httpUriRequest.getAllHeaders()); this.logHeaderFields(" Response-header", httpResponse.getAllHeaders()); diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java index 37d3f8ab5..6e015c7b2 100644 --- a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +++ b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java @@ -49,4 +49,4 @@ public String toString() { else if (this.value == 60) return "GRADLE"; else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); } -} \ No newline at end of file +} From bf286d15e6bbcd502625118815ebe3746b6cd950 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 14:43:22 +0200 Subject: [PATCH 43/83] Removed GoalClient again --- .../steady/shared/enums/GoalClient.java | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java deleted file mode 100644 index 6e015c7b2..000000000 --- a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.shared.enums; - -/** - * The client running goal(s). - */ -public enum GoalClient { - CLI((byte) 10), - MAVEN_PLUGIN((byte) 20), - REST_SERVICE((byte) 30), - AGENT((byte) 40), - SETUPTOOLS((byte) 50), - GRADLE_PLUGIN((byte) 60); - - private byte value; - - private GoalClient(byte _value) { - this.value = _value; - } - - /** - *

    toString.

    - * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (this.value == 10) return "CLI"; - else if (this.value == 20) return "MAVEN"; - else if (this.value == 30) return "REST"; - else if (this.value == 40) return "AGENT"; - else if (this.value == 50) return "SETUPTOOLS"; - else if (this.value == 60) return "GRADLE"; - else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); - } -} From 1b56295d77e36a7d073fba0ddc4df767a2ec3442 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 14:52:19 +0200 Subject: [PATCH 44/83] Renamed a method and a variable in Manager --- .../org/eclipse/steady/kb/ImporterController.java | 6 +++--- .../main/java/org/eclipse/steady/kb/Manager.java | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 0d65256d5..0b1b5aefb 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -65,7 +65,7 @@ public ResponseEntity start( @RequestParam(defaultValue = "0") String refetchAllMs) { boolean started = false; try { - if (this.manager.getIsRunningStart()) { + if (this.manager.isRunningStart()) { log.info("Importer already running"); } else { if (this.importerCacheFetch != null && this.importerCacheFetch.isAlive()) { @@ -120,7 +120,7 @@ public void run() { public ResponseEntity stop() { boolean stopped = false; try { - if (this.manager.getIsRunningStart() + if (this.manager.isRunningStart() || (this.importerCacheFetch != null && this.importerCacheFetch.isAlive())) { stopped = true; this.manager.stop(); @@ -145,7 +145,7 @@ public ResponseEntity importSingleVuln( @RequestParam(defaultValue = "true") boolean skipClone) { try { - if (this.manager.getIsRunningStart()) { + if (this.manager.isRunningStart()) { log.info("Importer already running"); return new ResponseEntity(false, HttpStatus.SERVICE_UNAVAILABLE); } else { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 7ae82943d..51b93a2bc 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -42,7 +42,7 @@ public class Manager { Map repoLocks = new HashMap(); - private boolean isRunningStart; + private boolean startIsRunning; public enum VulnStatus { NOT_STARTED, @@ -90,13 +90,13 @@ public void unlockRepo(String repo) { repoLocks.get(repo).unlock(); } - public boolean getIsRunningStart() { - return this.isRunningStart; + public boolean isRunningStart() { + return this.startIsRunning; } public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { - this.isRunningStart = true; + this.startIsRunning = true; newVulnerabilities = new LinkedHashSet(); @@ -107,14 +107,14 @@ public synchronized void start( kaybeePull(); } catch (IOException | InterruptedException e) { log.error("Exception while performing update: " + e.getMessage()); - this.isRunningStart = false; + this.startIsRunning = false; return; } setUploadConfiguration(mapCommandOptionValues); List vulnIds = this.identifyVulnerabilitiesToImport(statementsPath); startList(statementsPath, mapCommandOptionValues, vulnIds); retryFailed(statementsPath, mapCommandOptionValues); - this.isRunningStart = false; + this.startIsRunning = false; } public void retryFailed(String statementsPath, HashMap mapCommandOptionValues) { @@ -221,7 +221,7 @@ public void stop() { try { executor.shutdownNow(); executor.awaitTermination(24, TimeUnit.HOURS); - this.isRunningStart = false; + this.startIsRunning = false; } catch (InterruptedException e) { log.error("Process interrupted"); log.error(e.getMessage()); From 9e929d5bea3bf8f75c57d11733699e0a9cd07bad Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 14:58:06 +0200 Subject: [PATCH 45/83] Removed a Jenkinsfile --- kb-importer/Jenkinsfile | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 kb-importer/Jenkinsfile diff --git a/kb-importer/Jenkinsfile b/kb-importer/Jenkinsfile deleted file mode 100644 index 66dd4240c..000000000 --- a/kb-importer/Jenkinsfile +++ /dev/null @@ -1,3 +0,0 @@ -@Library('piper-lib-os') _ - -piperPipeline script: this From a9494080681f688459c99e733d6c03cf63aad2b8 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 17:06:32 +0200 Subject: [PATCH 46/83] catch IOException --- .../org/eclipse/steady/kb/ImportCommand.java | 2 +- .../steady/kb/task/ImportVulnerability.java | 2 +- .../steady/backend/BackendConnector.java | 106 +++++++++--------- .../backend/requests/BasicHttpRequest.java | 12 +- .../requests/ConditionalHttpRequest.java | 2 +- .../steady/backend/requests/HttpRequest.java | 2 +- .../backend/requests/HttpRequestList.java | 2 +- .../steady/core/util/CoreConfiguration.java | 4 +- .../eclipse/steady/goals/AbstractAppGoal.java | 4 +- .../org/eclipse/steady/goals/GoalClient.java | 52 +++++++++ 10 files changed, 118 insertions(+), 70 deletions(-) create mode 100644 lang/src/main/java/org/eclipse/steady/goals/GoalClient.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 7308ff30c..d93c4d72d 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -67,7 +67,7 @@ public void run() { boolean bugExists = false; try { bugExists = this.backendConnector.isBugExisting(vulnId); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException e) { log.error("Can't connect to the Backend"); manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_CONNECTION); manager.addFailure(vulnId, e.toString()); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index c45660df5..9f27def79 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -214,7 +214,7 @@ private String getCVEDescription(Vulnerability _vulnerability) { String vulnId = _vulnerability.getVulnId(); try { cveString = getBackendConnector().getCVE(vulnId); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException e) { log.error("Error connecting to NVD service. {}", e.getCause(), e); return null; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 8a3a62d56..1aa6ede54 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -157,7 +157,7 @@ public void cleanCache() { * @return a boolean. */ public boolean isSpaceExisting(GoalContext _goal_context, Space _space) - throws BackendConnectionException, IOException { + throws BackendConnectionException { Boolean exists = false; if (!cacheSpaceExistanceCheck.containsKey(_space)) { @@ -187,7 +187,7 @@ public boolean isSpaceExisting(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Space createSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.POST, PathBuilder.spaces(), null); r.setGoalContext(_goal_context); r.setPayload(JacksonUtil.asJsonString(_space), null, true); @@ -214,7 +214,7 @@ public Space createSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void modifySpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.PUT, PathBuilder.space(_space), null); r.setGoalContext(_goal_context); @@ -230,7 +230,7 @@ public void modifySpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void cleanSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final Map params = new HashMap(); params.put("clean", "true"); final BasicHttpRequest r = @@ -247,7 +247,7 @@ public void cleanSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void deleteSpace(GoalContext _goal_context, Space _space) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final BasicHttpRequest r = new BasicHttpRequest(HttpMethod.DELETE, PathBuilder.space(_space), null); r.setGoalContext(_goal_context); @@ -265,7 +265,7 @@ public void deleteSpace(GoalContext _goal_context, Space _space) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public boolean isAppExisting(GoalContext _goal_context, Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { Boolean exists = false; if (!cacheAppExistanceCheck.containsKey(_app)) { final BasicHttpRequest r = @@ -287,7 +287,7 @@ public boolean isAppExisting(GoalContext _goal_context, Application _app) * @throws org.eclipse.steady.backend.BackendConnectionException */ public void cleanApp(GoalContext _goal_context, Application _app, boolean _clean_history) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (this.isAppExisting(_goal_context, _app)) { final Map params = new HashMap(); params.put("clean", "true"); @@ -308,7 +308,7 @@ public void cleanApp(GoalContext _goal_context, Application _app, boolean _clean * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void purgeAppVersions(GoalContext _goal_context, Application _app, int _keep) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final Map params = new HashMap(); params.put("keep", Integer.toString(_keep)); params.put("mode", "VERSIONS"); // Mode DAYS is not yet support on client-side @@ -326,7 +326,7 @@ public void purgeAppVersions(GoalContext _goal_context, Application _app, int _k * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadApp(GoalContext _goal_context, Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final String json = JacksonUtil.asJsonString(_app, null, Views.Default.class); // The request depending on whose result either POST or PUT will be called @@ -367,7 +367,7 @@ public void uploadApp(GoalContext _goal_context, Application _app) */ public boolean uploadReachableConstructs( GoalContext _goal_context, Application _app, String _lib_digest, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (this.isAppExisting(_goal_context, _app)) { final BasicHttpRequest req = new BasicHttpRequest( @@ -393,7 +393,7 @@ public boolean uploadReachableConstructs( */ public boolean uploadTouchPoints( GoalContext _goal_context, Application _app, String _lib_digest, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (this.isAppExisting(_goal_context, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -418,7 +418,7 @@ public boolean uploadTouchPoints( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppConstructIds(GoalContext _ctx, Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (!cacheAppConstructs.containsKey(_app)) { final boolean app_exists = this.isAppExisting(_ctx, _app); final Set constructs = new HashSet(); @@ -458,7 +458,7 @@ public Set getAppConstructIds(GoalContext _ctx, Application _app) * @return a {@link java.util.Map} object. */ public Map> getAppBugs(GoalContext _ctx, Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { // Make request and put in cache if (!this.cacheBugChangeLists.containsKey(_app)) { @@ -524,7 +524,7 @@ public Map> getAppBugs(GoalContext _ctx, Application _a */ public Map> getAppBugs( GoalContext _ctx, Application _app, String _filter) - throws BackendConnectionException, IOException { + throws BackendConnectionException { // Return all change lists if (_filter == null || _filter.equals("")) { return this.getAppBugs(_ctx, _app); @@ -549,19 +549,19 @@ public Map> getAppBugs( } } - /*public VulnerableDependency[] getVulnerableAppArchiveConstructs(Application _app) throws BackendConnectionException, IOException { + /*public VulnerableDependency[] getVulnerableAppArchiveConstructs(Application _app) throws BackendConnectionException { final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET, PathBuilder.vulnArchiveConstructs(_app), null); final VulnerableDependency[] vulndeps = (VulnerableDependency[])JacksonUtil.asObject(req.send().getBody(), VulnerableDependency[].class); return vulndeps; }*/ - /*public VulnerableDependency[] getVulnerableDependencies(Application _app) throws BackendConnectionException, IOException { + /*public VulnerableDependency[] getVulnerableDependencies(Application _app) throws BackendConnectionException { final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET, PathBuilder.vulnArchiveConstructs(_app), null); final VulnerableDependency[] vulndeps = (VulnerableDependency[])JacksonUtil.asObject(req.send().getBody(), VulnerableDependency[].class); return vulndeps; }*/ - /*public VulnerableDependency getVulnerableAppArchiveDependencyConstructs(Application _app, String _sha1, String _bugId) throws BackendConnectionException, IOException{ + /*public VulnerableDependency getVulnerableAppArchiveDependencyConstructs(Application _app, String _sha1, String _bugId) throws BackendConnectionException{ final BasicHttpRequest req = new BasicHttpRequest(HttpMethod.GET,PathBuilder.vulnerableDependencyConstructs(_app, _sha1, _bugId), null); VulnerableDependency vd = (VulnerableDependency)JacksonUtil.asObject(req.send().getBody(), VulnerableDependency.class); return vd; @@ -576,7 +576,7 @@ public Map> getAppBugs( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppDeps(GoalContext _ctx, Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (!cacheAppDependencies.containsKey(_app)) { final Set deps = new HashSet(); final boolean app_exists = this.isAppExisting(_ctx, _app); @@ -614,7 +614,7 @@ public Set getAppVulnDeps( boolean _include_historical, boolean _include_affected, boolean _include_affected_unconfirmed) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final Set vuln_deps = new HashSet(); final boolean app_exists = this.isAppExisting(_ctx, _app); if (app_exists) { @@ -648,7 +648,7 @@ public Set getAppVulnDeps( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public VulnerableDependency[] getVulnDeps(Boolean unconfirmedOnly) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final Map params = new HashMap(); params.put("unconfirmedOnly", unconfirmedOnly.toString()); final BasicHttpRequest req = @@ -668,7 +668,7 @@ public VulnerableDependency[] getVulnDeps(Boolean unconfirmedOnly) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppTraces(GoalContext _ctx, @NotNull Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { boolean app_exists = this.isAppExisting(_ctx, _app); final Set constructs = new HashSet(); if (app_exists) { @@ -707,7 +707,7 @@ public Set getAppTraces(GoalContext _ctx, @NotNull Application _app * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Set getAppDependencies(GoalContext _ctx, @NotNull Application _app) - throws BackendConnectionException, IOException { + throws BackendConnectionException { boolean app_exists = this.isAppExisting(_ctx, _app); final Set deps = new HashSet(); if (app_exists) { @@ -747,7 +747,7 @@ public String getLibrary(String _sha1) throws EntityNotFoundInBackendException { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); else return response.getBody(); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException e) { throw new EntityNotFoundInBackendException( "Library with SHA1 [" + _sha1 + "] not found in backend"); } @@ -760,7 +760,7 @@ public String getLibrary(String _sha1) throws EntityNotFoundInBackendException { * @return a int. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public int countLibraryConstructs(String _ja) throws BackendConnectionException, IOException { + public int countLibraryConstructs(String _ja) throws BackendConnectionException { int count_existing = -1; String http_response = null; try { @@ -788,7 +788,7 @@ public int countLibraryConstructs(String _ja) throws BackendConnectionException, * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final String sha1 = _lib.getDigest(); final String json = JacksonUtil.asJsonString(_lib, null, Views.LibDetails.class); // Override setting @@ -842,7 +842,7 @@ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadLibraryFile(String _sha1, Path _file) - throws BackendConnectionException, IOException { + throws BackendConnectionException { try (final FileInputStream inputStream = new FileInputStream(_file.toFile())) { final HttpRequestList req_list = new HttpRequestList(); final BasicHttpRequest cond_req = @@ -880,7 +880,7 @@ public void uploadLibraryFile(String _sha1, Path _file) * @return a boolean. */ public boolean uploadGoalExecution(GoalContext _ctx, AbstractGoal _gexe, boolean _before) - throws BackendConnectionException, IOException { + throws BackendConnectionException { boolean ret = false; // Application goal @@ -964,7 +964,7 @@ public boolean uploadGoalExecution(GoalContext _ctx, AbstractGoal _gexe, boolean * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadTraces(GoalContext _ctx, Application _app, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (this.isAppExisting(_ctx, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -987,7 +987,7 @@ public void uploadTraces(GoalContext _ctx, Application _app, String _json) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadPaths(GoalContext _ctx, Application _app, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { if (this.isAppExisting(_ctx, _app)) { final Map params = new HashMap(); params.put("skipResponseBody", "true"); @@ -1008,7 +1008,7 @@ public void uploadPaths(GoalContext _ctx, Application _app, String _json) * @return a boolean. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public boolean isBugExisting(String _bug) throws BackendConnectionException, IOException { + public boolean isBugExisting(String _bug) throws BackendConnectionException { final HttpResponse response = new BasicHttpRequest(HttpMethod.OPTIONS, PathBuilder.bug(_bug), null).send(); return response.isOk(); @@ -1022,7 +1022,7 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException, IOE * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadChangeList(String _bug, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { // The request depending on whose result either POST or PUT will be called final BasicHttpRequest cond_req = @@ -1050,7 +1050,7 @@ public void uploadChangeList(String _bug, String _json) * @param _bugId a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void deleteBug(String _bugId) throws BackendConnectionException, IOException { + public void deleteBug(String _bugId) throws BackendConnectionException { final BasicHttpRequest del_req = new BasicHttpRequest(HttpMethod.DELETE, PathBuilder.bug(_bugId)); @@ -1067,7 +1067,7 @@ public void deleteBug(String _bugId) throws BackendConnectionException, IOExcept * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void uploadCheckVersionResults(String _bugId, String _json) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final HashMap params = new HashMap(); params.put("source", "CHECK_VERSION"); final HttpRequestList req_list = new HttpRequestList(); @@ -1100,7 +1100,7 @@ public void uploadCheckVersionResults(String _bugId, String _json) */ public AffectedLibrary[] getBugAffectedLibraries( GoalContext _g, String _bugId, String _source, Boolean _onlyWellKnown) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final HashMap params = new HashMap(); params.put("source", _source); params.put("onlyWellKnown", _onlyWellKnown.toString()); @@ -1119,7 +1119,7 @@ public AffectedLibrary[] getBugAffectedLibraries( * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public void deletePatchEvalResults(String _bugId, AffectedVersionSource _source) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final HashMap params = new HashMap(); params.put("source", _source.toString()); final BasicHttpRequest del_req = @@ -1140,7 +1140,7 @@ public void deletePatchEvalResults(String _bugId, AffectedVersionSource _source) */ public void uploadBugAffectedLibraries( GoalContext _g, String _bugId, String _json, AffectedVersionSource _source) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final HashMap params = new HashMap(); params.put("source", _source.toString()); @@ -1256,7 +1256,7 @@ public Signature getConstructSignature(String _sha1, ConstructId _cid) { * @return a {@link org.eclipse.steady.shared.json.model.Bug} object. * @param _g a {@link org.eclipse.steady.goals.GoalContext} object */ - public Bug getBug(GoalContext _g, String _bugId) throws BackendConnectionException, IOException { + public Bug getBug(GoalContext _g, String _bugId) throws BackendConnectionException { BasicHttpRequest request = new BasicHttpRequest(HttpMethod.GET, PathBuilder.bug(_bugId), null); if (_g != null) request.setGoalContext(_g); HttpResponse r = request.send(); @@ -1286,7 +1286,7 @@ public String getClassLibraryIds(String _className) { } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException ex) { log.info(ex); } return json; @@ -1318,7 +1318,7 @@ public synchronized String getAstForQnameInLib( } else { log.info(String.valueOf(response.getStatus())); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException ex) { log.info(ex); } return json; @@ -1340,7 +1340,7 @@ public synchronized String getSourcesForQnameInLib(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException ex) { log.info(ex); } return json; @@ -1358,7 +1358,7 @@ public synchronized String getSourcesForQnameInLib(String qString) { */ public synchronized ConstructId[] getArtifactBugConstructsIntersection( String _qString, List c, String packaging, ProgrammingLanguage lang) - throws BackendConnectionException, IOException { + throws BackendConnectionException { String json = null; BasicHttpRequest bhr = new BasicHttpRequest( @@ -1392,7 +1392,7 @@ public String getJarConstructs(String qString) { if (response.isOk()) { json = response.getBody(); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException ex) { log.info(ex); } return json; @@ -1419,7 +1419,7 @@ public synchronized String getAstDiff(GoalContext _g, String _json) { json = response.getBody(); // ast = (String)JacksonUtil.asObject(json, String.class); } - } catch (BackendConnectionException | IOException ex) { + } catch (BackendConnectionException ex) { log.error(ex); } return json; @@ -1432,7 +1432,7 @@ public synchronized String getAstDiff(GoalContext _g, String _json) { * @return an array of {@link org.eclipse.steady.shared.json.model.Library} objects. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public Library[] getBugLibraries(String _bugId) throws BackendConnectionException, IOException { + public Library[] getBugLibraries(String _bugId) throws BackendConnectionException { final String json = new BasicHttpRequest(HttpMethod.GET, PathBuilder.bugLibraryVersions(_bugId), null) .send() @@ -1451,7 +1451,7 @@ public Library[] getBugLibraries(String _bugId) throws BackendConnectionExceptio * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) - throws BackendConnectionException, IOException, IOException { + throws BackendConnectionException { String json = null; Artifact[] result = null; @@ -1476,7 +1476,7 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public Artifact getArtifact(String _g, String _a, String _v) - throws BackendConnectionException, IOException { + throws BackendConnectionException { String json = null; Artifact result = null; @@ -1500,7 +1500,7 @@ public Artifact getArtifact(String _g, String _a, String _v) * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public synchronized ConstructId[] getArtifactConstructs(String _g, String _a, String _v) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final String json = new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.artifactsConstruct(_g, _a, _v), null) @@ -1525,7 +1525,7 @@ public synchronized ConstructId[] getArtifactConstructs(String _g, String _a, St */ public synchronized boolean doesArtifactExist( String _g, String _a, String _v, Boolean _sources, String packaging) - throws InterruptedException, BackendConnectionException, IOException { + throws InterruptedException, BackendConnectionException { final Map params = new HashMap(); if (_sources != null && _sources) params.put("classifier", "sources"); @@ -1561,7 +1561,7 @@ public synchronized boolean doesArtifactExist( * @return a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionException, IOException { + public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionException { final String json = new BasicHttpRequest(Service.BACKEND, HttpMethod.GET, PathBuilder.bugs(_l), null) .send() @@ -1581,7 +1581,7 @@ public String getBugsList(ProgrammingLanguage _l) throws BackendConnectionExcept * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ public HttpResponse getJarForLib(String _g, String _a, String _v, Boolean _s, String _d) - throws BackendConnectionException, IOException { + throws BackendConnectionException { BasicHttpRequest b = new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.downloadArtifactJars(_g, _a, _v, _s), null); @@ -1596,7 +1596,7 @@ public HttpResponse getJarForLib(String _g, String _a, String _v, Boolean _s, St * @return a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public String getBugsForLib(String _digest) throws BackendConnectionException, IOException { + public String getBugsForLib(String _digest) throws BackendConnectionException { final String json = new BasicHttpRequest(Service.BACKEND, HttpMethod.GET, PathBuilder.libbugs(_digest), null) .send() @@ -1623,7 +1623,7 @@ public AffectedLibrary[] getBugAffectedLibraries( String _artifact, String _version, AffectedVersionSource _source) - throws BackendConnectionException, IOException { + throws BackendConnectionException { final HashMap params = new HashMap(); if (params != null) params.put("source", _source.toString()); BasicHttpRequest request = @@ -1645,7 +1645,7 @@ public AffectedLibrary[] getBugAffectedLibraries( * @return String * @throws org.eclipse.steady.backend.BackendConnectionException */ - public String getCVE(String _bugId) throws BackendConnectionException, IOException { + public String getCVE(String _bugId) throws BackendConnectionException { return new BasicHttpRequest(HttpMethod.GET, PathBuilder.cve(_bugId), null).send().getBody(); } } diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index b1f067760..58603637f 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -210,7 +210,7 @@ private boolean isUploadRequest() { * @return a {@link org.eclipse.steady.backend.HttpResponse} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public HttpResponse send() throws BackendConnectionException, IOException { + public HttpResponse send() throws BackendConnectionException { if (this.response == null) { // Check JSON Exception exception = @@ -334,7 +334,7 @@ public void deletePayloadFromDisk() throws IOException { if (this.payloadPath != null) Paths.get(this.payloadPath).toFile().deleteOnExit(); } - private final HttpResponse sendRequest() throws BackendConnectionException, IOException { + private final HttpResponse sendRequest() throws BackendConnectionException { int response_code = -1; org.apache.http.HttpResponse httpResponse = null; @@ -415,7 +415,7 @@ private final HttpResponse sendRequest() throws BackendConnectionException, IOEx requestBuilder.setConfig(config); httpUriRequest = requestBuilder.build(); - // try { + try { do { is_503 = false; @@ -552,12 +552,12 @@ else if (response.isServerError() + "]"); BasicHttpRequest.log.error(" Exception message: [" + bce.getMessage() + "]"); if (this.hasPayload()) - BasicHttpRequest.log.error(" HTTP Request body: [" + this.payload.toString() + "]"); - } catch (Exception e) { + BasicHttpRequest.log.error(" HTTP Request body: [" + this.payload.toString() + "]");*/ + } catch (IOException e) { final BackendConnectionException bce = new BackendConnectionException(this.method, uri, response_code, e); throwBceException(httpResponse, bce); - }*/ + } return response; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java index 70525efd4..59dd0f467 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/ConditionalHttpRequest.java @@ -91,7 +91,7 @@ public HttpRequest setGoalContext(GoalContext _ctx) { * First performs the conditional requests. Only if all the responses meets the condition, the actual request will be performed. */ @Override - public HttpResponse send() throws IllegalStateException, BackendConnectionException, IOException { + public HttpResponse send() throws IllegalStateException, BackendConnectionException { if (this.conditionRequest == null || this.conditions.size() == 0) throw new IllegalStateException("No condition request or no conditions set"); diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java index 5ab798b48..5d3227850 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequest.java @@ -36,7 +36,7 @@ public interface HttpRequest extends Serializable { * @return a {@link org.eclipse.steady.backend.HttpResponse} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public HttpResponse send() throws BackendConnectionException, IOException; + public HttpResponse send() throws BackendConnectionException; /** *

    getGoalContext.

    diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java index 83c156491..c955b07be 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/HttpRequestList.java @@ -83,7 +83,7 @@ public HttpRequest setGoalContext(GoalContext _ctx) { * stop in case of a successful call. */ @Override - public HttpResponse send() throws BackendConnectionException, IOException { + public HttpResponse send() throws BackendConnectionException { HttpResponse response = null; for (HttpRequest r : this.list) { response = r.send(); diff --git a/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java b/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java index 8e28b8466..348207d67 100755 --- a/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java +++ b/lang/src/main/java/org/eclipse/steady/core/util/CoreConfiguration.java @@ -20,8 +20,6 @@ import java.util.ServiceLoader; -import java.io.IOException; - import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.logging.log4j.Logger; @@ -371,7 +369,7 @@ public static final boolean existsInBackend(Application _app) { exists = BackendConnector.getInstance() .isAppExisting(CoreConfiguration.buildGoalContextFromGlobalConfiguration(), _app); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException e) { log.error("Error while checking whether " + _app + " exists in backend: " + e.getMessage()); } return exists; diff --git a/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java b/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java index 2072c1512..10376350a 100644 --- a/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java +++ b/lang/src/main/java/org/eclipse/steady/goals/AbstractAppGoal.java @@ -25,8 +25,6 @@ import java.util.Map; import java.util.Set; -import java.io.IOException; - import org.apache.logging.log4j.Logger; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; @@ -135,7 +133,7 @@ protected void prepareExecution() throws GoalConfigurationException { "Workspace [" + this.getGoalContext().getSpace() + "] cannot be verified: Not present in server"); - } catch (BackendConnectionException | IOException e) { + } catch (BackendConnectionException e) { throw new GoalConfigurationException( "Workspace [" + this.getGoalContext().getSpace() diff --git a/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java b/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java new file mode 100644 index 000000000..6e015c7b2 --- /dev/null +++ b/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java @@ -0,0 +1,52 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.shared.enums; + +/** + * The client running goal(s). + */ +public enum GoalClient { + CLI((byte) 10), + MAVEN_PLUGIN((byte) 20), + REST_SERVICE((byte) 30), + AGENT((byte) 40), + SETUPTOOLS((byte) 50), + GRADLE_PLUGIN((byte) 60); + + private byte value; + + private GoalClient(byte _value) { + this.value = _value; + } + + /** + *

    toString.

    + * + * @return a {@link java.lang.String} object. + */ + public String toString() { + if (this.value == 10) return "CLI"; + else if (this.value == 20) return "MAVEN"; + else if (this.value == 30) return "REST"; + else if (this.value == 40) return "AGENT"; + else if (this.value == 50) return "SETUPTOOLS"; + else if (this.value == 60) return "GRADLE"; + else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); + } +} From 6bb68954e2517adb1dc62f3582928ee4dd229c65 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 1 Jun 2022 17:12:41 +0200 Subject: [PATCH 47/83] added curl installation in dockerfile --- docker/kb-importer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/kb-importer/Dockerfile b/docker/kb-importer/Dockerfile index 9e1480ef3..cb262c36f 100644 --- a/docker/kb-importer/Dockerfile +++ b/docker/kb-importer/Dockerfile @@ -6,7 +6,7 @@ ARG VULAS_RELEASE RUN apt-get update \ && apt-get install -y --no-install-recommends \ - openssl wget tar git cron bash gettext\ + openssl wget tar git cron bash gettext curl\ && rm -rf /var/lib/apt/lists/* \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false From 5e41ded5667d3e5c3df0d92d3459fe75f72ff590 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:04:12 +0200 Subject: [PATCH 48/83] Removed some comments, changed some logs, added GoalClient again --- docker/kb-importer/Dockerfile | 2 - docker/kb-importer/start.sh | 4 +- .../org/eclipse/steady/kb/ImportCommand.java | 26 +- .../steady/kb/task/ExtractOrClone.java | 6 +- .../eclipse/steady/kb/util/ConstructSet.java | 1 - .../steady/backend/BackendConnector.java | 12 +- .../backend/requests/BasicHttpRequest.java | 236 +++++++++--------- .../steady/shared/enums/GoalClient.java | 52 ++++ 8 files changed, 182 insertions(+), 157 deletions(-) create mode 100644 shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java diff --git a/docker/kb-importer/Dockerfile b/docker/kb-importer/Dockerfile index cb262c36f..c9c4010ce 100644 --- a/docker/kb-importer/Dockerfile +++ b/docker/kb-importer/Dockerfile @@ -22,6 +22,4 @@ COPY start.sh /kb-importer/ EXPOSE 8080 -RUN chmod +x /kb-importer/kb-importer.sh /kb-importer/start.sh - ENTRYPOINT ["sh","/kb-importer/start.sh"] diff --git a/docker/kb-importer/start.sh b/docker/kb-importer/start.sh index 2a200e579..06dd0abbe 100644 --- a/docker/kb-importer/start.sh +++ b/docker/kb-importer/start.sh @@ -26,10 +26,10 @@ for cert in $certs; do keytool -import -alias $cert -storepass changeit -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file /kb-importer/certs/$cert -noprompt done -java -Dvulas.shared.backend.header.X-Vulas-Client-Token=$BACKEND_BUGS_TOKEN \ +(java -Dvulas.shared.backend.header.X-Vulas-Client-Token=$BACKEND_BUGS_TOKEN \ -Dvulas.shared.cia.serviceUrl=$CIA_SERVICE_URL \ -Dvulas.shared.backend.serviceUrl=$BACKEND_SERVICE_URL \ - -jar /kb-importer/data/kb-importer.jar >> analyzer_logs.txt & + -jar /kb-importer/data/kb-importer.jar | tee analyzer_logs.txt ) & #Wait for kb-importer and backend to start sleep 40 diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index d93c4d72d..d9e9bc2f5 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -71,7 +71,7 @@ public void run() { log.error("Can't connect to the Backend"); manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_CONNECTION); manager.addFailure(vulnId, e.toString()); - e.printStackTrace(); + log.error(e.getMessage()); return; } Boolean overwrite = false; @@ -133,7 +133,7 @@ public void run() { } catch (IOException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); manager.addFailure(vuln.getVulnId(), e.toString()); - e.printStackTrace(); + log.error(e.getMessage()); return; } this.stopWatch.lap("ImportAffectedLibraries"); @@ -142,7 +142,7 @@ public void run() { } catch (IOException | MalformedPackageURLException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_LIB); manager.addFailure(vuln.getVulnId(), e.toString()); - e.printStackTrace(); + log.error(e.getMessage()); return; } manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); @@ -154,29 +154,11 @@ public void run() { } public String findStatementPath() { - // Review this function if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { return vulnDir + File.separator + STATEMENT_YAML; - } else if (FileUtil.isAccessibleDirectory(vulnDir)) { - File directory = new File(vulnDir.toString()); - File[] fList = directory.listFiles(); - if (fList != null) { - for (File file : fList) { - if (file.isDirectory()) { - if (FileUtil.isAccessibleFile( - file.getAbsolutePath() + File.separator + STATEMENT_YAML)) { - return file.getAbsolutePath() + File.separator + STATEMENT_YAML; - } else { - ImportCommand.log.warn( - "Skipping {} as the directory does not contain statement.yaml file", - file.getAbsolutePath()); - } - } - } - } } else { ImportCommand.log.error("Invalid directory {}", vulnDir); + return null; } - return null; } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index f6f3b51c6..772e69ed7 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -86,7 +86,7 @@ public void extract(File tarFile, String dirPath) { String vulnId = dirPath.split(File.separator)[dirPath.split(File.separator).length - 1]; manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); manager.addFailure(vuln.getVulnId(), e.toString()); - e.printStackTrace(); + log.error(e.getMessage()); } } @@ -112,9 +112,9 @@ public void clone(Vulnerability vuln, String dirPath) { createAndWriteCommitMetadata(commit, repoDirPath, commitDirPath); writeCommitDiff(commitId, repoDirPath, commitDirPath); } catch (IOException | InterruptedException e) { - e.printStackTrace(); manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); manager.addFailure(vuln.getVulnId(), e.toString()); + log.error(e.getMessage()); break; } manager.unlockRepo(repoUrl); @@ -125,8 +125,6 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri throws IOException { String commitId = commit.getCommitId(); - String commitMetadataPath = commitDirPath + File.separator + ImportCommand.METADATA_JSON; - File commitMetadataFile = new File(commitDirPath); HashMap commitMetadata = new HashMap(); String timestamp; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java index ab1f8038f..3b5c7d5ea 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/ConstructSet.java @@ -84,7 +84,6 @@ public static Set identifyConstructChanges( } } catch (Exception e) { ConstructSet.log.error("Error while analyzing {} : {}", c, e.getMessage()); - e.printStackTrace(); } } diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 1aa6ede54..165909ed9 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -523,8 +523,7 @@ public Map> getAppBugs(GoalContext _ctx, Application _a * @return a {@link java.util.Map} object. */ public Map> getAppBugs( - GoalContext _ctx, Application _app, String _filter) - throws BackendConnectionException { + GoalContext _ctx, Application _app, String _filter) throws BackendConnectionException { // Return all change lists if (_filter == null || _filter.equals("")) { return this.getAppBugs(_ctx, _app); @@ -841,8 +840,7 @@ public synchronized void uploadLibrary(GoalContext _ctx, Library _lib) * @param _file a {@link java.nio.file.Path} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadLibraryFile(String _sha1, Path _file) - throws BackendConnectionException { + public void uploadLibraryFile(String _sha1, Path _file) throws BackendConnectionException { try (final FileInputStream inputStream = new FileInputStream(_file.toFile())) { final HttpRequestList req_list = new HttpRequestList(); final BasicHttpRequest cond_req = @@ -1021,8 +1019,7 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException { * @param _json a {@link java.lang.String} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public void uploadChangeList(String _bug, String _json) - throws BackendConnectionException { + public void uploadChangeList(String _bug, String _json) throws BackendConnectionException { // The request depending on whose result either POST or PUT will be called final BasicHttpRequest cond_req = @@ -1475,8 +1472,7 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) * @return a {@link org.eclipse.steady.shared.json.model.Artifact} object. * @throws org.eclipse.steady.backend.BackendConnectionException if any. */ - public Artifact getArtifact(String _g, String _a, String _v) - throws BackendConnectionException { + public Artifact getArtifact(String _g, String _a, String _v) throws BackendConnectionException { String json = null; Artifact result = null; diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index 58603637f..2a3a6c28e 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -416,133 +416,133 @@ private final HttpResponse sendRequest() throws BackendConnectionException { httpUriRequest = requestBuilder.build(); try { - do { - is_503 = false; - - final long start_nano = System.nanoTime(); - - if (!this.hasPayload()) { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); - } else if (this.binPayload == null) { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + ", size=" - + StringUtil.byteToKBString(this.payload.getBytes(StandardCharsets.UTF_8).length) - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); - } else { - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " [uri=" - + uri - + ", size=" - + this.binPayload.available() - + (tenant_token == null ? "" : ", tenant=" + tenant_token) - + (space_token == null ? "" : ", space=" + space_token) - + "]"); - } - - SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).build(); - HttpClient client = - HttpClients.custom().setDefaultSocketConfig(socketConfig).useSystemProperties().build(); - - // Read response - httpResponse = client.execute(httpUriRequest); - response_code = httpResponse.getStatusLine().getStatusCode(); - response = new HttpResponse(response_code); - // If the response body contains a JAR file, save it - if (response.isOk() - && httpResponse.getFirstHeader("Content-Type") != null - && httpResponse - .getFirstHeader("Content-Type") - .getValue() - .contains("application/java-archive")) { - String fileName = ""; - Header disposition = httpResponse.getFirstHeader("Content-Disposition"); - if (disposition != null) { - String dispositionValue = disposition.getValue(); - // Extracts file name from header field - int index = dispositionValue.indexOf("filename="); - if (index > 0) { - fileName = dispositionValue.substring(index + 9, dispositionValue.length()); - } + do { + is_503 = false; + + final long start_nano = System.nanoTime(); + + if (!this.hasPayload()) { + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); + } else if (this.binPayload == null) { + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + ", size=" + + StringUtil.byteToKBString(this.payload.getBytes(StandardCharsets.UTF_8).length) + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); } else { - // Extracts file name from URL - fileName = this.path.substring(this.path.lastIndexOf("/") + 1, this.path.length()); + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " [uri=" + + uri + + ", size=" + + this.binPayload.available() + + (tenant_token == null ? "" : ", tenant=" + tenant_token) + + (space_token == null ? "" : ", space=" + space_token) + + "]"); } - String saveFilePath = null; - if (this.dir != null) { - // create directories if not existing - if (!Files.exists(Paths.get(dir))) { - Files.createDirectories(Paths.get(dir)); + SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).build(); + HttpClient client = + HttpClients.custom().setDefaultSocketConfig(socketConfig).useSystemProperties().build(); + + // Read response + httpResponse = client.execute(httpUriRequest); + response_code = httpResponse.getStatusLine().getStatusCode(); + response = new HttpResponse(response_code); + // If the response body contains a JAR file, save it + if (response.isOk() + && httpResponse.getFirstHeader("Content-Type") != null + && httpResponse + .getFirstHeader("Content-Type") + .getValue() + .contains("application/java-archive")) { + String fileName = ""; + Header disposition = httpResponse.getFirstHeader("Content-Disposition"); + if (disposition != null) { + String dispositionValue = disposition.getValue(); + // Extracts file name from header field + int index = dispositionValue.indexOf("filename="); + if (index > 0) { + fileName = dispositionValue.substring(index + 9, dispositionValue.length()); + } + } else { + // Extracts file name from URL + fileName = this.path.substring(this.path.lastIndexOf("/") + 1, this.path.length()); } - saveFilePath = dir + File.separator + fileName; - } else { - saveFilePath = - Paths.get(this.getVulasConfiguration().getTmpDir().toString()).toString() - + File.separator - + fileName; - } - try ( - // Opens input stream from the HTTP connection - InputStream inputStream = httpResponse.getEntity().getContent(); - // Opens an output stream to save into file - FileOutputStream outputStream = new FileOutputStream(saveFilePath); ) { - int bytesRead = -1; - byte[] buffer = new byte[inputStream.available()]; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); + String saveFilePath = null; + if (this.dir != null) { + // create directories if not existing + if (!Files.exists(Paths.get(dir))) { + Files.createDirectories(Paths.get(dir)); + } + saveFilePath = dir + File.separator + fileName; + } else { + saveFilePath = + Paths.get(this.getVulasConfiguration().getTmpDir().toString()).toString() + + File.separator + + fileName; } - response.setBody(saveFilePath); + try ( + // Opens input stream from the HTTP connection + InputStream inputStream = httpResponse.getEntity().getContent(); + // Opens an output stream to save into file + FileOutputStream outputStream = new FileOutputStream(saveFilePath); ) { + int bytesRead = -1; + byte[] buffer = new byte[inputStream.available()]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + response.setBody(saveFilePath); + } + } else if (response.isOk() || response.isCreated()) { + final String body = this.readResponse(httpResponse); + if (StringUtils.isNotBlank(body)) response.setBody(body); } - } else if (response.isOk() || response.isCreated()) { - final String body = this.readResponse(httpResponse); - if (StringUtils.isNotBlank(body)) response.setBody(body); - } - // Stats - final long end_nano = System.nanoTime(); - BasicHttpRequest.log.info( - "HTTP " - + this.method.toString().toUpperCase() - + " completed with response code [" - + response_code - + "] in " - + StringUtil.nanoToFlexDurationString(end_nano - start_nano) - + " (proxy=" - + isProxySet() - + ")"); - - // 503: Retry - if (response.isServiceUnavailable()) { - is_503 = true; - } - // 5xx: Throw exception - else if (response.isServerError() - || response.getStatus() == 400 - || response.getStatus() == 403) { - final BackendConnectionException bce = - new BackendConnectionException(this.method, uri, response_code, null); - throwBceException(httpResponse, bce); - } - } while (repeater.repeat(is_503)); - if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); - /*} catch (BackendConnectionException bce) { + // Stats + final long end_nano = System.nanoTime(); + BasicHttpRequest.log.info( + "HTTP " + + this.method.toString().toUpperCase() + + " completed with response code [" + + response_code + + "] in " + + StringUtil.nanoToFlexDurationString(end_nano - start_nano) + + " (proxy=" + + isProxySet() + + ")"); + + // 503: Retry + if (response.isServiceUnavailable()) { + is_503 = true; + } + // 5xx: Throw exception + else if (response.isServerError() + || response.getStatus() == 400 + || response.getStatus() == 403) { + final BackendConnectionException bce = + new BackendConnectionException(this.method, uri, response_code, null); + throwBceException(httpResponse, bce); + } + } while (repeater.repeat(is_503)); + if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); + /*} catch (BackendConnectionException bce) { this.logHeaderFields(" Request-header", httpUriRequest.getAllHeaders()); this.logHeaderFields(" Response-header", httpResponse.getAllHeaders()); if (bce.getHttpResponseBody() != null) diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java new file mode 100644 index 000000000..6e015c7b2 --- /dev/null +++ b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java @@ -0,0 +1,52 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.shared.enums; + +/** + * The client running goal(s). + */ +public enum GoalClient { + CLI((byte) 10), + MAVEN_PLUGIN((byte) 20), + REST_SERVICE((byte) 30), + AGENT((byte) 40), + SETUPTOOLS((byte) 50), + GRADLE_PLUGIN((byte) 60); + + private byte value; + + private GoalClient(byte _value) { + this.value = _value; + } + + /** + *

    toString.

    + * + * @return a {@link java.lang.String} object. + */ + public String toString() { + if (this.value == 10) return "CLI"; + else if (this.value == 20) return "MAVEN"; + else if (this.value == 30) return "REST"; + else if (this.value == 40) return "AGENT"; + else if (this.value == 50) return "SETUPTOOLS"; + else if (this.value == 60) return "GRADLE"; + else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); + } +} From dc0682299c6e1de0f5c857e07c891036ef6b2318 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:10:09 +0200 Subject: [PATCH 49/83] Added license in some new files --- .../org/eclipse/steady/kb/ImportCommand.java | 18 ++++++++++++++++++ .../java/org/eclipse/steady/kb/Manager.java | 19 ++++++++++++++++++- .../steady/kb/task/ExtractOrClone.java | 18 ++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index d9e9bc2f5..9f7ce6008 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -1,3 +1,21 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ package org.eclipse.steady.kb; import java.util.HashMap; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 51b93a2bc..bf0782667 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -1,3 +1,21 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ package org.eclipse.steady.kb; import java.util.ArrayList; @@ -30,7 +48,6 @@ public class Manager { org.apache.logging.log4j.LogManager.getLogger(); private ThreadPoolExecutor executor = - // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); // (ThreadPoolExecutor) Executors.newCachedThreadPool(); (ThreadPoolExecutor) Executors.newFixedThreadPool(8); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 772e69ed7..95d5e37be 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -1,3 +1,21 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ package org.eclipse.steady.kb.task; import java.io.IOException; From 9b07d69792e010949bffbb71a42b3efc85e8b3af Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:12:21 +0200 Subject: [PATCH 50/83] Removed .gitignore form kb-importer directory --- kb-importer/.gitignore | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 kb-importer/.gitignore diff --git a/kb-importer/.gitignore b/kb-importer/.gitignore deleted file mode 100644 index 768480f43..000000000 --- a/kb-importer/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -tmp/* -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ From 4d2dffd708c4eeec08a67b9cf66460fed338f1a2 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:17:04 +0200 Subject: [PATCH 51/83] Moved snakeyaml dependency to kb-importer/pom.xml --- lang-java/pom.xml | 5 +++++ pom.xml | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lang-java/pom.xml b/lang-java/pom.xml index 21aba5a0a..0949374b0 100644 --- a/lang-java/pom.xml +++ b/lang-java/pom.xml @@ -39,6 +39,11 @@ + + org.yaml + snakeyaml + 1.30 + org.eclipse.steady lang diff --git a/pom.xml b/pom.xml index ad99ddfaa..91cd6e3ec 100755 --- a/pom.xml +++ b/pom.xml @@ -277,11 +277,6 @@ - - org.yaml - snakeyaml - 1.30 - javax.validation validation-api From 38b25e64b2158b8ad24eedc1947621d68abb2020 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:22:07 +0200 Subject: [PATCH 52/83] Fixed a mistake in kb-importer dockerfile --- docker/kb-importer/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/kb-importer/Dockerfile b/docker/kb-importer/Dockerfile index c9c4010ce..ab20ab648 100644 --- a/docker/kb-importer/Dockerfile +++ b/docker/kb-importer/Dockerfile @@ -22,4 +22,6 @@ COPY start.sh /kb-importer/ EXPOSE 8080 +RUN chmod +x /kb-importer/start.sh + ENTRYPOINT ["sh","/kb-importer/start.sh"] From d6a04e3389fdc78b5f1c306592d9236718ccbe83 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 10:24:25 +0200 Subject: [PATCH 53/83] Removed a comment --- .../src/main/java/org/eclipse/steady/kb/task/Task.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java index 0dc9eef2e..02ce1ba42 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java @@ -9,13 +9,6 @@ * Execute Command tasks */ public interface Task { - /** - * command name the task belongs to - * - * @return name of command - */ - // Command.NAME getCommandName(); - /** * Task Executor * From 0016296a5abd533e4c9d528f080a89df1d2ffb95 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 13:18:24 +0200 Subject: [PATCH 54/83] Documentation --- .../src/main/java/org/eclipse/steady/kb/ImportCommand.java | 4 ++++ .../main/java/org/eclipse/steady/kb/ImporterController.java | 4 ++++ kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java | 4 ++++ .../main/java/org/eclipse/steady/kb/task/ExtractOrClone.java | 4 ++++ .../java/org/eclipse/steady/kb/task/ImportVulnerability.java | 2 -- .../src/main/java/org/eclipse/steady/kb/task/Task.java | 1 - 6 files changed, 16 insertions(+), 3 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 9f7ce6008..dec020a20 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -39,6 +39,10 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.shared.util.StopWatch; +/** + * Import data of a single vulnerability. + * Calls 3 tasks sequentially: ExtractOrClone, ImportVulnerability and ImportAffectedLibraries. + */ public class ImportCommand implements Runnable { public static final String METADATA_JSON = "metadata.json"; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 0b1b5aefb..dd39e70b5 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -36,6 +36,10 @@ import org.eclipse.steady.shared.util.VulasConfiguration; + +/** + * REST Controller for kb-importer + */ @RestController @CrossOrigin("*") public class ImporterController { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index bf0782667..354dfe843 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -42,6 +42,10 @@ import org.eclipse.steady.shared.util.DirWithFileSearch; import org.eclipse.steady.backend.BackendConnector; +/** + * Creates and executes threads for processing each vulnerability. + * Keeps track of the state of each one of them. + */ public class Manager { private static final org.apache.logging.log4j.Logger log = diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 95d5e37be..c1935407c 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -36,6 +36,10 @@ import org.eclipse.steady.kb.util.Metadata; import org.eclipse.steady.kb.Manager; +/** + * Obtain modified source code files for each commit in a statement. + * These files are obtained by extracting from a tar file (if available) or directly from the repository. + */ public class ExtractOrClone { private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 9f27def79..7d8eb0bf5 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -37,8 +37,6 @@ import org.eclipse.steady.ConstructChange; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; -// import org.eclipse.steady.kb.command.Command; -// import org.eclipse.steady.kb.command.Import; import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.model.Commit; import org.eclipse.steady.kb.model.Note; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java index 02ce1ba42..367ba72fd 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/Task.java @@ -2,7 +2,6 @@ import java.util.HashMap; import org.eclipse.steady.backend.BackendConnector; -// import org.eclipse.steady.kb.command.Command; import org.eclipse.steady.kb.model.Vulnerability; /** From 5fbf2a78a8be663bdd9d9089761c78b2c5d81edb Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 13:39:43 +0200 Subject: [PATCH 55/83] Removed MainTest.java --- .../java/org/eclipse/steady/kb/MainTest.java | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java deleted file mode 100644 index c0d7078df..000000000 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/MainTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.kb; - -public class MainTest { - private static final String SPACE = " "; - - /* - @Test - public void testHelp() { - String args = "help"; - Main.main(args.split(SPACE)); - } - - @Test - public void testVersion() { - String args = "version"; - Main.main(args.split(SPACE)); - }*/ -} From 6748bf06b7e535817d9c3641f396c0b729332991 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 14:03:08 +0200 Subject: [PATCH 56/83] Removed IOExceptio in commented code --- .../java/org/eclipse/steady/backend/BackendConnector.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 165909ed9..fcdf9b5fa 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -1222,7 +1222,7 @@ public void batchUpload(GoalContext _ctx) { } else { BackendConnector.log.error("HTTP response status [" + response.getStatus() + "], no AST for GAV [" + _lib + "] and construct " + _cid + " found"); } - } catch (BackendConnectionException | IOException e1) { + } catch (BackendConnectionException e1) { BackendConnector.log.error("Error while retrieving AST for GAV [" + _lib + "] and construct " + _cid + ": " + e1.getMessage(), e1); } return ast; @@ -1239,7 +1239,7 @@ public Signature getConstructSignature(String _sha1, ConstructId _cid) { } else { BackendConnector.log.error("HTTP response status [" + response.getStatus() + "], no AST for SHA1 [" + _sha1 + "] and construct " + _cid + " found"); } - } catch (BackendConnectionException | IOException e1) { + } catch (BackendConnectionException e1) { BackendConnector.log.error("Error while retrieving AST for SHA1 [" + _sha1 + "] and construct " + _cid + ": " + e1.getMessage(), e1); } return ast; From caf4d5593db8ccdff35e23c2385abb1fafbc1c92 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 14:06:40 +0200 Subject: [PATCH 57/83] Removed printStackTrace from BackendConnectionException --- .../org/eclipse/steady/backend/BackendConnectionException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java index af3f6ad78..bb0328afa 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java @@ -35,7 +35,6 @@ public class BackendConnectionException extends Exception { */ public BackendConnectionException(String _message, Throwable _cause) { super(_message, _cause); - this.printStackTrace(); } /** *

    Constructor for BackendConnectionException.

    From d65daaa936fd93a3c0697404efbc4274832d4a63 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 14:11:20 +0200 Subject: [PATCH 58/83] mend --- .../org/eclipse/steady/backend/BackendConnectionException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java index bb0328afa..65102d8e2 100644 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnectionException.java @@ -58,7 +58,6 @@ public BackendConnectionException( _cause); this.httpResponseStatus = _response_status; this.uri = _uri; - this.printStackTrace(); } /** *

    Getter for the field httpResponseBody.

    From 14a6e223c8b7660280d11f684014a97451428047 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 14:47:47 +0200 Subject: [PATCH 59/83] Fixed mistake in pom files (moved snakeyaml dependency) --- kb-importer/pom.xml | 5 +++++ lang-java/pom.xml | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 2e9d39b74..14961bbf9 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -51,6 +51,11 @@ commons-io 2.11.0
    + + org.yaml + snakeyaml + 1.30 + org.eclipse.steady diff --git a/lang-java/pom.xml b/lang-java/pom.xml index 0949374b0..21aba5a0a 100644 --- a/lang-java/pom.xml +++ b/lang-java/pom.xml @@ -39,11 +39,6 @@ - - org.yaml - snakeyaml - 1.30 - org.eclipse.steady lang From 7999bf78dfb635d94a26b84e9bfd4ed7936df6df Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 15:06:53 +0200 Subject: [PATCH 60/83] whitespace --- .../main/java/org/eclipse/steady/shared/enums/GoalClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java index 6e015c7b2..a5dabc8f1 100644 --- a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +++ b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java @@ -19,7 +19,7 @@ package org.eclipse.steady.shared.enums; /** - * The client running goal(s). + * The client running goal(s). */ public enum GoalClient { CLI((byte) 10), From d9f9dc339b3a973eaaff3b786a0c2b46441bfe7a Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 15:14:32 +0200 Subject: [PATCH 61/83] Removed GoalClient from wrong directory. Removed whitespace --- .../org/eclipse/steady/goals/GoalClient.java | 52 ------------------- .../steady/shared/enums/GoalClient.java | 2 +- 2 files changed, 1 insertion(+), 53 deletions(-) delete mode 100644 lang/src/main/java/org/eclipse/steady/goals/GoalClient.java diff --git a/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java b/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java deleted file mode 100644 index 6e015c7b2..000000000 --- a/lang/src/main/java/org/eclipse/steady/goals/GoalClient.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This file is part of Eclipse Steady. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors - */ -package org.eclipse.steady.shared.enums; - -/** - * The client running goal(s). - */ -public enum GoalClient { - CLI((byte) 10), - MAVEN_PLUGIN((byte) 20), - REST_SERVICE((byte) 30), - AGENT((byte) 40), - SETUPTOOLS((byte) 50), - GRADLE_PLUGIN((byte) 60); - - private byte value; - - private GoalClient(byte _value) { - this.value = _value; - } - - /** - *

    toString.

    - * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (this.value == 10) return "CLI"; - else if (this.value == 20) return "MAVEN"; - else if (this.value == 30) return "REST"; - else if (this.value == 40) return "AGENT"; - else if (this.value == 50) return "SETUPTOOLS"; - else if (this.value == 60) return "GRADLE"; - else throw new IllegalArgumentException("[" + this.value + "] is not a valid goal client"); - } -} diff --git a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java index a5dabc8f1..6e015c7b2 100644 --- a/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java +++ b/shared/src/main/java/org/eclipse/steady/shared/enums/GoalClient.java @@ -19,7 +19,7 @@ package org.eclipse.steady.shared.enums; /** - * The client running goal(s). + * The client running goal(s). */ public enum GoalClient { CLI((byte) 10), From e1186cc1ff7f3625bd2820fda05d5af2ee79f695 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Thu, 2 Jun 2022 15:31:09 +0200 Subject: [PATCH 62/83] Reversed change in BasicHttpRequest --- .../org/eclipse/steady/backend/requests/BasicHttpRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index 2a3a6c28e..a94a946fb 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -542,7 +542,7 @@ else if (response.isServerError() } } while (repeater.repeat(is_503)); if (is_503) throw new BackendConnectionException(this.method, uri, 503, null); - /*} catch (BackendConnectionException bce) { + } catch (BackendConnectionException bce) { this.logHeaderFields(" Request-header", httpUriRequest.getAllHeaders()); this.logHeaderFields(" Response-header", httpResponse.getAllHeaders()); if (bce.getHttpResponseBody() != null) @@ -553,7 +553,7 @@ else if (response.isServerError() BasicHttpRequest.log.error(" Exception message: [" + bce.getMessage() + "]"); if (this.hasPayload()) BasicHttpRequest.log.error(" HTTP Request body: [" + this.payload.toString() + "]");*/ - } catch (IOException e) { + } catch (Exception e) { final BackendConnectionException bce = new BackendConnectionException(this.method, uri, response_code, e); throwBceException(httpResponse, bce); From ebdc25921ba8c6c36b77c108f9ea435fede05252 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 7 Jun 2022 11:11:21 +0200 Subject: [PATCH 63/83] Reversed change in kb-importer pom --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 91cd6e3ec..7edf8ceba 100755 --- a/pom.xml +++ b/pom.xml @@ -113,8 +113,7 @@ - 8 - 8 + 8 true true true From 86a433b4d3c13db8e9bb6e77cc97b4c693e54289 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 7 Jun 2022 11:12:48 +0200 Subject: [PATCH 64/83] Function isBugExisting throws BackendConnectionException --- .../steady/backend/BackendConnector.java | 31 ++++++++++++++----- .../backend/requests/BasicHttpRequest.java | 2 +- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index fcdf9b5fa..37e459d40 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -1009,7 +1009,13 @@ public void uploadPaths(GoalContext _ctx, Application _app, String _json) public boolean isBugExisting(String _bug) throws BackendConnectionException { final HttpResponse response = new BasicHttpRequest(HttpMethod.OPTIONS, PathBuilder.bug(_bug), null).send(); - return response.isOk(); + if (response.isOk()) { + return response.isOk(); + } else if (response.isNotFound()) { + return false; + } else { + throw new BackendConnectionException("Got response code " + response.getStatus() + " when communicating with the backend", null); + } } /** @@ -1104,7 +1110,11 @@ public AffectedLibrary[] getBugAffectedLibraries( BasicHttpRequest request = new BasicHttpRequest(HttpMethod.GET, PathBuilder.bugAffectedLibs(_bugId), params); if (_g != null) request.setGoalContext(_g); - final String json = request.send().getBody(); + final HttpResponse response = request.send(); + if (!response.isOk()) { + throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + } + final String json = response.getBody(); return (AffectedLibrary[]) JacksonUtil.asObject(json, AffectedLibrary[].class); } @@ -1452,11 +1462,13 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) String json = null; Artifact[] result = null; - json = - new BasicHttpRequest( + final HttpResponse response = new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.artifactsGroupVersion(_g, _a), null) - .send() - .getBody(); + .send(); + if (!response.isOk()) { + throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + } + json = response.getBody(); BackendConnector.log.info("artifacts for " + _g + ":" + _a + " received from backend"); if (json != null) result = (Artifact[]) JacksonUtil.asObject(json, Artifact[].class); @@ -1625,7 +1637,12 @@ public AffectedLibrary[] getBugAffectedLibraries( BasicHttpRequest request = new BasicHttpRequest( HttpMethod.GET, PathBuilder.affectedLibs(_bugId, _group, _artifact, _version), params); - String json = request.send().getBody(); + + final HttpResponse response = request.send(); + if (!response.isOk()) { + throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + } + String json = response.getBody(); if (json == null) { json = "[]"; } diff --git a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java index a94a946fb..1702bff40 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java +++ b/lang/src/main/java/org/eclipse/steady/backend/requests/BasicHttpRequest.java @@ -552,7 +552,7 @@ else if (response.isServerError() + "]"); BasicHttpRequest.log.error(" Exception message: [" + bce.getMessage() + "]"); if (this.hasPayload()) - BasicHttpRequest.log.error(" HTTP Request body: [" + this.payload.toString() + "]");*/ + BasicHttpRequest.log.error(" HTTP Request body: [" + this.payload.toString() + "]"); } catch (Exception e) { final BackendConnectionException bce = new BackendConnectionException(this.method, uri, response_code, e); From 62b6b1791abd5f6292eb2a680f1ec9e5dd53299a Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 7 Jun 2022 14:05:40 +0200 Subject: [PATCH 65/83] Fixed code style --- .../eclipse/steady/kb/ImporterController.java | 1 - .../java/org/eclipse/steady/kb/Manager.java | 8 +++++--- .../steady/backend/BackendConnector.java | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index dd39e70b5..336fba92e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -36,7 +36,6 @@ import org.eclipse.steady.shared.util.VulasConfiguration; - /** * REST Controller for kb-importer */ diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 354dfe843..80ce15f64 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -51,9 +51,8 @@ public class Manager { private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(); - private ThreadPoolExecutor executor = - // (ThreadPoolExecutor) Executors.newCachedThreadPool(); - (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + private ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); + // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); @@ -138,6 +137,9 @@ public synchronized void start( this.startIsRunning = false; } + /** + * Keep retrying vulnerabilities that failed due to the high amount of requests. + */ public void retryFailed(String statementsPath, HashMap mapCommandOptionValues) { List failuresToRetry = new ArrayList(); diff --git a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java index 37e459d40..1c85c9afa 100755 --- a/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java +++ b/lang/src/main/java/org/eclipse/steady/backend/BackendConnector.java @@ -1014,7 +1014,9 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException { } else if (response.isNotFound()) { return false; } else { - throw new BackendConnectionException("Got response code " + response.getStatus() + " when communicating with the backend", null); + throw new BackendConnectionException( + "Got response code " + response.getStatus() + " when communicating with the backend", + null); } } @@ -1112,7 +1114,8 @@ public AffectedLibrary[] getBugAffectedLibraries( if (_g != null) request.setGoalContext(_g); final HttpResponse response = request.send(); if (!response.isOk()) { - throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + throw new BackendConnectionException( + "Got respose " + response.getStatus() + " when communicating with the backend", null); } final String json = response.getBody(); return (AffectedLibrary[]) JacksonUtil.asObject(json, AffectedLibrary[].class); @@ -1462,11 +1465,13 @@ public Artifact[] getAllArtifactsGroupArtifact(String _g, String _a) String json = null; Artifact[] result = null; - final HttpResponse response = new BasicHttpRequest( + final HttpResponse response = + new BasicHttpRequest( Service.CIA, HttpMethod.GET, PathBuilder.artifactsGroupVersion(_g, _a), null) .send(); if (!response.isOk()) { - throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + throw new BackendConnectionException( + "Got respose " + response.getStatus() + " when communicating with the backend", null); } json = response.getBody(); BackendConnector.log.info("artifacts for " + _g + ":" + _a + " received from backend"); @@ -1637,10 +1642,11 @@ public AffectedLibrary[] getBugAffectedLibraries( BasicHttpRequest request = new BasicHttpRequest( HttpMethod.GET, PathBuilder.affectedLibs(_bugId, _group, _artifact, _version), params); - + final HttpResponse response = request.send(); if (!response.isOk()) { - throw new BackendConnectionException("Got respose " + response.getStatus() + " when communicating with the backend", null); + throw new BackendConnectionException( + "Got respose " + response.getStatus() + " when communicating with the backend", null); } String json = response.getBody(); if (json == null) { From a326de92e8c4a233e16ebb5a682e347f282d0817 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 7 Jun 2022 14:16:12 +0200 Subject: [PATCH 66/83] Substituted string literals by constants in tests --- .../test/java/org/eclipse/steady/kb/ImportTest.java | 7 ++++--- .../steady/kb/task/TestImportAffectedLibraries.java | 11 ++++++----- .../steady/kb/task/TestImportVulnerability.java | 7 ++++--- .../task/TestImportVulnerability_CVE_2017_2617.java | 7 ++++--- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java index a0c29933d..d62aa9a94 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java @@ -20,6 +20,7 @@ import org.eclipse.steady.kb.task.MockBackConnector; import org.eclipse.steady.kb.model.Vulnerability; +import org.eclipse.steady.kb.ImportCommand; import static org.junit.Assert.assertNull; import java.util.HashMap; @@ -38,9 +39,9 @@ public void testImportSkipExistingBug() vuln.setVulnId("CVE-TEST01"); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); - args.put("o", false); - args.put("v", false); - args.put("d", ""); + args.put(ImportCommand.OVERWRITE_OPTION, false); + args.put(ImportCommand.VERBOSE_OPTION, false); + args.put(ImportCommand.DIRECTORY_OPTION, ""); Manager manager = new Manager(); ImportCommand command = new ImportCommand(manager, args, mockBackendConnector); command.run(); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java index 730779824..238bcd0bc 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java @@ -6,6 +6,7 @@ import java.util.List; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.core.util.CoreConfiguration; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.ImportTest; import org.eclipse.steady.kb.model.Artifact; import org.eclipse.steady.kb.model.Vulnerability; @@ -32,8 +33,8 @@ public void testImportAffectedLibs() ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); - args.put("v", false); - args.put("o", false); + args.put(ImportCommand.VERBOSE_OPTION, false); + args.put(ImportCommand.OVERWRITE_OPTION, false); importAffectedLibs.execute(vuln, args, mockBackendConnector); ObjectMapper mapper = new ObjectMapper(); List listAffectedLibUpserted = @@ -57,8 +58,8 @@ public void testImportAffectedLibsOverwrite() ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); - args.put("o", true); - args.put("v", false); + args.put(ImportCommand.OVERWRITE_OPTION, true); + args.put(ImportCommand.VERBOSE_OPTION, false); importAffectedLibs.execute(vuln, args, mockBackendConnector); ObjectMapper mapper = new ObjectMapper(); List listAffectedLibUpserted = @@ -78,7 +79,7 @@ public void testImportAffectedLibsNullData() ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); vuln.setArtifacts(new ArrayList()); HashMap args = new HashMap(); - args.put("o", false); + args.put(ImportCommand.OVERWRITE_OPTION, false); importAffectedLibs.execute(vuln, args, null); } } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java index eeb403b51..61ff8760e 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability.java @@ -8,6 +8,7 @@ import org.apache.commons.io.FileUtils; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.core.util.CoreConfiguration; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.ZipUtil; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.kb.util.ConstructSet; @@ -45,9 +46,9 @@ public void testImportVuln() throws JsonSyntaxException, IOException, BackendCon Vulnerability vuln = Metadata.getVulnerabilityMetadata(destPathToUnzip + REPO); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); - args.put("d", destPathToUnzip + REPO); - args.put("o", false); - args.put("v", false); + args.put(ImportCommand.DIRECTORY_OPTION, destPathToUnzip + REPO); + args.put(ImportCommand.OVERWRITE_OPTION, false); + args.put(ImportCommand.VERBOSE_OPTION, false); ImportVulnerability importVuln = new ImportVulnerability(); importVuln.execute(vuln, args, mockBackendConnector); ObjectMapper mapper = new ObjectMapper(); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java index 6c8ba8ba2..4378a6a2b 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportVulnerability_CVE_2017_2617.java @@ -8,6 +8,7 @@ import org.apache.commons.io.FileUtils; import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.core.util.CoreConfiguration; +import org.eclipse.steady.kb.ImportCommand; import org.eclipse.steady.kb.ZipUtil; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.kb.util.ConstructSet; @@ -45,9 +46,9 @@ public void testImportVuln() throws JsonSyntaxException, IOException, BackendCon Vulnerability vuln = Metadata.getVulnerabilityMetadata(destPathToUnzip + REPO); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); - args.put("d", destPathToUnzip + File.separator + REPO); - args.put("o", false); - args.put("v", false); + args.put(ImportCommand.DIRECTORY_OPTION, destPathToUnzip + File.separator + REPO); + args.put(ImportCommand.OVERWRITE_OPTION, false); + args.put(ImportCommand.VERBOSE_OPTION, false); ImportVulnerability importVuln = new ImportVulnerability(); importVuln.execute(vuln, args, mockBackendConnector); ObjectMapper mapper = new ObjectMapper(); From e3d3381296c4c4ee71df8b16f926d5e292344ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alessandro=20Pezz=C3=A8?= Date: Thu, 9 Jun 2022 12:16:51 +0200 Subject: [PATCH 67/83] feat: upgrade Docker images and fixes digest --- docker/frontend-apps/Dockerfile | 3 ++- docker/frontend-bugs/Dockerfile | 3 ++- docker/kb-importer/Dockerfile | 3 ++- docker/patch-lib-analyzer/Dockerfile | 11 ++++++----- docker/rest-backend/Dockerfile | 11 ++++++----- docker/rest-lib-utils/Dockerfile | 7 ++++--- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/docker/frontend-apps/Dockerfile b/docker/frontend-apps/Dockerfile index 453fb1eaf..af9bdc8a5 100644 --- a/docker/frontend-apps/Dockerfile +++ b/docker/frontend-apps/Dockerfile @@ -1,4 +1,5 @@ -FROM jetty:alpine +# https://hub.docker.com/layers/jetty/library/jetty/9.4.46-jdk11-alpine-eclipse-temurin/images/sha256-dcaab143043b8916675f8533700c07310986e94db9ee4f2f6bf336e8befc53e9?context=explore +FROM jetty@sha256:dcaab143043b8916675f8533700c07310986e94db9ee4f2f6bf336e8befc53e9 LABEL maintainer="steady-dev@eclipse.org" diff --git a/docker/frontend-bugs/Dockerfile b/docker/frontend-bugs/Dockerfile index c99ab5f8d..90812fe0f 100644 --- a/docker/frontend-bugs/Dockerfile +++ b/docker/frontend-bugs/Dockerfile @@ -1,4 +1,5 @@ -FROM jetty:alpine +# https://hub.docker.com/layers/jetty/library/jetty/9.4.46-jdk11-alpine-eclipse-temurin/images/sha256-dcaab143043b8916675f8533700c07310986e94db9ee4f2f6bf336e8befc53e9?context=explore +FROM jetty@sha256:dcaab143043b8916675f8533700c07310986e94db9ee4f2f6bf336e8befc53e9 LABEL maintainer="steady-dev@eclipse.org" diff --git a/docker/kb-importer/Dockerfile b/docker/kb-importer/Dockerfile index b3419954f..25f303ded 100644 --- a/docker/kb-importer/Dockerfile +++ b/docker/kb-importer/Dockerfile @@ -1,4 +1,5 @@ -FROM openjdk:11-jre-slim +# https://hub.docker.com/layers/eclipse-temurin/library/eclipse-temurin/11.0.15_10-jre/images/sha256-1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3?context=explore +FROM eclipse-temurin@sha256:1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3 LABEL maintainer="steady-dev@eclipse.org" diff --git a/docker/patch-lib-analyzer/Dockerfile b/docker/patch-lib-analyzer/Dockerfile index b5198975d..911dd04f0 100644 --- a/docker/patch-lib-analyzer/Dockerfile +++ b/docker/patch-lib-analyzer/Dockerfile @@ -1,4 +1,5 @@ -FROM openjdk:11-jre-slim +# https://hub.docker.com/layers/eclipse-temurin/library/eclipse-temurin/11.0.15_10-jre/images/sha256-1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3?context=explore +FROM eclipse-temurin@sha256:1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3 LABEL maintainer="steady-dev@eclipse.org" @@ -10,9 +11,9 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -COPY patch-lib-analyzer-${VULAS_RELEASE}-jar-with-dependencies.jar /vulas/patch-lib-analyzer.jar -COPY run.sh /vulas/run.sh +COPY patch-lib-analyzer-${VULAS_RELEASE}-jar-with-dependencies.jar /steady/patch-lib-analyzer.jar +COPY run.sh /steady/run.sh -RUN chmod +x /vulas/run.sh +RUN chmod +x /steady/run.sh -CMD ["/vulas/run.sh"] +CMD ["/steady/run.sh"] diff --git a/docker/rest-backend/Dockerfile b/docker/rest-backend/Dockerfile index f1d2e1e9c..0405e4afd 100644 --- a/docker/rest-backend/Dockerfile +++ b/docker/rest-backend/Dockerfile @@ -1,4 +1,5 @@ -FROM openjdk:11-jre-slim +# https://hub.docker.com/layers/eclipse-temurin/library/eclipse-temurin/11.0.15_10-jre/images/sha256-1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3?context=explore +FROM eclipse-temurin@sha256:1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3 LABEL maintainer="steady-dev@eclipse.org" @@ -10,12 +11,12 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -COPY rest-backend-$VULAS_RELEASE.jar /vulas/rest-backend.jar -COPY run.sh /vulas/run.sh +COPY rest-backend-$VULAS_RELEASE.jar /steady/rest-backend.jar +COPY run.sh /steady/run.sh RUN touch /$VULAS_RELEASE EXPOSE 8091 -RUN chmod +x /vulas/run.sh +RUN chmod +x /steady/run.sh -CMD ["/vulas/run.sh"] +CMD ["/steady/run.sh"] diff --git a/docker/rest-lib-utils/Dockerfile b/docker/rest-lib-utils/Dockerfile index e1401ffeb..ffaf9909e 100644 --- a/docker/rest-lib-utils/Dockerfile +++ b/docker/rest-lib-utils/Dockerfile @@ -1,12 +1,13 @@ -FROM openjdk:11-jre-slim +# https://hub.docker.com/layers/eclipse-temurin/library/eclipse-temurin/11.0.15_10-jre/images/sha256-1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3?context=explore +FROM eclipse-temurin@sha256:1543416e05e9fde8ffede76cd5f0955b640d7159bdbff8574eed6560a98e4ad3 LABEL maintainer="steady-dev@eclipse.org" ARG VULAS_RELEASE -COPY rest-lib-utils-${VULAS_RELEASE}.jar /vulas/rest-lib-utils.jar +COPY rest-lib-utils-${VULAS_RELEASE}.jar /steady/rest-lib-utils.jar RUN touch /$VULAS_RELEASE EXPOSE 8092 -CMD java -Dhttp.nonProxyHosts=${NON_PROXY_HOSTS} -Dhttps.nonProxyHosts=${NON_PROXY_HOSTS} -Dhttps.proxyHost=${HTTPS_PROXY_HOST} -Dhttps.proxyPort=${HTTP_PROXY_PORT} -Dhttp.proxyHost=${HTTP_PROXY_HOST} -Dhttp.proxyPort=${HTTP_PROXY_PORT} -jar /vulas/rest-lib-utils.jar +CMD java -Dhttp.nonProxyHosts=${NON_PROXY_HOSTS} -Dhttps.nonProxyHosts=${NON_PROXY_HOSTS} -Dhttps.proxyHost=${HTTPS_PROXY_HOST} -Dhttps.proxyPort=${HTTP_PROXY_PORT} -Dhttp.proxyHost=${HTTP_PROXY_HOST} -Dhttp.proxyPort=${HTTP_PROXY_PORT} -jar /steady/rest-lib-utils.jar From 7f2829b03c4e73c9ab223ae3481e30186653bc09 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 15 Jun 2022 14:22:15 +0200 Subject: [PATCH 68/83] Added TestManager. Keeping failures as Exceptions instead of strings --- .../org/eclipse/steady/kb/ImportCommand.java | 6 +-- .../eclipse/steady/kb/ImporterController.java | 8 +-- .../java/org/eclipse/steady/kb/Manager.java | 47 +++++++++++----- .../steady/kb/task/ExtractOrClone.java | 12 +++-- .../org/eclipse/steady/kb/ImportTest.java | 3 +- .../org/eclipse/steady/kb/TestManager.java | 51 ++++++++++++++++++ .../steady/kb/task/MockBackConnector.java | 14 +++++ .../steady/kb/task/TestExtractOrClone.java | 4 +- .../CVE-2018-1270}/changed-source-code.tar.gz | Bin .../CVE-2018-1270}/statement.yaml | 0 10 files changed, 117 insertions(+), 28 deletions(-) create mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/TestManager.java rename kb-importer/src/test/resources/{testRootDir6 => statements/CVE-2018-1270}/changed-source-code.tar.gz (100%) rename kb-importer/src/test/resources/{testRootDir6 => statements/CVE-2018-1270}/statement.yaml (100%) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index dec020a20..8d6ea4ac4 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -92,7 +92,7 @@ public void run() { } catch (BackendConnectionException e) { log.error("Can't connect to the Backend"); manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_CONNECTION); - manager.addFailure(vulnId, e.toString()); + manager.addFailure(vulnId, e); log.error(e.getMessage()); return; } @@ -154,7 +154,7 @@ public void run() { importVulnerability.execute(vuln, args, backendConnector); } catch (IOException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); - manager.addFailure(vuln.getVulnId(), e.toString()); + manager.addFailure(vuln.getVulnId(), e); log.error(e.getMessage()); return; } @@ -163,7 +163,7 @@ public void run() { importAffectedLibraries.execute(vuln, args, backendConnector); } catch (IOException | MalformedPackageURLException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_LIB); - manager.addFailure(vuln.getVulnId(), e.toString()); + manager.addFailure(vuln.getVulnId(), e); log.error(e.getMessage()); return; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 336fba92e..f8e333d3b 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -33,7 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import org.eclipse.steady.backend.BackendConnector; import org.eclipse.steady.shared.util.VulasConfiguration; /** @@ -56,7 +56,7 @@ public class ImporterController { @Autowired ImporterController() { - this.manager = new Manager(); + this.manager = new Manager(BackendConnector.getInstance()); } @RequestMapping(value = "/start", method = RequestMethod.POST) @@ -91,7 +91,7 @@ public ResponseEntity start( new Runnable() { public void run() { while (true) { - manager.start("/kb-importer/data/statements2", args); + manager.start("/kb-importer/data/statements", args); try { log.info( @@ -157,7 +157,7 @@ public ResponseEntity importSingleVuln( args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); args.put(ImportCommand.VERBOSE_OPTION, verbose); args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); - manager.importSingleVuln("/kb-importer/data/statements2/" + id, args, id); + manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); return new ResponseEntity(true, HttpStatus.OK); } } catch (Exception e) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 80ce15f64..f6ae638f1 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -35,13 +35,15 @@ import java.io.File; import java.io.IOException; +import org.apache.http.conn.HttpHostConnectException; import com.google.gson.Gson; import org.eclipse.steady.shared.util.VulasConfiguration; import org.eclipse.steady.core.util.CoreConfiguration; import org.eclipse.steady.shared.util.DirWithFileSearch; +import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; - +import org.eclipse.steady.shared.util.StopWatch; /** * Creates and executes threads for processing each vulnerability. * Keeps track of the state of each one of them. @@ -51,19 +53,21 @@ public class Manager { private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(); - private ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); - // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + private ThreadPoolExecutor executor; private static Map vulnerabilitiesStatus = new HashMap(); private static Set newVulnerabilities = new LinkedHashSet(); // pairs of vulnId and reason for failure - private static Map failures = new HashMap(); + private static Map failures = new HashMap(); Map repoLocks = new HashMap(); private boolean startIsRunning; + private BackendConnector backendConnector; + private StopWatch stopWatch = null; + public enum VulnStatus { NOT_STARTED, STARTING, @@ -78,6 +82,16 @@ public enum VulnStatus { FAILED_IMPORT_VULN } + public Manager(BackendConnector backendConnector) { + this.backendConnector = backendConnector; + this.createNewExecutor(); + } + + public void createNewExecutor() { + this.executor = // (ThreadPoolExecutor) Executors.newCachedThreadPool(); + (ThreadPoolExecutor) Executors.newFixedThreadPool(8); + } + public void addNewVulnerability(String vulnId) { newVulnerabilities.add(vulnId); } @@ -92,8 +106,8 @@ public VulnStatus getVulnStatus(String vulnId) { } else return null; } - public void addFailure(String vulnId, String reason) { - failures.put(vulnId, reason); + public void addFailure(String vulnId, Exception e) { + failures.put(vulnId, e); } public void lockRepo(String repo) { @@ -118,6 +132,7 @@ public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { this.startIsRunning = true; + this.stopWatch = new StopWatch("Manager started").start(); newVulnerabilities = new LinkedHashSet(); try { @@ -134,7 +149,9 @@ public synchronized void start( List vulnIds = this.identifyVulnerabilitiesToImport(statementsPath); startList(statementsPath, mapCommandOptionValues, vulnIds); retryFailed(statementsPath, mapCommandOptionValues); + this.stopWatch.stop(); this.startIsRunning = false; + log.info("Manager StopWatch Runtime " + Long.toString(this.stopWatch.getRuntime())); } /** @@ -145,8 +162,8 @@ public void retryFailed(String statementsPath, HashMap mapComman List failuresToRetry = new ArrayList(); while (true) { for (String vulnId : failures.keySet()) { - if (failures.get(vulnId).contains("Got error [500]") - || failures.get(vulnId).contains("HttpHostConnectionException")) { + if (failures.get(vulnId) instanceof BackendConnectionException + || failures.get(vulnId) instanceof HttpHostConnectException) { failuresToRetry.add(vulnId); } } @@ -180,10 +197,10 @@ public synchronized void startList( String statementsPath, HashMap mapCommandOptionValues, List vulnIds) { if (this.executor.isShutdown() || this.executor.isTerminated()) { - this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); + this.createNewExecutor(); } - failures = new HashMap(); + failures = new HashMap(); for (String vulnId : vulnIds) { Path vulnDirPath = Paths.get(statementsPath, vulnId); @@ -193,7 +210,7 @@ public synchronized void startList( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); - ImportCommand command = new ImportCommand(this, args, BackendConnector.getInstance()); + ImportCommand command = new ImportCommand(this, args, this.backendConnector); if (mapCommandOptionValues.containsKey(ImportCommand.SEQUENTIAL)) { command.run(); } else { @@ -259,7 +276,7 @@ public void importSingleVuln( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); - ImportCommand command = new ImportCommand(this, args, BackendConnector.getInstance()); + ImportCommand command = new ImportCommand(this, args, this.backendConnector); command.run(); } @@ -278,7 +295,11 @@ public String status() { HashMap statusMap = new HashMap(); statusMap.put("count", statusCount); statusMap.put("new_vulnerabilities", newVulnerabilities); - statusMap.put("failures", failures); + HashMap failureReasons = new HashMap(); + for (String vulnId : failures.keySet()) { + failureReasons.put(vulnId, failures.get(vulnId).toString()); + } + statusMap.put("failures", failureReasons); String statusStr = new Gson().toJson(statusMap); return statusStr; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index c1935407c..04ab3ed30 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -107,7 +107,7 @@ public void extract(File tarFile, String dirPath) { } catch (IOException | InterruptedException e) { String vulnId = dirPath.split(File.separator)[dirPath.split(File.separator).length - 1]; manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); - manager.addFailure(vuln.getVulnId(), e.toString()); + manager.addFailure(vuln.getVulnId(), e); log.error(e.getMessage()); } } @@ -135,7 +135,7 @@ public void clone(Vulnerability vuln, String dirPath) { writeCommitDiff(commitId, repoDirPath, commitDirPath); } catch (IOException | InterruptedException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); - manager.addFailure(vuln.getVulnId(), e.toString()); + manager.addFailure(vuln.getVulnId(), e); log.error(e.getMessage()); break; } @@ -177,7 +177,11 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); manager.addFailure( vuln.getVulnId(), - "Failed to get commit timestamp for repository " + repoUrl + " commit id " + commitId); + new Exception( + "Failed to get commit timestamp for repository " + + repoUrl + + " commit id " + + commitId)); } } @@ -256,7 +260,7 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename log.error(gitCatErrorInput.readLine()); // What to do in case it doesn't work? manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); - manager.addFailure(vuln.getVulnId(), "git cat-file didn't work"); + manager.addFailure(vuln.getVulnId(), new Exception("git cat-file didn't work")); } } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java index d62aa9a94..f40fcec5c 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java @@ -20,7 +20,6 @@ import org.eclipse.steady.kb.task.MockBackConnector; import org.eclipse.steady.kb.model.Vulnerability; -import org.eclipse.steady.kb.ImportCommand; import static org.junit.Assert.assertNull; import java.util.HashMap; @@ -42,7 +41,7 @@ public void testImportSkipExistingBug() args.put(ImportCommand.OVERWRITE_OPTION, false); args.put(ImportCommand.VERBOSE_OPTION, false); args.put(ImportCommand.DIRECTORY_OPTION, ""); - Manager manager = new Manager(); + Manager manager = new Manager(mockBackendConnector); ImportCommand command = new ImportCommand(manager, args, mockBackendConnector); command.run(); assertNull(mockBackendConnector.getUploadJson()); diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/TestManager.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestManager.java new file mode 100644 index 000000000..0684ed3a8 --- /dev/null +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/TestManager.java @@ -0,0 +1,51 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.kb; + +import org.eclipse.steady.kb.task.MockBackConnector; + +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import com.google.gson.JsonSyntaxException; +import org.eclipse.steady.backend.BackendConnectionException; +import org.junit.Test; + +public class TestManager { + + @Test + public void testStartList() throws JsonSyntaxException, IOException, BackendConnectionException { + String statementsPath = Manager.class.getClassLoader().getResource("statements").getPath(); + MockBackConnector mockBackendConnector = new MockBackConnector(); + HashMap args = new HashMap(); + args.put(ImportCommand.OVERWRITE_OPTION, true); + args.put(ImportCommand.VERBOSE_OPTION, false); + args.put(ImportCommand.SKIP_CLONE_OPTION, false); + Manager manager = new Manager(mockBackendConnector); + + List vulnIds = manager.identifyVulnerabilitiesToImport(statementsPath); + manager.startList(statementsPath, args, vulnIds); + + Manager.VulnStatus vulnStatus1 = manager.getVulnStatus("CVE-2018-1270"); + + org.junit.Assert.assertEquals(vulnStatus1, Manager.VulnStatus.IMPORTED); + org.junit.Assert.assertEquals(mockBackendConnector.getUploadedChangeLists().size(), 1); + org.junit.Assert.assertEquals(mockBackendConnector.getUploadedLibraries().size(), 0); + } +} diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java index 231d79769..1dc6fbe70 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/MockBackConnector.java @@ -1,6 +1,8 @@ package org.eclipse.steady.kb.task; import java.util.ArrayList; +import java.util.List; + import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; import org.eclipse.steady.goals.GoalContext; @@ -12,6 +14,8 @@ public class MockBackConnector extends BackendConnector { private String uploadJson; + private List uploadedLibraries = new ArrayList(); + private List uploadedChangeLists = new ArrayList(); @Override public AffectedLibrary[] getBugAffectedLibraries( @@ -62,11 +66,13 @@ public void uploadBugAffectedLibraries( GoalContext _g, String _bugId, String _json, AffectedVersionSource _source) throws BackendConnectionException { uploadJson = _json; + uploadedLibraries.add(_json); } @Override public void uploadChangeList(String _bug, String _json) throws BackendConnectionException { uploadJson = _json; + uploadedChangeLists.add(_json); } @Override @@ -85,4 +91,12 @@ public boolean isBugExisting(String _bug) throws BackendConnectionException { public String getUploadJson() { return uploadJson; } + + public List getUploadedChangeLists() { + return uploadedChangeLists; + } + + public List getUploadedLibraries() { + return uploadedLibraries; + } } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index 835c948f5..fd4afdb13 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -29,7 +29,7 @@ public class TestExtractOrClone { @Before public void initialize() { - this.manager = new Manager(); + this.manager = new Manager(MockBackConnector.getInstance()); classLoader = getClass().getClassLoader(); } @@ -41,7 +41,7 @@ public TestExtractOrClone(String dirName) { @Parameterized.Parameters public static List directories() { - return Arrays.asList(new Object[][] {{"testRootDir6"}, {"testRootDir7"}}); + return Arrays.asList(new Object[][] {{"statements/CVE-2018-1270"}, {"testRootDir7"}}); } @Test diff --git a/kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz b/kb-importer/src/test/resources/statements/CVE-2018-1270/changed-source-code.tar.gz similarity index 100% rename from kb-importer/src/test/resources/testRootDir6/changed-source-code.tar.gz rename to kb-importer/src/test/resources/statements/CVE-2018-1270/changed-source-code.tar.gz diff --git a/kb-importer/src/test/resources/testRootDir6/statement.yaml b/kb-importer/src/test/resources/statements/CVE-2018-1270/statement.yaml similarity index 100% rename from kb-importer/src/test/resources/testRootDir6/statement.yaml rename to kb-importer/src/test/resources/statements/CVE-2018-1270/statement.yaml From 51cafa2732c88626d9e6f6becf71df33e1227d72 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 21 Jun 2022 15:46:33 +0200 Subject: [PATCH 69/83] Added paths to properties. Other small changes --- docker/.env.sample | 2 - docker/kb-importer/start.sh | 6 +-- .../org/eclipse/steady/kb/ImportCommand.java | 4 +- .../eclipse/steady/kb/ImporterController.java | 14 +++++-- .../java/org/eclipse/steady/kb/Manager.java | 39 ++++++++++++++++--- .../resources/steady-kb-importer.properties | 4 ++ ...ImportTest.java => TestImportCommand.java} | 4 +- .../steady/kb/task/TestExtractOrClone.java | 7 ++-- .../kb/task/TestImportAffectedLibraries.java | 8 ++-- 9 files changed, 61 insertions(+), 27 deletions(-) rename kb-importer/src/test/java/org/eclipse/steady/kb/{ImportTest.java => TestImportCommand.java} (94%) diff --git a/docker/.env.sample b/docker/.env.sample index eaf6010ad..59e4dfbe3 100644 --- a/docker/.env.sample +++ b/docker/.env.sample @@ -34,9 +34,7 @@ https_proxy= no_proxy= # kb-importer update cron expression -KB_IMPORTER_CRON_HOUR=0 KB_IMPORTER_STATEMENTS_FOLDER=statements KB_IMPORTER_STATEMENTS_REPO=https://github.com/sap/project-kb KB_IMPORTER_STATEMENTS_BRANCH=vulnerability-data KB_IMPORTER_SKIP_CLONE=True -KB_IMPORTER_CLONE_FOLDER=repo-clones diff --git a/docker/kb-importer/start.sh b/docker/kb-importer/start.sh index 06dd0abbe..c576b87c6 100644 --- a/docker/kb-importer/start.sh +++ b/docker/kb-importer/start.sh @@ -2,9 +2,6 @@ mkdir -p /kb-importer/data cd /kb-importer/data -if [ -d $KB_IMPORTER_CLONE_FOLDER ] && [ ! -z $KB_IMPORTER_CLONE_FOLDER ]; then - mkdir -p $KB_IMPORTER_CLONE_FOLDER -fi if [ -f /kb-importer/kb-importer.jar ]; then mv /kb-importer/kb-importer.jar /kb-importer/kaybee /kb-importer/data fi @@ -17,7 +14,6 @@ echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO echo "Statements branch: " $KB_IMPORTER_STATEMENTS_BRANCH echo "Statements folder: " $KB_IMPORTER_STATEMENTS_FOLDER -echo "Clones folder: " $KB_IMPORTER_CLONE_FOLDER echo "Skip clones: " $KB_IMPORTER_SKIP_CLONE #Adding certs @@ -34,4 +30,4 @@ done #Wait for kb-importer and backend to start sleep 40 -curl localhost:8080/start -X POST +curl localhost:8080/start?skipClone=$KB_IMPORTER_SKIP_CLONE -X POST diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 8d6ea4ac4..0ef2a7ca1 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -69,9 +69,9 @@ public class ImportCommand implements Runnable { Manager manager; public ImportCommand( - Manager manager, HashMap args, BackendConnector backendConnector) { + Manager manager, HashMap args) { this.manager = manager; - this.backendConnector = backendConnector; + this.backendConnector = manager.getBackendConnector(); this.vulnDir = Paths.get((String) args.get(DIRECTORY_OPTION)); this.vulnId = vulnDir.getFileName().toString(); this.args = args; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index f8e333d3b..3c277aeb8 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -29,6 +29,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import java.io.File; import java.util.HashMap; import org.slf4j.Logger; @@ -47,11 +48,18 @@ public class ImporterController { private Thread importerCacheFetch = null; - final long defaultRefetchAllMs = + static final long defaultRefetchAllMs = VulasConfiguration.getGlobal() .getConfiguration() .getLong("vulas.kb-importer.refetchAllMs", -1); + static final String statementsPath = + VulasConfiguration.getGlobal() + .getConfiguration() + .getString("vulas.kb-importer.statementsPath"); + + static final String statementsKaybeePath = ".kaybee/repositories/github.com_sap.project-kb_vulnerability-data/statements"; + private final Manager manager; @Autowired @@ -91,7 +99,7 @@ public ResponseEntity start( new Runnable() { public void run() { while (true) { - manager.start("/kb-importer/data/statements", args); + manager.start(statementsPath, args); try { log.info( @@ -157,7 +165,7 @@ public ResponseEntity importSingleVuln( args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, upload); args.put(ImportCommand.VERBOSE_OPTION, verbose); args.put(ImportCommand.SKIP_CLONE_OPTION, skipClone); - manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); + manager.importSingleVuln(statementsPath + File.separator + id, args, id); return new ResponseEntity(true, HttpStatus.OK); } } catch (Exception e) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index f6ae638f1..7f6f61f9f 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -53,6 +53,17 @@ public class Manager { private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(); + final String kaybeeBinaryPath = + VulasConfiguration.getGlobal() + .getConfiguration() + .getString("vulas.kb-importer.kaybeeBinaryPath"); + + final String kaybeeConfPath = + VulasConfiguration.getGlobal() + .getConfiguration() + .getString("vulas.kb-importer.kaybeeConfPath"); + + private ThreadPoolExecutor executor; private static Map vulnerabilitiesStatus = new HashMap(); @@ -140,6 +151,8 @@ public synchronized void start( kaybeeUpdate(); log.info("Running kaybee pull..."); kaybeePull(); + log.info("Copying statements folder..."); + copyStatements(); } catch (IOException | InterruptedException e) { log.error("Exception while performing update: " + e.getMessage()); this.startIsRunning = false; @@ -210,7 +223,7 @@ public synchronized void startList( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); - ImportCommand command = new ImportCommand(this, args, this.backendConnector); + ImportCommand command = new ImportCommand(this, args); if (mapCommandOptionValues.containsKey(ImportCommand.SEQUENTIAL)) { command.run(); } else { @@ -238,8 +251,7 @@ private void setUploadConfiguration(HashMap args) { } public void kaybeeUpdate() throws IOException, InterruptedException { - // TODO : write directory as option/property - Process updateProcess = Runtime.getRuntime().exec("/kb-importer/data/kaybee update --force"); + Process updateProcess = Runtime.getRuntime().exec(kaybeeBinaryPath + " update --force"); updateProcess.waitFor(); if (updateProcess.exitValue() != 0) { log.error("Failed to update kaybee"); @@ -247,16 +259,27 @@ public void kaybeeUpdate() throws IOException, InterruptedException { } public void kaybeePull() throws IOException, InterruptedException { - // TODO : write directories as option/property + String pullCommand = kaybeeBinaryPath + " pull -c " + kaybeeConfPath; + System.out.println(pullCommand); Process pullProcess = Runtime.getRuntime() - .exec("/kb-importer/data/kaybee pull -c /kb-importer/conf/kaybeeconf.yaml"); + .exec(pullCommand); pullProcess.waitFor(); if (pullProcess.exitValue() != 0) { log.error("Kaybee pull failed"); } } + public void copyStatements() throws IOException, InterruptedException { + Process copyProcess = + Runtime.getRuntime() + .exec("cp " + ImporterController.statementsKaybeePath + " " + ImporterController.statementsPath); + copyProcess.waitFor(); + if (copyProcess.exitValue() != 0) { + log.error("failed to copy statements from .kaybee directory"); + } + } + public void stop() { try { executor.shutdownNow(); @@ -276,7 +299,7 @@ public void importSingleVuln( // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(ImportCommand.DIRECTORY_OPTION, vulnDirStr); - ImportCommand command = new ImportCommand(this, args, this.backendConnector); + ImportCommand command = new ImportCommand(this, args); command.run(); } @@ -303,4 +326,8 @@ public String status() { String statusStr = new Gson().toJson(statusMap); return statusStr; } + + public BackendConnector getBackendConnector() { + return this.backendConnector; + } } diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties index 108b4b0ef..db4831e21 100644 --- a/kb-importer/src/main/resources/steady-kb-importer.properties +++ b/kb-importer/src/main/resources/steady-kb-importer.properties @@ -20,3 +20,7 @@ # 1 day vulas.kb-importer.refetchAllMs = 86400000 + +vulas.kb-importer.kaybeeBinaryPath = /kb-importer/data/kaybee +vulas.kb-importer.kaybeeConfPath = /kb-importer/conf/kaybeeconf.yaml +vulas.kb-importer.statementsPath = /kb-importer/data/statements \ No newline at end of file diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/TestImportCommand.java similarity index 94% rename from kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java rename to kb-importer/src/test/java/org/eclipse/steady/kb/TestImportCommand.java index f40fcec5c..f73df5d9e 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/ImportTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/TestImportCommand.java @@ -29,7 +29,7 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.junit.Test; -public class ImportTest { +public class TestImportCommand { @Test public void testImportSkipExistingBug() @@ -42,7 +42,7 @@ public void testImportSkipExistingBug() args.put(ImportCommand.VERBOSE_OPTION, false); args.put(ImportCommand.DIRECTORY_OPTION, ""); Manager manager = new Manager(mockBackendConnector); - ImportCommand command = new ImportCommand(manager, args, mockBackendConnector); + ImportCommand command = new ImportCommand(manager, args); command.run(); assertNull(mockBackendConnector.getUploadJson()); } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index fd4afdb13..a1c105f7d 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -17,11 +17,14 @@ import org.junit.runners.Parameterized; import org.junit.runner.RunWith; +import org.apache.logging.log4j.Logger; import org.apache.commons.io.FileUtils; @RunWith(Parameterized.class) public class TestExtractOrClone { + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + Manager manager; ClassLoader classLoader; String dirPath; @@ -59,8 +62,6 @@ public void testClone() throws IOException { ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, this.dir, false); extractOrClone.execute(); - File commitDir1 = - new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); File commitDir1before = new File( dirPath @@ -101,7 +102,7 @@ public void cleanup() { try { FileUtils.deleteDirectory(this.dir); } catch (IOException e) { - System.out.println(e.getMessage()); + log.error(e.getMessage()); } } } diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java index 238bcd0bc..b6f97b51f 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestImportAffectedLibraries.java @@ -7,7 +7,7 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.core.util.CoreConfiguration; import org.eclipse.steady.kb.ImportCommand; -import org.eclipse.steady.kb.ImportTest; +import org.eclipse.steady.kb.TestImportCommand; import org.eclipse.steady.kb.model.Artifact; import org.eclipse.steady.kb.model.Vulnerability; import org.eclipse.steady.kb.util.Metadata; @@ -30,7 +30,7 @@ public void testImportAffectedLibs() ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); Vulnerability vuln = Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); + TestImportCommand.class.getClassLoader().getResource("CVE-2011-4343").getPath()); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); args.put(ImportCommand.VERBOSE_OPTION, false); @@ -55,7 +55,7 @@ public void testImportAffectedLibsOverwrite() ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); Vulnerability vuln = Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); + TestImportCommand.class.getClassLoader().getResource("CVE-2011-4343").getPath()); MockBackConnector mockBackendConnector = new MockBackConnector(); HashMap args = new HashMap(); args.put(ImportCommand.OVERWRITE_OPTION, true); @@ -76,7 +76,7 @@ public void testImportAffectedLibsNullData() ImportAffectedLibraries importAffectedLibs = new ImportAffectedLibraries(); Vulnerability vuln = Metadata.getVulnerabilityMetadata( - ImportTest.class.getClassLoader().getResource("CVE-2011-4343").getPath()); + TestImportCommand.class.getClassLoader().getResource("CVE-2011-4343").getPath()); vuln.setArtifacts(new ArrayList()); HashMap args = new HashMap(); args.put(ImportCommand.OVERWRITE_OPTION, false); From d8436f18134c7470d482f03a57f70f1b8498bdc0 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Thu, 28 Jul 2022 21:41:38 +0200 Subject: [PATCH 70/83] Corrected version + relativePath, added flatten-maven-plugin and started to harmonize other parts --- kb-importer/pom.xml | 35 ++++++++++++++++++++++++++++++++++- pom.xml | 10 ++++------ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 14961bbf9..4516e835d 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -16,19 +16,25 @@ 4.0.0 + org.springframework.boot spring-boot-starter-parent 2.6.3 + + org.eclipse.steady kb-importer - 3.2.3-SNAPSHOT + 3.2.5-SNAPSHOT + Knowledge Base Importer + 1.8 + org.springframework.boot @@ -101,6 +107,33 @@ + + + org.codehaus.mojo + flatten-maven-plugin + 1.2.2 + + + flatten + process-resources + + flatten + + + clean + + + + flatten.clean + clean + + clean + + + + + org.springframework.boot spring-boot-maven-plugin diff --git a/pom.xml b/pom.xml index b2d98f331..aac1905c2 100755 --- a/pom.xml +++ b/pom.xml @@ -703,14 +703,12 @@ cyclonedx-maven-plugin 2.6.2 - - package - makeAggregateBom - + + package + makeAggregateBom + - - From 126086890a2d65754c593cc8f07c1b876fa7b4ff Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Thu, 28 Jul 2022 21:52:18 +0200 Subject: [PATCH 71/83] Updated description and properties --- kb-importer/pom.xml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 4516e835d..9766634fd 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -29,10 +29,26 @@ 3.2.5-SNAPSHOT Knowledge Base Importer - + + Imports vulnerabilities from Project KB into Steady's database. + - 1.8 + 8 + true + true + true + + UTF-8 + UTF-8 + + + true + ${skip.install.deploy} + ${skip.install.deploy} + + + 2021-06-22T10:45:00Z From 6c24fa553d25d15c9909ca3faf7d41bbf7bda495 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Thu, 28 Jul 2022 23:59:46 +0200 Subject: [PATCH 72/83] Create CycloneDX BOM for REST services; Fix shell script starting the containerized backend --- docker/rest-backend/run.sh | 2 +- kb-importer/pom.xml | 13 ++++++++++++- rest-backend/pom.xml | 12 ++++++++++++ rest-lib-utils/pom.xml | 12 ++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docker/rest-backend/run.sh b/docker/rest-backend/run.sh index 0ba953a87..64a02b661 100755 --- a/docker/rest-backend/run.sh +++ b/docker/rest-backend/run.sh @@ -20,4 +20,4 @@ java \ -Dvulas.jira.pwd=$JIRA_PASSWORD \ $FLYWAY_OPTS \ -Dspring.profiles.active=docker \ - -jar /vulas/rest-backend.jar + -jar /steady/rest-backend.jar diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index 9766634fd..c8ea9a4c1 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -167,7 +167,18 @@ - + + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + diff --git a/rest-backend/pom.xml b/rest-backend/pom.xml index 151bfc586..bc949b749 100644 --- a/rest-backend/pom.xml +++ b/rest-backend/pom.xml @@ -564,6 +564,18 @@ + + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + diff --git a/rest-lib-utils/pom.xml b/rest-lib-utils/pom.xml index cb3c51b2a..d04c55980 100644 --- a/rest-lib-utils/pom.xml +++ b/rest-lib-utils/pom.xml @@ -513,6 +513,18 @@ + + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + +
    From 59c4fb1af7f1160c7f31b54a69005add6bb88472 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 2 Aug 2022 16:11:43 +0200 Subject: [PATCH 73/83] Added documentation with javadocs --- .../org/eclipse/steady/kb/ImportCommand.java | 29 +++++ .../eclipse/steady/kb/ImporterController.java | 36 ++++++ .../main/java/org/eclipse/steady/kb/Main.java | 8 ++ .../java/org/eclipse/steady/kb/Manager.java | 106 ++++++++++++++++++ .../steady/kb/model/Vulnerability.java | 10 ++ .../steady/kb/task/ExtractOrClone.java | 71 ++++++++++++ .../org/eclipse/steady/kb/util/Metadata.java | 14 +++ 7 files changed, 274 insertions(+) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java index 0ef2a7ca1..cdfb062ee 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImportCommand.java @@ -45,18 +45,30 @@ */ public class ImportCommand implements Runnable { + /** Constant METADATA_JSON="metadata.json" */ public static final String METADATA_JSON = "metadata.json"; + /** Constant STATEMENT_YAML="statement.yaml" */ public static final String STATEMENT_YAML = "statement.yaml"; + /** Constant SOURCE_TAR="changed-source-code.tar.gz" */ public static final String SOURCE_TAR = "changed-source-code.tar.gz"; + /** Constant VERBOSE_OPTION="v" */ public static final String VERBOSE_OPTION = "v"; + /** Constant UPLOAD_CONSTRUCT_OPTION="u" */ public static final String UPLOAD_CONSTRUCT_OPTION = "u"; + /** Constant SKIP_CLONE_OPTION="u" */ public static final String SKIP_CLONE_OPTION = "u"; + /** Constant OVERWRITE_OPTION="o" */ public static final String OVERWRITE_OPTION = "o"; + /** Constant DELETE_OPTION="del" */ public static final String DELETE_OPTION = "del"; + /** Constant DIRECTORY_OPTION="d" */ public static final String DIRECTORY_OPTION = "d"; + /** Constant TIME_REFETCH_ALL_OPTION="t" */ public static final String TIME_REFETCH_ALL_OPTION = "t"; + /** Constant DELETE="del" */ public static final String DELETE = "del"; + /** Constant SEQUENTIAL="seq" */ public static final String SEQUENTIAL = "seq"; private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); @@ -68,6 +80,12 @@ public class ImportCommand implements Runnable { private HashMap args; Manager manager; + /** + *

    Constructor for ImportCommand.

    + * + * @param manager a {@link org.eclipse.steady.kb.Manager} object + * @param args a {@link java.util.HashMap} object + */ public ImportCommand( Manager manager, HashMap args) { this.manager = manager; @@ -78,10 +96,16 @@ public ImportCommand( this.stopWatch = new StopWatch(this.vulnId).start(); } + /** + *

    Getter for the field vulnId.

    + * + * @return a {@link java.lang.String} object + */ public String getVulnId() { return this.vulnId; } + /** {@inheritDoc} */ @Override public void run() { @@ -175,6 +199,11 @@ public void run() { } } + /** + *

    findStatementPath.

    + * + * @return a {@link java.lang.String} object + */ public String findStatementPath() { if (FileUtil.isAccessibleFile(vulnDir + File.separator + STATEMENT_YAML)) { return vulnDir + File.separator + STATEMENT_YAML; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 3c277aeb8..f8931288a 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -67,6 +67,16 @@ public class ImporterController { this.manager = new Manager(BackendConnector.getInstance()); } + /** + *

    start.

    + * + * @param overwrite a boolean + * @param upload a boolean + * @param verbose a boolean + * @param skipClone a boolean + * @param refetchAllMs a {@link java.lang.String} object + * @return a {@link org.springframework.http.ResponseEntity} object + */ @RequestMapping(value = "/start", method = RequestMethod.POST) public ResponseEntity start( @RequestParam(defaultValue = "false") boolean overwrite, @@ -127,6 +137,11 @@ public void run() { } } + /** + *

    stop.

    + * + * @return a {@link org.springframework.http.ResponseEntity} object + */ @RequestMapping(value = "/stop", method = RequestMethod.POST) public ResponseEntity stop() { boolean stopped = false; @@ -147,6 +162,16 @@ public ResponseEntity stop() { } } + /** + *

    importSingleVuln.

    + * + * @param id a {@link java.lang.String} object + * @param overwrite a boolean + * @param upload a boolean + * @param verbose a boolean + * @param skipClone a boolean + * @return a {@link org.springframework.http.ResponseEntity} object + */ @RequestMapping(value = "/start/{id}", method = RequestMethod.POST) public ResponseEntity importSingleVuln( @PathVariable String id, @@ -174,11 +199,22 @@ public ResponseEntity importSingleVuln( } } + /** + *

    status.

    + * + * @return a {@link java.lang.String} object + */ @GetMapping("/status") public String status() { return manager.status(); } + /** + *

    statusSingleVuln.

    + * + * @param id a {@link java.lang.String} object + * @return a {@link java.lang.String} object + */ @GetMapping(value = "/status/{id}") public String statusSingleVuln(@PathVariable String id) { String statusStr = manager.getVulnStatus(id).toString(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java index 3c38f4938..f0bdd50f6 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Main.java @@ -22,9 +22,17 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +/** + *

    Main class.

    + */ @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Main { + /** + *

    main.

    + * + * @param args an array of {@link java.lang.String} objects + */ public static void main(String[] args) { SpringApplication.run(Main.class, args); } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 7f6f61f9f..d676998ac 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -93,34 +93,70 @@ public enum VulnStatus { FAILED_IMPORT_VULN } + /** + *

    Constructor for Manager.

    + * + * @param backendConnector a {@link org.eclipse.steady.backend.BackendConnector} object + */ public Manager(BackendConnector backendConnector) { this.backendConnector = backendConnector; this.createNewExecutor(); } + /** + *

    createNewExecutor.

    + */ public void createNewExecutor() { this.executor = // (ThreadPoolExecutor) Executors.newCachedThreadPool(); (ThreadPoolExecutor) Executors.newFixedThreadPool(8); } + /** + *

    addNewVulnerability.

    + * + * @param vulnId a {@link java.lang.String} object + */ public void addNewVulnerability(String vulnId) { newVulnerabilities.add(vulnId); } + /** + *

    setVulnStatus.

    + * + * @param vulnId a {@link java.lang.String} object + * @param vulnStatus a {@link org.eclipse.steady.kb.Manager.VulnStatus} object + */ public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { vulnerabilitiesStatus.put(vulnId, vulnStatus); } + /** + *

    getVulnStatus.

    + * + * @param vulnId a {@link java.lang.String} object + * @return a {@link org.eclipse.steady.kb.Manager.VulnStatus} object + */ public VulnStatus getVulnStatus(String vulnId) { if (vulnerabilitiesStatus.containsKey(vulnId)) { return vulnerabilitiesStatus.get(vulnId); } else return null; } + /** + *

    addFailure.

    + * + * @param vulnId a {@link java.lang.String} object + * @param e a {@link java.lang.Exception} object + */ public void addFailure(String vulnId, Exception e) { failures.put(vulnId, e); } + /** + *

    lockRepo.

    + * + * @param repo a {@link java.lang.String} object + */ public void lockRepo(String repo) { if (!repoLocks.containsKey(repo)) { repoLocks.put(repo, new ReentrantLock()); @@ -128,6 +164,11 @@ public void lockRepo(String repo) { repoLocks.get(repo).lock(); } + /** + *

    unlockRepo.

    + * + * @param repo a {@link java.lang.String} object + */ public void unlockRepo(String repo) { if (!repoLocks.containsKey(repo)) { return; @@ -135,10 +176,21 @@ public void unlockRepo(String repo) { repoLocks.get(repo).unlock(); } + /** + *

    isRunningStart.

    + * + * @return a boolean + */ public boolean isRunningStart() { return this.startIsRunning; } + /** + *

    start.

    + * + * @param statementsPath a {@link java.lang.String} object + * @param mapCommandOptionValues a {@link java.util.HashMap} object + */ public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { this.startIsRunning = true; @@ -169,6 +221,9 @@ public synchronized void start( /** * Keep retrying vulnerabilities that failed due to the high amount of requests. + * + * @param statementsPath a {@link java.lang.String} object + * @param mapCommandOptionValues a {@link java.util.HashMap} object */ public void retryFailed(String statementsPath, HashMap mapCommandOptionValues) { @@ -190,6 +245,12 @@ public void retryFailed(String statementsPath, HashMap mapComman } } + /** + *

    identifyVulnerabilitiesToImport.

    + * + * @param statementsPath a {@link java.lang.String} object + * @return a {@link java.util.List} object + */ public List identifyVulnerabilitiesToImport(String statementsPath) { File statementsDir = new File(statementsPath); List vulnIds = new ArrayList(); @@ -206,6 +267,13 @@ public List identifyVulnerabilitiesToImport(String statementsPath) { return vulnIds; } + /** + *

    startList.

    + * + * @param statementsPath a {@link java.lang.String} object + * @param mapCommandOptionValues a {@link java.util.HashMap} object + * @param vulnIds a {@link java.util.List} object + */ public synchronized void startList( String statementsPath, HashMap mapCommandOptionValues, List vulnIds) { @@ -250,6 +318,12 @@ private void setUploadConfiguration(HashMap args) { : CoreConfiguration.ConnectType.READ_ONLY.toString())); } + /** + *

    kaybeeUpdate.

    + * + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void kaybeeUpdate() throws IOException, InterruptedException { Process updateProcess = Runtime.getRuntime().exec(kaybeeBinaryPath + " update --force"); updateProcess.waitFor(); @@ -258,6 +332,12 @@ public void kaybeeUpdate() throws IOException, InterruptedException { } } + /** + *

    kaybeePull.

    + * + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void kaybeePull() throws IOException, InterruptedException { String pullCommand = kaybeeBinaryPath + " pull -c " + kaybeeConfPath; System.out.println(pullCommand); @@ -270,6 +350,12 @@ public void kaybeePull() throws IOException, InterruptedException { } } + /** + *

    copyStatements.

    + * + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void copyStatements() throws IOException, InterruptedException { Process copyProcess = Runtime.getRuntime() @@ -280,6 +366,9 @@ public void copyStatements() throws IOException, InterruptedException { } } + /** + *

    stop.

    + */ public void stop() { try { executor.shutdownNow(); @@ -291,6 +380,13 @@ public void stop() { } } + /** + *

    importSingleVuln.

    + * + * @param vulnDirStr a {@link java.lang.String} object + * @param mapCommandOptionValues a {@link java.util.HashMap} object + * @param vulnId a {@link java.lang.String} object + */ public void importSingleVuln( String vulnDirStr, HashMap mapCommandOptionValues, String vulnId) { @@ -303,6 +399,11 @@ public void importSingleVuln( command.run(); } + /** + *

    status.

    + * + * @return a {@link java.lang.String} object + */ public String status() { HashMap statusCount = new HashMap(); for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { @@ -327,6 +428,11 @@ public String status() { return statusStr; } + /** + *

    Getter for the field backendConnector.

    + * + * @return a {@link org.eclipse.steady.backend.BackendConnector} object + */ public BackendConnector getBackendConnector() { return this.backendConnector; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java index 684177f5a..50b77dbab 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java @@ -109,10 +109,20 @@ public void setAliases(List aliases) { this.aliases = aliases; } + /** + *

    Getter for the field commits.

    + * + * @return a {@link java.util.List} object + */ public List getCommits() { return commits; } + /** + *

    Setter for the field commits.

    + * + * @param commits a {@link java.util.List} object + */ public void setCommits(List commits) { this.commits = commits; } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 04ab3ed30..12c71104a 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -52,6 +52,14 @@ public class ExtractOrClone { private final File tarFile; private final boolean skipClone; + /** + *

    Constructor for ExtractOrClone.

    + * + * @param manager a {@link org.eclipse.steady.kb.Manager} object + * @param vuln a {@link org.eclipse.steady.kb.model.Vulnerability} object + * @param dir a {@link java.io.File} object + * @param skipClone a boolean + */ public ExtractOrClone(Manager manager, Vulnerability vuln, File dir, boolean skipClone) { this.manager = manager; this.vuln = vuln; @@ -61,6 +69,9 @@ public ExtractOrClone(Manager manager, Vulnerability vuln, File dir, boolean ski this.skipClone = skipClone; } + /** + *

    execute.

    + */ public void execute() { if (tarFile != null) { @@ -82,12 +93,24 @@ public void execute() { log.info("ExtractOrClone : done (" + dirPath + ")"); } + /** + *

    Getter for the field tarFile.

    + * + * @param dirPath a {@link java.lang.String} object + * @return a {@link java.io.File} object + */ public File getTarFile(String dirPath) { if (FileUtil.isAccessibleFile(dirPath + File.separator + ImportCommand.SOURCE_TAR)) { return new File(dirPath + File.separator + ImportCommand.SOURCE_TAR); } else return null; } + /** + *

    extract.

    + * + * @param tarFile a {@link java.io.File} object + * @param dirPath a {@link java.lang.String} object + */ public void extract(File tarFile, String dirPath) { log.info("Extracting vulnerability " + vulnId); @@ -112,6 +135,12 @@ public void extract(File tarFile, String dirPath) { } } + /** + *

    clone.

    + * + * @param vuln a {@link org.eclipse.steady.kb.model.Vulnerability} object + * @param dirPath a {@link java.lang.String} object + */ public void clone(Vulnerability vuln, String dirPath) { List commits = vuln.getCommits(); @@ -143,6 +172,14 @@ public void clone(Vulnerability vuln, String dirPath) { } } + /** + *

    createAndWriteCommitMetadata.

    + * + * @param commit a {@link org.eclipse.steady.kb.model.Commit} object + * @param repoDirPath a {@link java.lang.String} object + * @param commitDirPath a {@link java.lang.String} object + * @throws java.io.IOException if any. + */ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, String commitDirPath) throws IOException { @@ -193,6 +230,14 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri Metadata.writeCommitMetadata(commitDirPath, commitMetadata); } + /** + *

    cloneOnce.

    + * + * @param repoUrl a {@link java.lang.String} object + * @param repoDirPath a {@link java.lang.String} object + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void cloneOnce(String repoUrl, String repoDirPath) throws IOException, InterruptedException { @@ -206,6 +251,15 @@ public void cloneOnce(String repoUrl, String repoDirPath) } } + /** + *

    writeCommitDiff.

    + * + * @param commitId a {@link java.lang.String} object + * @param repoDirPath a {@link java.lang.String} object + * @param commitDirPath a {@link java.lang.String} object + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void writeCommitDiff(String commitId, String repoDirPath, String commitDirPath) throws IOException, InterruptedException { String gitDiffCommand = @@ -222,6 +276,16 @@ public void writeCommitDiff(String commitId, String repoDirPath, String commitDi } } + /** + *

    execGitDiffFile.

    + * + * @param repoDirPath a {@link java.lang.String} object + * @param commitId a {@link java.lang.String} object + * @param filename a {@link java.lang.String} object + * @param before a boolean + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + */ public void execGitDiffFile(String repoDirPath, String commitId, String filename, boolean before) throws IOException, InterruptedException { @@ -264,6 +328,13 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename } } + /** + *

    writeCmdOutputToFile.

    + * + * @param process a {@link java.lang.Process} object + * @param filepath a {@link java.lang.String} object + * @throws java.io.IOException if any. + */ public void writeCmdOutputToFile(Process process, String filepath) throws IOException { BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java index 1a1e91067..5868967be 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/util/Metadata.java @@ -78,6 +78,13 @@ public static Commit getCommitMetadata(String commitDir) throws JsonSyntaxExcept return metadata; } + /** + *

    writeCommitMetadata.

    + * + * @param commitDir a {@link java.lang.String} object + * @param commitMetadata a {@link java.util.HashMap} object + * @throws java.io.IOException if any. + */ public static void writeCommitMetadata(String commitDir, HashMap commitMetadata) throws IOException { String filePath = commitDir + File.separator + META_PROPERTIES_FILE; @@ -119,6 +126,13 @@ public static Vulnerability getVulnerabilityMetadata(String rootDir) return metadata; } + /** + *

    getFromYaml.

    + * + * @param metadataPathString a {@link java.lang.String} object + * @return a {@link org.eclipse.steady.kb.model.Vulnerability} object + * @throws java.io.IOException if any. + */ public static Vulnerability getFromYaml(String metadataPathString) throws IOException { Path metadataPath = Paths.get(metadataPathString); From a4b766c87e4aea7d1cfd733bd4b22e7f652e5b36 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Tue, 2 Aug 2022 17:01:09 +0200 Subject: [PATCH 74/83] Start thread in constructor of ImporterController --- .../eclipse/steady/kb/ImporterController.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index f8931288a..684f31510 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -65,6 +65,40 @@ public class ImporterController { @Autowired ImporterController() { this.manager = new Manager(BackendConnector.getInstance()); + HashMap args = new HashMap(); + args.put(ImportCommand.OVERWRITE_OPTION, false); + args.put(ImportCommand.UPLOAD_CONSTRUCT_OPTION, false); + args.put(ImportCommand.VERBOSE_OPTION, false); + args.put(ImportCommand.SKIP_CLONE_OPTION, true); + long timeToWait = defaultRefetchAllMs; + + this.importerCacheFetch = + new Thread( + new Runnable() { + public void run() { + while (true) { + manager.start(statementsPath, args); + + try { + log.info( + "Wait " + + Long.toString(timeToWait / 1000) + + " seconds for next execution"); + Thread.sleep(timeToWait); + } catch (InterruptedException e) { + ImporterController.log.error("Interrupted exception: " + e.getMessage()); + } + } + } + }, + "ImporterCacheFetch"); + this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); + try{ + this.importerCacheFetch.start(); + log.info("Importer started"); + } catch (Exception e) { + log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); + } } /** From 727698e601936fd6acf13ed66b24623d26a61043 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:04:00 +0200 Subject: [PATCH 75/83] Changed Docker Compose so that start-steady works in clone and after setup-steady --- docker/cache/{ => conf}/nginx.conf | 0 docker/docker-compose-new.yml | 181 ------------------ docker/docker-compose.yml | 172 ++++++++++------- docker/haproxy/conf/haproxy.cfg | 13 ++ docker/kb-importer/Dockerfile | 9 +- docker/kb-importer/{start.sh => run.sh} | 19 +- docker/patch-lib-analyzer/run.sh | 4 +- .../10-vulas-setup.sh | 0 docker/setup-steady.sh | 20 +- docker/start-steady.sh | 18 +- .../resources/steady-kb-importer.properties | 2 +- 11 files changed, 149 insertions(+), 289 deletions(-) rename docker/cache/{ => conf}/nginx.conf (100%) delete mode 100755 docker/docker-compose-new.yml rename docker/kb-importer/{start.sh => run.sh} (54%) rename docker/postgresql/{docker-entrypoint-initdb.d => conf}/10-vulas-setup.sh (100%) diff --git a/docker/cache/nginx.conf b/docker/cache/conf/nginx.conf similarity index 100% rename from docker/cache/nginx.conf rename to docker/cache/conf/nginx.conf diff --git a/docker/docker-compose-new.yml b/docker/docker-compose-new.yml deleted file mode 100755 index 77810a8d8..000000000 --- a/docker/docker-compose-new.yml +++ /dev/null @@ -1,181 +0,0 @@ -version: '2.4' - -# This Docker Compose application makes use of profiles, available as of Docker -# Compose 1.28. -# -# - Core services: haproxy, rest-backend and postgresql need to always run -# - UI services: frontend-apps, frontend-bugs and cache deliver OpenUI5 Web -# applications for scan results (http://localhost:8033/apps) and -# vulnerabilities (http://localhost:8033/bugs). -# - VDB services: rest-lib-utils, kb-importer and patch-lib-analyzer update -# the vulnerability database and resolve unassessed findings (by comparing -# method bodies obtained from rest-lib-utils) -# -# The different profiles can be started using start-steady.sh or using Docker -# Compose's --profile option, e.g. docker-compose --profile ui up -d --build - -services: - - # Core services - haproxy: - container_name: steady-haproxy - hostname: haproxy - env_file: .env - image: haproxy:2.3-alpine - ports: - - "8033:8080" - - "8034:7070" - volumes: - - "./conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg" - command: ["haproxy", "-f", "/usr/local/etc/haproxy/haproxy.cfg"] - depends_on: - - rest-backend - security_opt: - - no-new-privileges - restart: always - - rest-backend: - container_name: steady-rest-backend - hostname: rest-backend - env_file: - - .env - - ./conf/rest-backend/restbackend.properties - image: eclipse/steady-rest-backend:${VULAS_RELEASE} - expose: - - "8091" - environment: - - DELAY_STARTUP=5 - - vulas.shared.cia.serviceUrl=http://rest-lib-utils:8092/cia - - vulas.shared.cve.serviceUrl=https://services.nvd.nist.gov/rest/json/cve/1.0/ - - spring.datasource.username=${POSTGRES_USER} - - spring.datasource.password=${POSTGRES_PASSWORD} - volumes: - - "./data/rest-backend:/flyway-callbacks" - depends_on: - - postgresql - security_opt: - - no-new-privileges - restart: always - - postgresql: - container_name: steady-postgresql - hostname: postgresql - image: postgres:11-alpine - environment: - - POSTGRES_DB=vulas - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - PGDATA=/var/lib/postgresql/data - ports: - - "8032:5432" - volumes: - - steady-postgres-data:/var/lib/postgresql/data - - ./conf/postgresql:/docker-entrypoint-initdb.d:ro - security_opt: - - no-new-privileges - restart: always - - # UI services - frontend-apps: - container_name: steady-frontend-apps - hostname: frontend-apps - image: eclipse/steady-frontend-apps:${VULAS_RELEASE} - expose: - - "8080" - depends_on: - - rest-backend - - cache - security_opt: - - no-new-privileges - restart: always - profiles: - - ui - - frontend-bugs: - container_name: steady-frontend-bugs - hostname: frontend-bugs - image: eclipse/steady-frontend-bugs:${VULAS_RELEASE} - expose: - - "8080" - depends_on: - - rest-backend - security_opt: - - no-new-privileges - restart: always - profiles: - - ui - - cache: - container_name: steady-cache - hostname: cache - image: nginx:alpine - expose: - - "80" - volumes: - - ./conf/cache/nginx.conf:/etc/nginx/nginx.conf:ro - - ./data/cache/:/tmp/cache_all/ - security_opt: - - no-new-privileges - restart: always - profiles: - - ui - - # VDB services - patch-lib-analyzer: - container_name: steady-patch-lib-analyzer - hostname: patch-lib-analyzer - image: eclipse/steady-patch-lib-analyzer:${VULAS_RELEASE} - expose: - - "8080" - volumes: - - "./data/patch-lib-analyzer:/patcheval-data" - depends_on: - - rest-backend - - rest-lib-utils - environment: - - PATCHEVAL_OPTS=-bug "" -folder /patcheval-data -j -h 0 -p 6 - - vulas.shared.cia.serviceUrl=http://rest-lib-utils:8092/cia - - vulas.shared.backend.serviceUrl=http://rest-backend:8091/backend - - vulas.patchEval.onlyAddNewResults=true - security_opt: - - no-new-privileges - restart: always - profiles: - - vdb - - rest-lib-utils: - container_name: steady-rest-lib-utils - hostname: rest-lib-utils - image: eclipse/steady-rest-lib-utils:${VULAS_RELEASE} - expose: - - "8092" - volumes: - - "./data/rest-lib-utils:/root/" - security_opt: - - no-new-privileges - restart: always - profiles: - - vdb - - kb-importer: - container_name: steady-kb-importer - image: eclipse/steady-kb-importer:${VULAS_RELEASE} - env_file: .env - volumes: - - "./conf/kb-importer:/kb-importer/conf" - - "./certs:/kb-importer/certs" - - "./data/kb-importer:/kb-importer/data:delegated" - environment: - - CIA_SERVICE_URL=http://rest-lib-utils:8092/cia - - BACKEND_SERVICE_URL=http://rest-backend:8091/backend - depends_on: - - rest-backend - - rest-lib-utils - security_opt: - - no-new-privileges - restart: always - profiles: - - vdb - -volumes: - steady-postgres-data: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8296aa874..6e024b221 100755 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,26 +1,22 @@ version: '2.4' -services: - frontend-apps: - container_name: steady-frontend-apps - hostname: frontend-apps - image: eclipse/steady-frontend-apps:${VULAS_RELEASE} - expose: - - "8080" - security_opt: - - no-new-privileges - restart: always +# This Docker Compose application makes use of profiles, available as of Docker +# Compose 1.28. +# +# - Core services: haproxy, rest-backend and postgresql need to always run +# - UI services: frontend-apps, frontend-bugs and cache deliver OpenUI5 Web +# applications for scan results (http://localhost:8033/apps) and +# vulnerabilities (http://localhost:8033/bugs). +# - VDB services: rest-lib-utils, kb-importer and patch-lib-analyzer update +# the vulnerability database and resolve unassessed findings (by comparing +# method bodies obtained from rest-lib-utils) +# +# The different profiles can be started using start-steady.sh or using Docker +# Compose's --profile option, e.g. docker-compose --profile ui up -d --build - frontend-bugs: - container_name: steady-frontend-bugs - hostname: frontend-bugs - image: eclipse/steady-frontend-bugs:${VULAS_RELEASE} - expose: - - "8080" - security_opt: - - no-new-privileges - restart: always +services: + # Core services haproxy: container_name: steady-haproxy hostname: haproxy @@ -33,32 +29,30 @@ services: - "./haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg" command: ["haproxy", "-f", "/usr/local/etc/haproxy/haproxy.cfg"] depends_on: - - frontend-apps - - frontend-bugs - rest-backend - - rest-lib-utils security_opt: - no-new-privileges restart: always - patch-lib-analyzer: - container_name: steady-patch-lib-analyzer - hostname: patch-lib-analyzer - image: eclipse/steady-patch-lib-analyzer:${VULAS_RELEASE} + rest-backend: + container_name: steady-rest-backend + hostname: rest-backend + env_file: + - .env + - ./rest-backend/conf/restbackend.properties + image: eclipse/steady-rest-backend:${VULAS_RELEASE} expose: - - "8080" + - "8091" + environment: + - DELAY_STARTUP=5 + - vulas.shared.cia.serviceUrl=http://rest-lib-utils:8092/cia + - vulas.shared.cve.serviceUrl=https://services.nvd.nist.gov/rest/json/cve/1.0/ + - spring.datasource.username=${POSTGRES_USER} + - spring.datasource.password=${POSTGRES_PASSWORD} volumes: - - "./data/patcheval:/patcheval-data" - links: - - rest-backend:backend - - rest-lib-utils:cia + - "./rest-backend/data:/flyway-callbacks" depends_on: - - rest-backend - environment: - - PATCHEVAL_OPTS=-bug "" -folder /patcheval-data -j -h 0 -p 6 - - vulas.shared.cia.serviceUrl=http://cia:8092/cia - - vulas.shared.backend.serviceUrl=http://backend:8091/backend - - vulas.patchEval.onlyAddNewResults=true + - postgresql security_opt: - no-new-privileges restart: always @@ -76,48 +70,39 @@ services: - "8032:5432" volumes: - steady-postgres-data:/var/lib/postgresql/data - - ./postgresql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro + - ./postgresql/conf:/docker-entrypoint-initdb.d:ro security_opt: - no-new-privileges restart: always - rest-backend: - container_name: steady-rest-backend - hostname: rest-backend - env_file: - - .env - - ./rest-backend/conf/restbackend.properties - image: eclipse/steady-rest-backend:${VULAS_RELEASE} + # UI services + frontend-apps: + container_name: steady-frontend-apps + hostname: frontend-apps + image: eclipse/steady-frontend-apps:${VULAS_RELEASE} expose: - - "8091" - environment: - - DELAY_STARTUP=5 - - vulas.shared.cia.serviceUrl=http://cia:8092/cia - - vulas.shared.cve.serviceUrl=https://services.nvd.nist.gov/rest/json/cve/1.0/ - - spring.datasource.username=${POSTGRES_USER} - - spring.datasource.password=${POSTGRES_PASSWORD} - links: - - postgresql:postgresql - - rest-lib-utils:cia - volumes: - - "./data/db-dump/flyway-callbacks:/flyway-callbacks" + - "8080" depends_on: - - postgresql + - rest-backend security_opt: - no-new-privileges restart: always + profiles: + - ui - rest-lib-utils: - container_name: steady-rest-lib-utils - hostname: rest-lib-utils - image: eclipse/steady-rest-lib-utils:${VULAS_RELEASE} + frontend-bugs: + container_name: steady-frontend-bugs + hostname: frontend-bugs + image: eclipse/steady-frontend-bugs:${VULAS_RELEASE} expose: - - "8092" - volumes: - - "./data/rest-lib-utils:/root/" + - "8080" + depends_on: + - rest-backend security_opt: - no-new-privileges restart: always + profiles: + - ui cache: container_name: steady-cache @@ -126,31 +111,72 @@ services: expose: - "80" volumes: - - ./cache/nginx.conf:/etc/nginx/nginx.conf:ro - - ./data/cache/:/tmp/cache_all/ + - ./cache/conf/nginx.conf:/etc/nginx/nginx.conf:ro + - ./cache/data/:/tmp/cache_all/ + security_opt: + - no-new-privileges + restart: always + profiles: + - ui + + # VDB services + patch-lib-analyzer: + container_name: steady-patch-lib-analyzer + hostname: patch-lib-analyzer + image: eclipse/steady-patch-lib-analyzer:${VULAS_RELEASE} + expose: + - "8080" + volumes: + - "./patch-lib-analyzer/data:/patcheval-data" + depends_on: + - rest-backend + - rest-lib-utils + environment: + - PATCHEVAL_OPTS=-bug "" -folder /patcheval-data -j -h 0 -p 6 + - vulas.shared.cia.serviceUrl=http://rest-lib-utils:8092/cia + - vulas.shared.backend.serviceUrl=http://rest-backend:8091/backend + - vulas.patchEval.onlyAddNewResults=true security_opt: - no-new-privileges restart: always + profiles: + - vdb + + rest-lib-utils: + container_name: steady-rest-lib-utils + hostname: rest-lib-utils + image: eclipse/steady-rest-lib-utils:${VULAS_RELEASE} + expose: + - "8092" + volumes: + - "./rest-lib-utils/data:/root/" + security_opt: + - no-new-privileges + restart: always + profiles: + - vdb kb-importer: container_name: steady-kb-importer image: eclipse/steady-kb-importer:${VULAS_RELEASE} + expose: + - "8080" env_file: .env volumes: - "./kb-importer/conf:/kb-importer/conf" - - "./kb-importer/certs:/kb-importer/certs" + - "./certs:/kb-importer/certs" - "./kb-importer/data:/kb-importer/data:delegated" environment: - - CIA_SERVICE_URL=http://cia:8092/cia - - BACKEND_SERVICE_URL=http://backend:8091/backend + - CIA_SERVICE_URL=http://rest-lib-utils:8092/cia + - BACKEND_SERVICE_URL=http://rest-backend:8091/backend depends_on: - rest-backend - links: - - rest-backend:backend - - rest-lib-utils:cia + - rest-lib-utils security_opt: - no-new-privileges restart: always + profiles: + - vdb volumes: steady-postgres-data: diff --git a/docker/haproxy/conf/haproxy.cfg b/docker/haproxy/conf/haproxy.cfg index 014c282a1..d2ad98454 100644 --- a/docker/haproxy/conf/haproxy.cfg +++ b/docker/haproxy/conf/haproxy.cfg @@ -40,6 +40,7 @@ frontend http-in acl is_backend path_beg -i /backend acl is_cia path_beg -i /cia + acl is_kb_importer path_beg -i /kb-importer acl is_bugs_admin path_beg -i /bugs acl is_frontend path_beg -i /apps acl to_be_cached_long_term urlp_reg(lastChange) ^[0-9]{13}$ @@ -48,6 +49,7 @@ frontend http-in use_backend cache-long-term-nodes if to_be_cached_long_term cache_long_term_available use_backend rest-backend-nodes if is_backend use_backend rest-lib-utils-nodes if is_cia + use_backend kb-importer-nodes if is_kb_importer use_backend frontend-bugs-nodes if is_bugs_admin use_backend frontend-apps-nodes if is_frontend @@ -72,6 +74,17 @@ backend rest-lib-utils-nodes stats enable server rest-lib-utils rest-lib-utils:8092 check resolvers docker_resolver resolve-prefer ipv4 +backend kb-importer-nodes + mode http + log global + balance roundrobin + option forwardfor + http-request set-header X-Forwarded-Port %[dst_port] + option httpchk GET /kb-importer/ HTTP/1.1\r\nHost:\ haproxy01 + http-check expect ! rstatus ^5 + stats enable + server kb-importer kb-importer:8080 check resolvers docker_resolver resolve-prefer ipv4 + backend rest-backend-nodes mode http log global diff --git a/docker/kb-importer/Dockerfile b/docker/kb-importer/Dockerfile index 30601a37b..9fb78174b 100644 --- a/docker/kb-importer/Dockerfile +++ b/docker/kb-importer/Dockerfile @@ -7,7 +7,7 @@ ARG VULAS_RELEASE RUN apt-get update \ && apt-get install -y --no-install-recommends \ - openssl wget tar git cron bash gettext curl\ + openssl wget tar git cron bash gettext curl \ && rm -rf /var/lib/apt/lists/* \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false @@ -19,10 +19,9 @@ RUN chmod +x kaybee COPY kb-importer-$VULAS_RELEASE.jar kb-importer.jar RUN chmod +x kb-importer.jar -COPY start.sh /kb-importer/ +COPY run.sh /kb-importer/ +RUN chmod +x /kb-importer/run.sh EXPOSE 8080 -RUN chmod +x /kb-importer/start.sh - -ENTRYPOINT ["sh","/kb-importer/start.sh"] +ENTRYPOINT ["sh","/kb-importer/run.sh"] diff --git a/docker/kb-importer/start.sh b/docker/kb-importer/run.sh similarity index 54% rename from docker/kb-importer/start.sh rename to docker/kb-importer/run.sh index c576b87c6..3481d65b5 100644 --- a/docker/kb-importer/start.sh +++ b/docker/kb-importer/run.sh @@ -6,8 +6,8 @@ if [ -f /kb-importer/kb-importer.jar ]; then mv /kb-importer/kb-importer.jar /kb-importer/kaybee /kb-importer/data fi -#substitute env variables used by kaybee in kaybeeconf.yaml -sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" ../conf/kaybeeconf.yaml.sample > ../conf/kaybeeconf.yaml +# Substitute env variables used by kaybee in kaybeeconf.yaml +sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" ../conf/kaybeeconf.yaml.sample > ../conf/kaybeeconf.yaml sed -i "s|KB_IMPORTER_STATEMENTS_BRANCH|$KB_IMPORTER_STATEMENTS_BRANCH|g" ../conf/kaybeeconf.yaml echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO @@ -16,18 +16,13 @@ echo "Statements branch: " $KB_IMPORTER_STATEMENTS_BRANCH echo "Statements folder: " $KB_IMPORTER_STATEMENTS_FOLDER echo "Skip clones: " $KB_IMPORTER_SKIP_CLONE -#Adding certs +# Adding certs certs=`ls /kb-importer/certs | grep -v readme.txt` for cert in $certs; do keytool -import -alias $cert -storepass changeit -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file /kb-importer/certs/$cert -noprompt done -(java -Dvulas.shared.backend.header.X-Vulas-Client-Token=$BACKEND_BUGS_TOKEN \ - -Dvulas.shared.cia.serviceUrl=$CIA_SERVICE_URL \ - -Dvulas.shared.backend.serviceUrl=$BACKEND_SERVICE_URL \ - -jar /kb-importer/data/kb-importer.jar | tee analyzer_logs.txt ) & - -#Wait for kb-importer and backend to start -sleep 40 - -curl localhost:8080/start?skipClone=$KB_IMPORTER_SKIP_CLONE -X POST +java -Dvulas.shared.backend.header.X-Vulas-Client-Token=$BACKEND_BUGS_TOKEN \ + -Dvulas.shared.cia.serviceUrl=$CIA_SERVICE_URL \ + -Dvulas.shared.backend.serviceUrl=$BACKEND_SERVICE_URL \ + -jar /kb-importer/data/kb-importer.jar | tee analyzer_logs.txt diff --git a/docker/patch-lib-analyzer/run.sh b/docker/patch-lib-analyzer/run.sh index d40cb4fca..015c61e77 100755 --- a/docker/patch-lib-analyzer/run.sh +++ b/docker/patch-lib-analyzer/run.sh @@ -1,6 +1,6 @@ #!/bin/bash -#Wait for backend to start and kb-importer to insert data +# Wait for backend to start and kb-importer to insert data sleep 300 java \ @@ -10,4 +10,4 @@ java \ -Dhttps.proxyHost=$HTTPS_PROXY_HOST \ -Dhttps.proxyPort=$HTTPS_PROXY_PORT \ -Dspring.profiles.active=docker \ - -jar /vulas/patch-lib-analyzer.jar $PATCHEVAL_OPTS + -jar /steady/patch-lib-analyzer.jar $PATCHEVAL_OPTS diff --git a/docker/postgresql/docker-entrypoint-initdb.d/10-vulas-setup.sh b/docker/postgresql/conf/10-vulas-setup.sh similarity index 100% rename from docker/postgresql/docker-entrypoint-initdb.d/10-vulas-setup.sh rename to docker/postgresql/conf/10-vulas-setup.sh diff --git a/docker/setup-steady.sh b/docker/setup-steady.sh index c661f2e22..1fb7bf5f6 100755 --- a/docker/setup-steady.sh +++ b/docker/setup-steady.sh @@ -48,23 +48,23 @@ setup (){ # Create directories #mkdir -p $DIR/certs for s in $conf_services; do - mkdir -p $DIR/conf/$s + mkdir -p $DIR/$s/conf done for s in $data_services; do - mkdir -p $DIR/data/$s + mkdir -p $DIR/$s/data done # Download all necessary files - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/docker-compose-new.yml -o ./$DIR/docker-compose.yml - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/.env.sample -o ./$DIR/.env - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/start-steady.sh -o ./$DIR/start-steady.sh + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/docker-compose.yml -o ./$DIR/docker-compose.yml + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/.env.sample -o ./$DIR/.env + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/start-steady.sh -o ./$DIR/start-steady.sh chmod 744 ./$DIR/start-steady.sh - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/haproxy/conf/haproxy.cfg -o ./$DIR/conf/haproxy/haproxy.cfg - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/postgresql/docker-entrypoint-initdb.d/10-vulas-setup.sh -o ./$DIR/conf/postgresql/10-vulas-setup.sh - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/cache/nginx.conf -o ./$DIR/conf/cache/nginx.conf - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/kb-importer/conf/kaybeeconf.yaml.sample -o ./$DIR/conf/kb-importer/kaybeeconf.yaml.sample - curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/rest-backend/conf/restbackend.properties -o ./$DIR/conf/rest-backend/restbackend.properties + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/haproxy/conf/haproxy.cfg -o ./$DIR/haproxy/conf/haproxy.cfg + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/postgresql/conf/10-vulas-setup.sh -o ./$DIR/postgresql/conf/10-vulas-setup.sh + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/cache/conf/nginx.conf -o ./$DIR/cache/conf/nginx.conf + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/kb-importer/conf/kaybeeconf.yaml.sample -o ./$DIR/kb-importer/conf/kaybeeconf.yaml.sample + curl -s https://raw.githubusercontent.com/eclipse/steady/$TAG/docker/rest-backend/conf/restbackend.properties -o ./$DIR/rest-backend/conf/restbackend.properties # Create default configuration in user's home directory home_config="$HOME/.steady.properties" diff --git a/docker/start-steady.sh b/docker/start-steady.sh index 0c23bdbc6..80f7769df 100755 --- a/docker/start-steady.sh +++ b/docker/start-steady.sh @@ -96,10 +96,18 @@ if [[ $rc == 0 ]]; then exit 1 fi +# If run from the cloned repo, the file docker-compose.build.yaml can be used to +# create new Docker images for snapshot versions. When run after +# steady-setup.sh, the images will be downloaded from Docker Hub. +build="" +if [[ -f docker-compose.build.yml ]]; then + build="-f docker-compose.build.yml" +fi + # Start different sets of services case $SERVICES in none) - docker-compose -f ./docker-compose.yml stop + docker-compose -f ./docker-compose.yml $build stop rc=$? if [[ $rc == 0 ]]; then printf "Stopped all of Steady's Docker Compose services\n" @@ -111,7 +119,7 @@ case $SERVICES in core) stop_ui stop_vdb - docker-compose -f ./docker-compose.yml up -d --build + docker-compose -f ./docker-compose.yml $build up -d --build rc=$? if [[ $rc == 0 ]]; then printf "Started Steady's core Docker Compose services\n" @@ -122,7 +130,7 @@ case $SERVICES in ;; ui) stop_vdb - docker-compose -f ./docker-compose.yml --profile ui up -d --build + docker-compose -f ./docker-compose.yml $build --profile ui up -d --build rc=$? if [[ $rc == 0 ]]; then printf "Started Steady's core and UI Docker Compose services\n" @@ -133,7 +141,7 @@ case $SERVICES in ;; vdb) stop_ui - docker-compose -f ./docker-compose.yml --profile vdb up -d --build + docker-compose -f ./docker-compose.yml $build --profile vdb up -d --build rc=$? if [[ $rc == 0 ]]; then printf "Started Steady's core and vdb Docker Compose services\n" @@ -143,7 +151,7 @@ case $SERVICES in fi ;; all) - docker-compose -f ./docker-compose.yml --profile ui --profile vdb up -d --build + docker-compose -f ./docker-compose.yml $build --profile ui --profile vdb up -d --build rc=$? if [[ $rc == 0 ]]; then printf "Started all of Steady's Docker Compose services\n" diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties index db4831e21..f3598e96b 100644 --- a/kb-importer/src/main/resources/steady-kb-importer.properties +++ b/kb-importer/src/main/resources/steady-kb-importer.properties @@ -22,5 +22,5 @@ vulas.kb-importer.refetchAllMs = 86400000 vulas.kb-importer.kaybeeBinaryPath = /kb-importer/data/kaybee -vulas.kb-importer.kaybeeConfPath = /kb-importer/conf/kaybeeconf.yaml +vulas.kb-importer.kaybeeConfPath = ../conf/kaybeeconf.yaml vulas.kb-importer.statementsPath = /kb-importer/data/statements \ No newline at end of file From 2e966d9a9e91d897af62a1e6acae79ebb7abd137 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:06:52 +0200 Subject: [PATCH 76/83] Commented lang-python out --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aac1905c2..c5ef2e723 100755 --- a/pom.xml +++ b/pom.xml @@ -152,7 +152,7 @@ lang-java-reach lang-java-reach-wala lang-java-reach-soot - lang-python + repo-client From 29636dfe636a5eccd9f23a9fe4b6954e1ed9eb31 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Wed, 3 Aug 2022 18:16:29 +0200 Subject: [PATCH 77/83] Avoid mv of binaries into data folder --- docker/kb-importer/run.sh | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/docker/kb-importer/run.sh b/docker/kb-importer/run.sh index 3481d65b5..d59753f85 100644 --- a/docker/kb-importer/run.sh +++ b/docker/kb-importer/run.sh @@ -1,28 +1,26 @@ #!/bin/bash -mkdir -p /kb-importer/data -cd /kb-importer/data -if [ -f /kb-importer/kb-importer.jar ]; then - mv /kb-importer/kb-importer.jar /kb-importer/kaybee /kb-importer/data -fi +# Home directory of kb-importer +home="/kb-importer" -# Substitute env variables used by kaybee in kaybeeconf.yaml -sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" ../conf/kaybeeconf.yaml.sample > ../conf/kaybeeconf.yaml -sed -i "s|KB_IMPORTER_STATEMENTS_BRANCH|$KB_IMPORTER_STATEMENTS_BRANCH|g" ../conf/kaybeeconf.yaml +mkdir -p $home/data echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO - echo "Statements branch: " $KB_IMPORTER_STATEMENTS_BRANCH echo "Statements folder: " $KB_IMPORTER_STATEMENTS_FOLDER echo "Skip clones: " $KB_IMPORTER_SKIP_CLONE +# Substitute env variables used by kaybee in kaybeeconf.yaml +sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" $home/conf/kaybeeconf.yaml.sample > $home/conf/kaybeeconf.yaml +sed -i "s|KB_IMPORTER_STATEMENTS_BRANCH|$KB_IMPORTER_STATEMENTS_BRANCH|g" $home/conf/kaybeeconf.yaml + # Adding certs -certs=`ls /kb-importer/certs | grep -v readme.txt` +certs=`ls $home/certs | grep -v readme.txt` for cert in $certs; do - keytool -import -alias $cert -storepass changeit -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file /kb-importer/certs/$cert -noprompt + keytool -import -alias $cert -storepass changeit -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file $home/certs/$cert -noprompt done java -Dvulas.shared.backend.header.X-Vulas-Client-Token=$BACKEND_BUGS_TOKEN \ -Dvulas.shared.cia.serviceUrl=$CIA_SERVICE_URL \ -Dvulas.shared.backend.serviceUrl=$BACKEND_SERVICE_URL \ - -jar /kb-importer/data/kb-importer.jar | tee analyzer_logs.txt + -jar $home/kb-importer.jar | tee $home/data/analyzer_logs.txt From b33c7279c279175e9e93d237f7d698ea60a1b9d8 Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 10 Aug 2022 15:40:18 +0200 Subject: [PATCH 78/83] Using ProcessWrapper in kb-importer Manager --- .../java/org/eclipse/steady/kb/Manager.java | 40 ++-- .../steady/shared/util/ProcessWrapper.java | 211 ++++++++++++++++++ .../shared/util/ProcessWrapperException.java | 46 ++++ 3 files changed, 281 insertions(+), 16 deletions(-) create mode 100755 shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java create mode 100644 shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapperException.java diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index d676998ac..d78090841 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -44,6 +44,8 @@ import org.eclipse.steady.backend.BackendConnectionException; import org.eclipse.steady.backend.BackendConnector; import org.eclipse.steady.shared.util.StopWatch; +import org.eclipse.steady.shared.util.ProcessWrapper; +import org.eclipse.steady.shared.util.ProcessWrapperException; /** * Creates and executes threads for processing each vulnerability. * Keeps track of the state of each one of them. @@ -325,10 +327,14 @@ private void setUploadConfiguration(HashMap args) { * @throws java.lang.InterruptedException if any. */ public void kaybeeUpdate() throws IOException, InterruptedException { - Process updateProcess = Runtime.getRuntime().exec(kaybeeBinaryPath + " update --force"); - updateProcess.waitFor(); - if (updateProcess.exitValue() != 0) { + try { + ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get(kaybeeBinaryPath), "update", "--force").setPath(Paths.get("/kb-importer/data")); + Thread t = new Thread(pw, "pip"); + t.start(); + t.join(); + } catch (ProcessWrapperException e) { log.error("Failed to update kaybee"); + log.error(e.getMessage()); } } @@ -339,14 +345,14 @@ public void kaybeeUpdate() throws IOException, InterruptedException { * @throws java.lang.InterruptedException if any. */ public void kaybeePull() throws IOException, InterruptedException { - String pullCommand = kaybeeBinaryPath + " pull -c " + kaybeeConfPath; - System.out.println(pullCommand); - Process pullProcess = - Runtime.getRuntime() - .exec(pullCommand); - pullProcess.waitFor(); - if (pullProcess.exitValue() != 0) { + try { + ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get(kaybeeBinaryPath), "pull", "-c", kaybeeConfPath).setPath(Paths.get("/kb-importer/data")); + Thread t = new Thread(pw, "pip"); + t.start(); + t.join(); + } catch (ProcessWrapperException e) { log.error("Kaybee pull failed"); + log.error(e.getMessage()); } } @@ -357,12 +363,14 @@ public void kaybeePull() throws IOException, InterruptedException { * @throws java.lang.InterruptedException if any. */ public void copyStatements() throws IOException, InterruptedException { - Process copyProcess = - Runtime.getRuntime() - .exec("cp " + ImporterController.statementsKaybeePath + " " + ImporterController.statementsPath); - copyProcess.waitFor(); - if (copyProcess.exitValue() != 0) { - log.error("failed to copy statements from .kaybee directory"); + try { + ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get("cp"), "-r", ImporterController.statementsKaybeePath, ImporterController.statementsPath).setPath(Paths.get("/kb-importer/data")); + Thread t = new Thread(pw, "pip"); + t.start(); + t.join(); + } catch (ProcessWrapperException e) { + log.error("Failed to copy statements from .kaybee directory"); + log.error(e.getMessage()); } } diff --git a/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java new file mode 100755 index 000000000..c914b0e4c --- /dev/null +++ b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java @@ -0,0 +1,211 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.shared.util; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.Logger; +import org.eclipse.steady.shared.util.FileUtil; +import org.eclipse.steady.shared.util.StringUtil; + +/** + *

    ProcessWrapper class.

    + */ +public class ProcessWrapper implements Runnable { + + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(); + + private static final Pattern ALLOWED = Pattern.compile("[\\.\\-\\w=]+"); + + private String id = null; + + private Path exe = null; + + private String[] args = null; + + private Path outPath = null; + + private Path outFile = null; + + private Path errFile; + + private int exitCode = -1; + + /** + *

    Constructor for ProcessWrapper.

    + */ + public ProcessWrapper() { + this.id = StringUtil.getRandonString(10); + } + + /** + *

    Constructor for ProcessWrapper.

    + * + * @param _id a {@link java.lang.String} object. + */ + public ProcessWrapper(String _id) { + this.id = _id; + } + + /** + *

    Getter for the field id.

    + * + * @return a {@link java.lang.String} object. + */ + public String getId() { + return this.id; + } + + /** + *

    setCommand.

    + * + * @param _executable a {@link java.nio.file.Path} object. + * @param _args a {@link java.lang.String} object. + * @return a {@link org.eclipse.steady.python.ProcessWrapper} object. + * @throws org.eclipse.steady.python.ProcessWrapperException if any. + */ + public ProcessWrapper setCommand(Path _executable, String... _args) + throws ProcessWrapperException { + // if(_executable==null || FileUtil.isAccessibleFile(_executable)) + // throw new ProcessWrapperException("Illegal executable [" + _executable + "]"); + + for (int i = 0; i < _args.length; i++) { + final Matcher m = ALLOWED.matcher(_args[i]); + if (!m.matches() + && !FileUtil.isAccessibleFile(_args[i]) + && !FileUtil.isAccessibleDirectory(_args[i])) + throw new ProcessWrapperException( + "Illegal characters in argument [" + i + "], allowed are: a-zA-Z_0-9-.="); + } + + this.exe = _executable; + this.args = _args; + return this; + } + + /** + *

    setPath.

    + * + * @param _p a {@link java.nio.file.Path} object. + * @return a {@link org.eclipse.steady.python.ProcessWrapper} object. + */ + public ProcessWrapper setPath(Path _p) { + this.outPath = _p; + return this; + } + + /** {@inheritDoc} */ + @Override + public void run() { + String name = null; + if (FileUtil.isAccessibleFile(this.exe)) name = this.exe.getFileName().toString(); + else if (this.exe.toString().indexOf(System.getProperty("file.separator")) != -1) + name = + this.exe + .toString() + .substring(this.exe.toString().lastIndexOf(System.getProperty("file.separator")) + 1); + else name = this.exe.toString(); + final String rnd = StringUtil.getRandonString(6); + final String out_name = name + "-" + this.getId() + "-" + rnd + "-out.txt"; + final String err_name = name + "-" + this.getId() + "-" + rnd + "-err.txt"; + + // Create temp. directory for out and err streams + this.outFile = Paths.get(this.outPath.toString(), out_name); + this.errFile = Paths.get(this.outPath.toString(), err_name); + + try { + final ArrayList cmd = new ArrayList(); + cmd.add(this.exe.toString()); + cmd.addAll(Arrays.asList(this.args)); + final ProcessBuilder pb = new ProcessBuilder(cmd); + + // Redirect out and err + pb.redirectOutput(this.outFile.toFile()); + pb.redirectError(this.errFile.toFile()); + + // Start and wait + final Process process = pb.start(); + this.exitCode = process.waitFor(); + + if (this.exitCode != 0) { + final String error_msg = FileUtil.readFile(this.errFile); + log.error("Error running [" + this.getCommand() + "]: " + error_msg); + } + + } catch (IOException ioe) { + log.error("Error running [" + this.getCommand() + "]: " + ioe.getMessage()); + } catch (InterruptedException ie) { + log.error("Error running [" + this.getCommand() + "]: " + ie.getMessage()); + } + } + + /** + *

    Getter for the field outFile.

    + * + * @return a {@link java.nio.file.Path} object. + */ + public Path getOutFile() { + return outFile; + } + + /** + *

    Getter for the field errFile.

    + * + * @return a {@link java.nio.file.Path} object. + */ + public Path getErrFile() { + return errFile; + } + + /** + *

    Getter for the field exitCode.

    + * + * @return a int. + */ + public int getExitCode() { + return exitCode; + } + + /** + *

    terminatedWithSuccess.

    + * + * @return a boolean. + */ + public boolean terminatedWithSuccess() { + return this.exitCode == 0; + } + + /** + *

    getCommand.

    + * + * @return a {@link java.lang.String} object. + */ + public String getCommand() { + final ArrayList cmd = new ArrayList(); + cmd.add(this.exe.toString()); + cmd.addAll(Arrays.asList(this.args)); + return StringUtil.join(cmd, " "); + } +} diff --git a/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapperException.java b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapperException.java new file mode 100644 index 000000000..03d1fce24 --- /dev/null +++ b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapperException.java @@ -0,0 +1,46 @@ +/** + * This file is part of Eclipse Steady. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright (c) 2018-2020 SAP SE or an SAP affiliate company and Eclipse Steady contributors + */ +package org.eclipse.steady.shared.util; + +/** + * Thrown to indicate a problem when calling OS-level services. + */ +public class ProcessWrapperException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + *

    Constructor for ProcessWrapperException.

    + * + * @param _message a {@link java.lang.String} object. + */ + public ProcessWrapperException(String _message) { + super(_message); + } + + /** + *

    Constructor for ProcessWrapperException.

    + * + * @param _message a {@link java.lang.String} object. + * @param _cause a {@link java.lang.Throwable} object. + */ + public ProcessWrapperException(String _message, Throwable _cause) { + super(_message, _cause); + } +} From 2339bc9c883d56f9fd65c56ca6f9c517f699570b Mon Sep 17 00:00:00 2001 From: pedrogalvao Date: Wed, 10 Aug 2022 16:32:42 +0200 Subject: [PATCH 79/83] Fixed thread names --- .../src/main/java/org/eclipse/steady/kb/Manager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index d78090841..b5d1b9996 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -329,7 +329,7 @@ private void setUploadConfiguration(HashMap args) { public void kaybeeUpdate() throws IOException, InterruptedException { try { ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get(kaybeeBinaryPath), "update", "--force").setPath(Paths.get("/kb-importer/data")); - Thread t = new Thread(pw, "pip"); + Thread t = new Thread(pw, "kaybeeUpdate"); t.start(); t.join(); } catch (ProcessWrapperException e) { @@ -347,7 +347,7 @@ public void kaybeeUpdate() throws IOException, InterruptedException { public void kaybeePull() throws IOException, InterruptedException { try { ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get(kaybeeBinaryPath), "pull", "-c", kaybeeConfPath).setPath(Paths.get("/kb-importer/data")); - Thread t = new Thread(pw, "pip"); + Thread t = new Thread(pw, "kaybeePull"); t.start(); t.join(); } catch (ProcessWrapperException e) { @@ -365,7 +365,7 @@ public void kaybeePull() throws IOException, InterruptedException { public void copyStatements() throws IOException, InterruptedException { try { ProcessWrapper pw = new ProcessWrapper().setCommand(Paths.get("cp"), "-r", ImporterController.statementsKaybeePath, ImporterController.statementsPath).setPath(Paths.get("/kb-importer/data")); - Thread t = new Thread(pw, "pip"); + Thread t = new Thread(pw, "copyStatements"); t.start(); t.join(); } catch (ProcessWrapperException e) { From 1aa0265ee8e42bfd5be7a633bda882c65d791006 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Wed, 17 Aug 2022 13:49:47 +0200 Subject: [PATCH 80/83] Added lang-python back in (its removal will be done in a separate PR) --- kb-importer/src/main/resources/steady-kb-importer.properties | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kb-importer/src/main/resources/steady-kb-importer.properties b/kb-importer/src/main/resources/steady-kb-importer.properties index f3598e96b..0532508f1 100644 --- a/kb-importer/src/main/resources/steady-kb-importer.properties +++ b/kb-importer/src/main/resources/steady-kb-importer.properties @@ -21,6 +21,6 @@ # 1 day vulas.kb-importer.refetchAllMs = 86400000 -vulas.kb-importer.kaybeeBinaryPath = /kb-importer/data/kaybee -vulas.kb-importer.kaybeeConfPath = ../conf/kaybeeconf.yaml +vulas.kb-importer.kaybeeBinaryPath = /kb-importer/kaybee +vulas.kb-importer.kaybeeConfPath = ./conf/kaybeeconf.yaml vulas.kb-importer.statementsPath = /kb-importer/data/statements \ No newline at end of file diff --git a/pom.xml b/pom.xml index c5ef2e723..aac1905c2 100755 --- a/pom.xml +++ b/pom.xml @@ -152,7 +152,7 @@ lang-java-reach lang-java-reach-wala lang-java-reach-soot - + lang-python repo-client From dfcd0a6fc264efe4f141816e1c4b8ad4e2952e23 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Thu, 25 Aug 2022 15:41:44 +0200 Subject: [PATCH 81/83] Fixed some bugs, added comments and improved log messages --- Jenkinsfile | 10 +- docker/kb-importer/run.sh | 4 +- docs/public/content/admin/tutorials/build.md | 9 +- kb-importer/pom.xml | 103 +++++++- .../org/eclipse/steady/kb/ImportCommand.java | 136 +++++----- .../java/org/eclipse/steady/kb/Manager.java | 244 +++++++++--------- .../org/eclipse/steady/kb/model/Artifact.java | 2 +- .../org/eclipse/steady/kb/model/Commit.java | 2 +- .../org/eclipse/steady/kb/model/Note.java | 2 +- .../steady/kb/model/Vulnerability.java | 6 +- .../kb/{Main.java => model/package-info.java} | 23 +- .../kb/rest/ConfigurationController.java | 67 +++++ .../ImportController.java} | 235 +++++++++-------- .../steady/kb/rest/MainController.java | 63 +++++ .../steady/kb/task/ExtractOrClone.java | 80 +++--- .../kb/task/ImportAffectedLibraries.java | 2 + .../steady/kb/task/ImportVulnerability.java | 16 +- .../org/eclipse/steady/kb/util/Metadata.java | 68 +++-- .../src/main/resources/application.properties | 37 +++ .../resources/steady-kb-importer.properties | 12 +- .../eclipse/steady/kb/TestImportCommand.java | 31 ++- .../org/eclipse/steady/kb/TestManager.java | 35 ++- ...ava => TestExtractOrCloneCVE20181270.java} | 40 +-- .../task/TestExtractOrCloneCVE20197619.java | 119 +++++++++ .../kb/task/TestImportAffectedLibraries.java | 8 +- .../kb/task/TestImportVulnerability.java | 5 +- ...TestImportVulnerability_CVE_2017_2617.java | 5 +- .../eclipse/steady/kb/util/MetadataTest.java | 32 +-- .../statements/CVE-2019-7619/statement.yaml | 8 + .../steady/java/mvn/MvnPluginInstr.java | 4 +- pom.xml | 25 +- rest-backend/pom.xml | 26 +- .../backend/cve/NvdRestServiceMockup.java | 7 +- rest-lib-utils/pom.xml | 25 +- .../eclipse/steady/shared/util/FileUtil.java | 79 ++++-- .../steady/shared/util/ProcessWrapper.java | 6 +- .../steady/shared/util/FileUtilTest.java | 61 +++-- 37 files changed, 1063 insertions(+), 574 deletions(-) rename kb-importer/src/main/java/org/eclipse/steady/kb/{Main.java => model/package-info.java} (59%) mode change 100644 => 100755 create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/rest/ConfigurationController.java rename kb-importer/src/main/java/org/eclipse/steady/kb/{ImporterController.java => rest/ImportController.java} (54%) create mode 100644 kb-importer/src/main/java/org/eclipse/steady/kb/rest/MainController.java create mode 100644 kb-importer/src/main/resources/application.properties rename kb-importer/src/test/java/org/eclipse/steady/kb/task/{TestExtractOrClone.java => TestExtractOrCloneCVE20181270.java} (88%) create mode 100644 kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrCloneCVE20197619.java create mode 100644 kb-importer/src/test/resources/statements/CVE-2019-7619/statement.yaml diff --git a/Jenkinsfile b/Jenkinsfile index 7a631cc1a..437574bb9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -81,14 +81,14 @@ spec: } } // Verifies that the -javadoc and -sources artifacts can be generated (by enabling the - // javadoc profile contained in three pom.xml files). Also verifies that the build + // prepare-release profile contained in four pom.xml files). Also verifies that the build // is reproducible, and that Spotbugs checks do not fail (cf. // https://eclipse.github.io/steady/contributor/#contribution-content-guidelines). - stage('Create javadoc + sources, Verify Spotbugs and Reproducibility') { + stage('Create javadoc + sources + CycloneDX BOM, Verify Spotbugs and Reproducibility') { steps { container('maven') { sh 'export MAVEN_OPTS="-Xms4g -Xmx8g"' - sh 'mvn -B -e -P gradle,javadoc \ + sh 'mvn -B -e -P gradle,prepare-release \ -Dspring.standalone \ -DskipTests \ -Dvulas.shared.m2Dir=/home/jenkins/agent/workspace \ @@ -96,7 +96,7 @@ spec: -Dspotbugs.includeFilterFile=findbugs-include.xml \ -Dspotbugs.failOnError=true \ clean install com.github.spotbugs:spotbugs-maven-plugin:4.2.3:check' - // sh 'mvn -B -e -P javadoc \ + // sh 'mvn -B -e -P prepare-release \ // -Dspring.standalone \ // -DskipTests \ // -Dreference.repo=https://repo.maven.apache.org/maven2 \ @@ -132,7 +132,7 @@ spec: sh 'gpg --batch --import "${KEYRING}"' sh 'for fpr in $(gpg --list-keys --with-colons | awk -F: \'/fpr:/ {print $10}\' | sort -u); do echo -e "5\ny\n" | gpg --batch --command-fd 0 --expert --edit-key ${fpr} trust; done' } - sh 'mvn -B -e -P gradle,javadoc,release \ + sh 'mvn -B -e -P gradle,prepare-release,release \ -Dspring.standalone \ -DskipTests \ clean deploy' diff --git a/docker/kb-importer/run.sh b/docker/kb-importer/run.sh index d59753f85..397d5849d 100644 --- a/docker/kb-importer/run.sh +++ b/docker/kb-importer/run.sh @@ -5,10 +5,10 @@ home="/kb-importer" mkdir -p $home/data -echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO +echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO echo "Statements branch: " $KB_IMPORTER_STATEMENTS_BRANCH echo "Statements folder: " $KB_IMPORTER_STATEMENTS_FOLDER -echo "Skip clones: " $KB_IMPORTER_SKIP_CLONE +echo "Skip clones: " $KB_IMPORTER_SKIP_CLONE # Substitute env variables used by kaybee in kaybeeconf.yaml sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" $home/conf/kaybeeconf.yaml.sample > $home/conf/kaybeeconf.yaml diff --git a/docs/public/content/admin/tutorials/build.md b/docs/public/content/admin/tutorials/build.md index dc864fdae..2c6a433fd 100644 --- a/docs/public/content/admin/tutorials/build.md +++ b/docs/public/content/admin/tutorials/build.md @@ -43,6 +43,8 @@ docker run -it --rm -v ${PWD}/docker:/exporter --env-file ./docker/.env -e mvn_f > In case you are running behind a proxy you need to configure it in the `--build-arg` arguments. Check the [predefined `ARG`s](https://docs.docker.com/engine/reference/builder/#predefined-args) documentation to know more. +> In case you'd like to avoid downloading all dependencies by reusing your local Maven repository, add a volume as follows `-v "$HOME/.m2":/root/.m2`, see [here](https://hub.docker.com/_/maven/) for more information. + As a result, the folders `docker/` will contain compiled JARs (or WARs, depending on the component). The folder `docker/client-tools` will be populated with the JARs for client side tools (CLI, plugins, patchanalyzer). Additionally, you may want to make the artifacts available to the developers of your organization (e.g., through an internal Nexus or other artifact distribution system). @@ -58,13 +60,18 @@ You are now ready to run the system with the generated archives and create the D You can create and run containers from the generated images. ```sh -(cd docker && docker-compose -f docker-compose.yml -f docker-compose.build.yml up -d) +(cd docker && docker-compose -f docker-compose.yml -f docker-compose.build.yml --profile vdb --profile ui up -d) ``` To check everything started successfully, browse the page `http://localhost:8033/haproxy?stats`. All endpoints should appear as green. > `username` and `password` can be found in your `.env` file, be also advised that `rest-backend` could take more than 30 seconds to be ready to answer HTTP requests +Run the following to stop all containers. + +```sh +(cd docker && docker-compose -f docker-compose.yml -f docker-compose.build.yml --profile vdb --profile ui down) +``` --- Get going: diff --git a/kb-importer/pom.xml b/kb-importer/pom.xml index c8ea9a4c1..0b5243fc7 100644 --- a/kb-importer/pom.xml +++ b/kb-importer/pom.xml @@ -68,16 +68,25 @@ test + + + commons-io commons-io 2.11.0 + org.yaml snakeyaml 1.30 + org.eclipse.steady @@ -85,6 +94,7 @@ ${project.version} compile + org.eclipse.steady @@ -98,6 +108,7 @@ junit 4.13.2 + @@ -121,6 +132,85 @@ + + + + prepare-release + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + attach-sources + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.3.0 + + + attach-javadocs + + jar + + + + + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + + + + + + + + release + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.0.1 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + + + + - javadoc + prepare-release @@ -220,6 +220,17 @@ + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + @@ -697,18 +708,6 @@ - - - org.cyclonedx - cyclonedx-maven-plugin - 2.6.2 - - - package - makeAggregateBom - - - diff --git a/rest-backend/pom.xml b/rest-backend/pom.xml index bc949b749..8ac80c9b7 100644 --- a/rest-backend/pom.xml +++ b/rest-backend/pom.xml @@ -212,7 +212,6 @@ - com.xebialabs.restito @@ -327,7 +326,7 @@ - javadoc + prepare-release @@ -358,6 +357,17 @@ + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + @@ -564,18 +574,6 @@ - - - org.cyclonedx - cyclonedx-maven-plugin - 2.6.2 - - - package - makeAggregateBom - - - diff --git a/rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java b/rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java index 79fa887e7..638989dbc 100644 --- a/rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java +++ b/rest-backend/src/test/java/org/eclipse/steady/backend/cve/NvdRestServiceMockup.java @@ -40,8 +40,11 @@ import com.xebialabs.restito.server.StubServer; /** - * Singleton mocking the NVD REST service, which is used by different JUnit tests. Sets the system property {@link CveReader2#CVE_SERVICE_URL}. - * To add a new vulnerability FOO, store the respective JSON as ./src/test/resources/cves/FOO-new.json and update the array {@link NvdRestServiceMockup#CVES}. + * Singleton mocking the NVD REST service, which is used by different JUnit + * tests. Sets the system property {@link CveReader2#CVE_SERVICE_URL}. To add a + * new vulnerability FOO, store the respective JSON as + * ./src/test/resources/cves/FOO-new.json and update the array + * {@link NvdRestServiceMockup#CVES}. */ public class NvdRestServiceMockup { diff --git a/rest-lib-utils/pom.xml b/rest-lib-utils/pom.xml index d04c55980..d72dfb4c3 100644 --- a/rest-lib-utils/pom.xml +++ b/rest-lib-utils/pom.xml @@ -311,7 +311,7 @@ - javadoc + prepare-release @@ -342,6 +342,17 @@ + + org.cyclonedx + cyclonedx-maven-plugin + 2.6.2 + + + package + makeAggregateBom + + + @@ -513,18 +524,6 @@ - - - org.cyclonedx - cyclonedx-maven-plugin - 2.6.2 - - - package - makeAggregateBom - - - diff --git a/shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java b/shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java index 283f75ab4..ac12d7cac 100644 --- a/shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java +++ b/shared/src/main/java/org/eclipse/steady/shared/util/FileUtil.java @@ -24,7 +24,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -33,9 +32,13 @@ import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.StandardCharsets; import java.nio.charset.UnsupportedCharsetException; +import java.nio.file.CopyOption; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -266,25 +269,6 @@ public static Charset getCharset() { } } - /** - *

    copyFile.

    - * - * @param _source_file a {@link java.nio.file.Path} object. - * @param _target_dir a {@link java.nio.file.Path} object. - * @return a {@link java.nio.file.Path} object. - * @throws java.io.IOException if any. - */ - public static Path copyFile(Path _source_file, Path _target_dir) throws IOException { - final Path to = _target_dir.resolve(_source_file.getFileName()); - try (final InputStream is = new FileInputStream(_source_file.toFile()); - final OutputStream os = new FileOutputStream(to.toFile())) { - final byte[] byte_buffer = new byte[1024]; - int len = 0; - while ((len = is.read(byte_buffer)) != -1) os.write(byte_buffer, 0, len); - } - return to; - } - // Reading files /** @@ -637,4 +621,59 @@ public static Boolean isZipped(File _f) throws IOException { return false; } } + + /** + * Copies the given source file or directory to the given target directory. If + * no _target_name is provided, the source will be copied with the identical + * name into _target_dir. If _target_name is provided, that name will be + * taken. + * + * @throws java.io.IOException if any. + * @throws java.lang.InterruptedException if any. + * @throws java.lang.IllegalArgumentException if _source is neither an + * existing file nor directory or the target folder does not exist. + */ + public static Path copy(Path _source, Path _target_dir, Path _target_name, CopyOption... options) + throws IOException, IllegalArgumentException { + + // Check args + if(!FileUtil.isAccessibleFile(_source) && !FileUtil.isAccessibleDirectory(_source)) { + throw new IllegalArgumentException("Source [" + _source + "] does not exist"); + } else if(!FileUtil.isAccessibleDirectory(_target_dir)) { + throw new IllegalArgumentException("Target [" + _target_dir + "] does not exist or is not a directory"); + } + + Path p = _target_dir.resolve(_target_name == null ? _source.getFileName() : _target_name); + + // A single file is copied + if(FileUtil.isAccessibleFile(_source)) { + log.info("Copying [" + _source + "] to [" + p + "]"); + Files.copy(_source, p, options); + } + // A directory is copied + else if(FileUtil.isAccessibleDirectory(_source)) { + Files.walkFileTree(_source, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + Path p = _target_dir.resolve(_target_name == null ? _source.getFileName() : _target_name).resolve(_source.relativize(dir)); + log.debug("Visiting dir [" + dir + "], creating dir [" + p + "]"); + Files.createDirectories(p); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + throws IOException { + Path p = _target_dir.resolve(_target_name == null ? _source.getFileName() : _target_name).resolve(_source.relativize(file)); + log.debug("Visiting file [" + file + "], copying to [" + p + "]"); + Files.copy(file, p, options); + return FileVisitResult.CONTINUE; + } + } + ); + } + + return p; + } } diff --git a/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java index c914b0e4c..36afaea1c 100755 --- a/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java +++ b/shared/src/main/java/org/eclipse/steady/shared/util/ProcessWrapper.java @@ -27,8 +27,6 @@ import java.util.regex.Pattern; import org.apache.logging.log4j.Logger; -import org.eclipse.steady.shared.util.FileUtil; -import org.eclipse.steady.shared.util.StringUtil; /** *

    ProcessWrapper class.

    @@ -37,7 +35,7 @@ public class ProcessWrapper implements Runnable { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(); - private static final Pattern ALLOWED = Pattern.compile("[\\.\\-\\w=]+"); + private static final Pattern ALLOWED = Pattern.compile("[\\.\\-\\w=/]+"); private String id = null; @@ -97,7 +95,7 @@ public ProcessWrapper setCommand(Path _executable, String... _args) && !FileUtil.isAccessibleFile(_args[i]) && !FileUtil.isAccessibleDirectory(_args[i])) throw new ProcessWrapperException( - "Illegal characters in argument [" + i + "], allowed are: a-zA-Z_0-9-.="); + "Cannot run [" + _executable + "] due to illegal characters in [" + i + ".] argument [" + _args[i] + "], allowed are: a-zA-Z_0-9-.=/"); } this.exe = _executable; diff --git a/shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java b/shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java index 5c1de0b31..3ef279089 100755 --- a/shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java +++ b/shared/src/test/java/org/eclipse/steady/shared/util/FileUtilTest.java @@ -27,6 +27,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.Set; import org.eclipse.steady.shared.enums.DigestAlgorithm; @@ -66,22 +67,6 @@ public void testGetCRC32Bytes() { assertEquals(4157704578l, FileUtil.getCRC32("Hello".getBytes())); } - @Test - public void testCopyFile() { - try { - final VulasConfiguration cfg = new VulasConfiguration(); - final Path tmp_dir = cfg.getTmpDir(); - final Path source_file = Paths.get("./src/test/resources/Outer.jar"); - final Path target_file = FileUtil.copyFile(source_file, tmp_dir); - assertEquals( - FileUtil.getDigest(source_file.toFile(), DigestAlgorithm.SHA1), - FileUtil.getDigest(target_file.toFile(), DigestAlgorithm.SHA1)); - } catch (IOException e) { - e.printStackTrace(); - assertEquals(true, false); - } - } - @Test public void testGetJarFilePathsForResources() { final String[] resources = new String[] {"LICENSE-junit.txt"}; // Contained in junit-4.12.jar @@ -114,4 +99,48 @@ public void testGetFileName() { FileUtil.getFileName(Paths.get("./project/js/hello.io.min.js").toString(), false); assertEquals("hello.io.min", name3); } + + @Test + public void testCopy() { + try { + // Copy file and keep name + Path source = Paths.get("./src/test/resources/foo.txt"); + Path target_dir = Paths.get("./target"); + Path target_name = null; + Path target = FileUtil.copy(source, target_dir, target_name, StandardCopyOption.REPLACE_EXISTING); + assertTrue(FileUtil.isAccessibleFile("./target/foo.txt")); + assertEquals( + FileUtil.getDigest(source.toFile(), DigestAlgorithm.SHA1), + FileUtil.getDigest(target.toFile(), DigestAlgorithm.SHA1)); + + // Copy file and change name + source = Paths.get("./src/test/resources/foo.txt"); + target_dir = Paths.get("./target"); + target_name = Paths.get("bar.txt"); + target = FileUtil.copy(source, target_dir, target_name, StandardCopyOption.REPLACE_EXISTING); + assertTrue(FileUtil.isAccessibleFile("./target/bar.txt")); + assertEquals( + FileUtil.getDigest(source.toFile(), DigestAlgorithm.SHA1), + FileUtil.getDigest(target.toFile(), DigestAlgorithm.SHA1)); + + // Copy dir and keep name + source = Paths.get("./src/test/resources/foo"); + target_dir = Paths.get("./target"); + target_name = null; + target = FileUtil.copy(source, target_dir, target_name, StandardCopyOption.REPLACE_EXISTING); + assertTrue(FileUtil.isAccessibleFile("./target/foo/bar/bar.baz")); + assertTrue(FileUtil.isAccessibleDirectory("./target/foo/bar")); + + // Copy dir and change name + source = Paths.get("./src/test/resources/foo"); + target_dir = Paths.get("./target"); + target_name = Paths.get("baz"); + target = FileUtil.copy(source, target_dir, target_name, StandardCopyOption.REPLACE_EXISTING); + assertTrue(FileUtil.isAccessibleFile("./target/baz/bar/bar.baz")); + assertTrue(FileUtil.isAccessibleDirectory("./target/baz/bar")); + } catch (IOException e) { + e.printStackTrace(); + assertTrue(false); + } + } } From 1222d2b91afac62256b09adf6bfc4218af80d6c3 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Fri, 26 Aug 2022 15:04:25 +0200 Subject: [PATCH 82/83] Changed default wait time to 1d --- .../java/org/eclipse/steady/kb/rest/ImportController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/rest/ImportController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/rest/ImportController.java index ec16c37ef..35a6fcb14 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/rest/ImportController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/rest/ImportController.java @@ -68,7 +68,7 @@ public class ImportController { static final long waitTimeMs = VulasConfiguration.getGlobal() .getConfiguration() - .getLong("vulas.kb-importer.refetchAllMs", -1); + .getLong("vulas.kb-importer.refetchAllMs", 86400000); /** * Creates a new importer thread. @@ -144,7 +144,7 @@ public ResponseEntity start( @RequestParam(defaultValue = "false") boolean upload, @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone, - @RequestParam(defaultValue = "0") long waitTimeMs) { + @RequestParam(defaultValue = "86400000") long waitTimeMs) { // On-going import: don't do anything if (this.manager.isRunningStart()) { From bfc4ac43c3bed902821e027d394602bb17efbaf0 Mon Sep 17 00:00:00 2001 From: henrikplate <17928867+henrikplate@users.noreply.github.com> Date: Tue, 13 Sep 2022 11:05:49 +0200 Subject: [PATCH 83/83] Maintain stats for all statuses --- .../java/org/eclipse/steady/kb/Manager.java | 28 ++++++++++++------- .../steady/kb/task/ImportVulnerability.java | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 8f24d2c3a..a63b17721 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -132,7 +132,7 @@ public void createNewExecutor() { } /** - *

    addNewVulnerability.

    + * Adds a vulnerability that does not yet exist in the backend. Called by {@link ImportCommand#run()}. * * @param vulnId a {@link java.lang.String} object */ @@ -377,6 +377,7 @@ public void kaybeePull() throws Exception { */ public void stop() { try { + log.info("Stopping manager..."); executor.shutdownNow(); executor.awaitTermination(24, TimeUnit.HOURS); } catch (InterruptedException e) { @@ -410,26 +411,33 @@ public void importSingleVuln(HashMap mapCommandOptionValues, Str * @return a {@link java.lang.String} object */ public String status() { + HashMap statusMap = new HashMap(); + + // Counter for each status HashMap statusCount = new HashMap(); - for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { - if (!statusCount.containsKey(vulnStatus)) { - statusCount.put(vulnStatus, 0); + for (String vul: vulnerabilitiesStatus.keySet()) { + if (!statusCount.containsKey(vulnerabilitiesStatus.get(vul))) { + statusCount.put(vulnerabilitiesStatus.get(vul), 0); } - statusCount.put(vulnStatus, statusCount.get(vulnStatus) + 1); + statusCount.put(vulnerabilitiesStatus.get(vul), statusCount.get(vulnerabilitiesStatus.get(vul)) + 1); } + statusMap.put("count", statusCount); + + // New vulns HashMap newVulnStatus = new HashMap(); for (String vulnId : newVulnerabilities) { newVulnStatus.put(vulnId, vulnerabilitiesStatus.get(vulnId)); - } - HashMap statusMap = new HashMap(); - statusMap.put("count", statusCount); + } statusMap.put("new_vulnerabilities", newVulnerabilities); + + // Failures HashMap failureReasons = new HashMap(); for (String vulnId : failures.keySet()) { failureReasons.put(vulnId, failures.get(vulnId).toString()); } statusMap.put("failures", failureReasons); - String statusStr = new Gson().toJson(statusMap); - return statusStr; + + // Return JSON + return new Gson().toJson(statusMap); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index aea282ff9..bc439e1eb 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -61,7 +61,7 @@ public void execute( Vulnerability vuln, HashMap args, BackendConnector _backendConnector) throws BackendConnectionException, JsonSyntaxException, IOException { String vulnId = vuln.getVulnId(); - log.info("Initiating ImportVulnerability: " + vulnId); + //log.info("Initiating ImportVulnerability: " + vulnId); List commits = new ArrayList(); File file = new File((String) args.get(ImportCommand.DIRECTORY_OPTION));

    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�ga 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 z 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%0A0qV(!UaZHX$tg!2p@ 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 Dp_rIK literal 0 HcmV?d00001 From 1964773d522168f3468e736bd893b5fd384c3178 Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Tue, 17 May 2022 11:26:38 +0200 Subject: [PATCH 27/83] Properly cleaning directory after test --- .../steady/kb/task/TestExtractOrClone.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index 9153e274e..1bac22ebf 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.File; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; @@ -16,29 +17,34 @@ import com.github.packageurl.MalformedPackageURLException; import com.google.gson.JsonSyntaxException; +import org.junit.After; import org.junit.Test; import org.junit.Before; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.junit.runner.RunWith; +import org.apache.commons.io.FileUtils; + @RunWith(Parameterized.class) public class TestExtractOrClone { Manager manager; ClassLoader classLoader; String dirPath; + File dir; @Before public void initialize() { this.manager = new Manager(); classLoader = getClass().getClassLoader(); - this.dirPath = classLoader.getResource("testRootDir7").getPath(); + //this.dirPath = classLoader.getResource("testRootDir7").getPath(); } public TestExtractOrClone(String dirName) { classLoader = getClass().getClassLoader(); this.dirPath = classLoader.getResource(dirName).getPath(); + this.dir = new File(dirPath); } @Parameterized.Parameters @@ -51,12 +57,7 @@ public static List directories() { @Test public void testClone() throws IOException { - - /*this.manager = new Manager(); - classLoader = getClass().getClassLoader(); - this.dirPath = classLoader.getResource("testRootDir7").getPath();*/ - File dir = new File(dirPath); String statementPath = dirPath + File.separator + "statement.yaml"; Vulnerability vuln = Metadata.getFromYaml(statementPath); @@ -66,7 +67,7 @@ public void testClone() throws IOException { args.put(Import.OVERWRITE_OPTION, false); args.put(Import.DIRECTORY_OPTION, ""); - ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, dir, false); + ExtractOrClone extractOrClone = new ExtractOrClone(manager, vuln, this.dir, false); extractOrClone.execute(); File commitDir1 = new File(dirPath + File.separator + "1db7e02de3eb0c011ee6681f5a12eb9d166fea8"); @@ -78,19 +79,24 @@ public void testClone() throws IOException { org.junit.Assert.assertEquals(commitDir1before.exists(), true); org.junit.Assert.assertEquals(commitDir1after.exists(), true); - - // TODO : count number of files instead - org.junit.Assert.assertEquals(commitDir1before.list().length > 0, true); - org.junit.Assert.assertEquals(commitDir1after.list().length > 0, true); + + org.junit.Assert.assertEquals(commitDir1before.list().length == 1, true); + org.junit.Assert.assertEquals(commitDir1after.list().length == 1, true); + org.junit.Assert.assertEquals(someJavaFile.exists(), true); org.junit.Assert.assertEquals(commitDir2.exists(), true); org.junit.Assert.assertEquals(commitDir3.exists(), true); - // clean directories after testing - //Files.delete(Paths.get(commitDir1.getPath())); - //Files.delete(Paths.get(commitDir2.getPath())); - //Files.delete(Paths.get(commitDir3.getPath())); - // TODO: remove directory git-repos before and/or after testing + } + + + @After + public void cleanup() { + try { + FileUtils.deleteDirectory(this.dir); + } catch (IOException e) { + System.out.println(e.getMessage()); + } } } \ No newline at end of file From f46b9842e2b5ba82c21f92885a8cd1910767db8e Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Wed, 18 May 2022 13:21:02 +0200 Subject: [PATCH 28/83] More detailed status. Endpoints for single vulnerabilities --- docker/kb-importer/start.sh | 1 + .../java/org/eclipse/steady/kb/Import.java | 11 +- .../eclipse/steady/kb/ImporterController.java | 84 ++++----- .../java/org/eclipse/steady/kb/Manager.java | 159 +++++++++--------- .../steady/kb/task/ExtractOrClone.java | 12 +- .../steady/kb/task/ImportVulnerability.java | 4 - .../steady/kb/task/TestExtractOrClone.java | 1 - .../eclipse/steady/kb/util/MetadataTest.java | 4 - 8 files changed, 140 insertions(+), 136 deletions(-) diff --git a/docker/kb-importer/start.sh b/docker/kb-importer/start.sh index 273addef9..2a200e579 100644 --- a/docker/kb-importer/start.sh +++ b/docker/kb-importer/start.sh @@ -14,6 +14,7 @@ sed "s|KB_IMPORTER_STATEMENTS_REPO|$KB_IMPORTER_STATEMENTS_REPO|g" ../conf/kaybe sed -i "s|KB_IMPORTER_STATEMENTS_BRANCH|$KB_IMPORTER_STATEMENTS_BRANCH|g" ../conf/kaybeeconf.yaml echo "Statements repo: " $KB_IMPORTER_STATEMENTS_REPO + echo "Statements branch: " $KB_IMPORTER_STATEMENTS_BRANCH echo "Statements folder: " $KB_IMPORTER_STATEMENTS_FOLDER echo "Clones folder: " $KB_IMPORTER_CLONE_FOLDER diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index b990a2afc..576c5504e 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -33,6 +33,7 @@ public class Import implements Runnable { public static final String OVERWRITE_OPTION = "o"; public static final String DELETE_OPTION = "del"; public static final String DIRECTORY_OPTION = "d"; + public static final String TIME_REFETCH_ALL_OPTION = "t"; public static final String DELETE = "del"; public static final String SEQUENTIAL = "seq"; @@ -61,7 +62,7 @@ public String getVulnId() { @Override public void run() { - manager.setVulnStatus(vulnId, Manager.VulnStatus.PROCESSING); + manager.setVulnStatus(vulnId, Manager.VulnStatus.EXTRACTING_OR_CLONING); boolean bugExists = false; try { bugExists = this.backendConnector.isBugExisting(vulnId); @@ -83,6 +84,8 @@ public void run() { return; } } else { + + manager.addNewVulnerability(vulnId); log.info("Bug [{}] does not exist in backend", vulnId); } @@ -114,10 +117,10 @@ public void run() { extractOrClone.execute(); } - if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED + if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE && manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.SKIP_CLONE) { //&& manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.NO_FIXES) { - manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.DIFF_DONE); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTING); ImportVulnerability importVulnerability = new ImportVulnerability(); ImportAffectedLibraries importAffectedLibraries = new ImportAffectedLibraries(); @@ -127,6 +130,7 @@ public void run() { importVulnerability.execute(vuln, args, backendConnector); } catch (IOException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_VULN); + manager.addFailure(vuln.getVulnId(), e.toString()); e.printStackTrace(); } this.stopWatch.lap("ImportAffectedLibraries"); @@ -134,6 +138,7 @@ public void run() { importAffectedLibraries.execute(vuln, args, backendConnector); } catch (IOException | MalformedPackageURLException | BackendConnectionException e) { manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_IMPORT_LIB); + manager.addFailure(vuln.getVulnId(), e.toString()); e.printStackTrace(); } manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTED); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 2fa76fe69..09e46cbbe 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -25,69 +25,51 @@ @CrossOrigin("*") public class ImporterController { - private static String TIME_REFRESH_ALL = "vulas.kb.importer.refetchAllMs"; - private static Logger log = LoggerFactory.getLogger(ImporterController.class); private Thread importerCacheFetch = null; - // Refresh CVE cache - final long time_refresh_all = - VulasConfiguration.getGlobal().getConfiguration().getLong(TIME_REFRESH_ALL, -1); + + final String defaultRefetchAllMs = + Long.toString(VulasConfiguration.getGlobal().getConfiguration().getLong("vulas.kb.importer.refetchAllMs", -1)); private final Manager manager; @Autowired ImporterController() { - this.manager = new Manager(); - HashMap args = new HashMap(); - this.importerCacheFetch = - new Thread( - new Runnable() { - public void run() { - while (true) { - manager.start("/kb-importer/data/statements", args); - - long interval = time_refresh_all; - System.out.println("interval: " + Long.toString(time_refresh_all)); - try { - Thread.sleep(interval); - } catch (InterruptedException e) { - ImporterController.log.error( - "Interrupted exception: " - + e.getMessage()); - } - } - } - }, - "ImporterCacheFetch"); - this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); + this.manager = new Manager(); } - //@GetMapping("/start") @RequestMapping(value = "/start", method = RequestMethod.POST) public ResponseEntity start(@RequestParam(defaultValue = "false") boolean overwrite, @RequestParam(defaultValue = "false") boolean upload, - @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone) { + @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone, @RequestParam(defaultValue = "0") long refetchAllMs) { boolean started = false; try { - if (this.importerCacheFetch.isAlive()) { + if (this.manager.getIsRunningStart()) { log.info("Importer already running"); } else { + if (this.importerCacheFetch != null && this.importerCacheFetch.isAlive()) { + this.importerCacheFetch.interrupt(); + } HashMap args = new HashMap(); args.put(Import.OVERWRITE_OPTION, overwrite); args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); args.put(Import.VERBOSE_OPTION, verbose); args.put(Import.SKIP_CLONE_OPTION, skipClone); + if (refetchAllMs != 0) { + args.put(Import.TIME_REFETCH_ALL_OPTION, refetchAllMs); + } else { + args.put(Import.TIME_REFETCH_ALL_OPTION, defaultRefetchAllMs); + } + this.importerCacheFetch = new Thread( new Runnable() { public void run() { while (true) { manager.start("/kb-importer/data/statements", args); - - long interval = time_refresh_all; - System.out.println("interval: " + Long.toString(time_refresh_all)); + try { - Thread.sleep(interval); + Thread.sleep(Long.parseLong((String)args.get(Import.TIME_REFETCH_ALL_OPTION))); } catch (InterruptedException e) { ImporterController.log.error( "Interrupted exception: " @@ -99,7 +81,6 @@ public void run() { "ImporterCacheFetch"); this.importerCacheFetch.setPriority(Thread.MIN_PRIORITY); - System.out.println(importerCacheFetch); this.importerCacheFetch.start(); started = true; log.info("Importer started"); @@ -116,8 +97,9 @@ public void run() { public ResponseEntity stop() { boolean stopped = false; try { - if (this.importerCacheFetch.isAlive()) { + if (this.manager.getIsRunningStart() || (this.importerCacheFetch != null && this.importerCacheFetch.isAlive())) { stopped = true; + this.manager.stop(); this.importerCacheFetch.interrupt(); log.info("Importer stopped"); } else { @@ -125,7 +107,7 @@ public ResponseEntity stop() { } return new ResponseEntity(stopped, HttpStatus.OK); } catch (Exception e) { - log.error("Exception when starting CVE cache refresh: " + e.getMessage(), e); + log.error("Exception when starting kb-importer cache refresh: " + e.getMessage(), e); return new ResponseEntity(stopped, HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -133,9 +115,26 @@ public ResponseEntity stop() { @RequestMapping( value = "/start/{id}", method = RequestMethod.POST) - public ResponseEntity importSingleVuln(@PathVariable String id) { + public ResponseEntity importSingleVuln(@PathVariable String id, @RequestParam(defaultValue = "false") boolean overwrite, + @RequestParam(defaultValue = "false") boolean upload, @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone) { - return new ResponseEntity(true, HttpStatus.OK); + try { + if (this.manager.getIsRunningStart()) { + log.info("Importer already running"); + return new ResponseEntity(false, HttpStatus.OK); + } else { + HashMap args = new HashMap(); + args.put(Import.OVERWRITE_OPTION, overwrite); + args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); + args.put(Import.VERBOSE_OPTION, verbose); + args.put(Import.SKIP_CLONE_OPTION, skipClone); + manager.importSingleVuln("/kb-importer/data/statements/"+id, args, id); + return new ResponseEntity(true, HttpStatus.OK); + } + } catch (Exception e) { + log.error("Exception when importing vulnerability: " + e.getMessage(), e); + return new ResponseEntity(false, HttpStatus.INTERNAL_SERVER_ERROR); + } } @GetMapping("/status") @@ -143,5 +142,10 @@ public String status() { return manager.status(); } + @GetMapping( + value = "/status/{id}") + public String statusSingleVuln(@PathVariable String id) { + return manager.getVulnStatus(id).toString(); + } } \ No newline at end of file diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index 85ed87bde..c7836b080 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -5,6 +5,7 @@ import java.util.Set; import java.util.Map; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; @@ -16,6 +17,8 @@ import java.io.File; import java.io.IOException; +import com.google.gson.Gson; + import org.eclipse.steady.shared.util.VulasConfiguration; import org.eclipse.steady.core.util.CoreConfiguration; import org.eclipse.steady.shared.util.DirWithFileSearch; @@ -31,21 +34,31 @@ public class Manager { // (ThreadPoolExecutor) Executors.newFixedThreadPool(8); private static Map vulnerabilitiesStatus = new HashMap(); + private static Set newVulnerabilities = new LinkedHashSet(); + + // pairs of vulnId and reason for failure + private static Map failures = new HashMap(); Map repoLocks = new HashMap(); + + private boolean isRunningStart; public enum VulnStatus { NOT_STARTED, - PROCESSING, - DIFF_DONE, + EXTRACTING_OR_CLONING, + IMPORTING, IMPORTED, - FAILED, + FAILED_EXTRACT_OR_CLONE, SKIP_CLONE, FAILED_IMPORT_LIB, FAILED_IMPORT_VULN, NO_FIXES } + public void addNewVulnerability(String vulnId) { + newVulnerabilities.add(vulnId); + } + public void setVulnStatus(String vulnId, VulnStatus vulnStatus) { vulnerabilitiesStatus.put(vulnId, vulnStatus); } @@ -54,29 +67,36 @@ public VulnStatus getVulnStatus(String vulnId) { return vulnerabilitiesStatus.get(vulnId); } + public void addFailure(String vulnId, String reason) { + failures.put(vulnId, reason); + } + public void lockRepo(String repo) { - //System.out.println("Lock: " + repo); if (!repoLocks.containsKey(repo)) { - //System.out.println("no key: " + repo); repoLocks.put(repo, new ReentrantLock()); } repoLocks.get(repo).lock(); - //System.out.println("Locked:" + repo); } public void unlockRepo(String repo) { - //System.out.println("Unlock: " + repo); if (!repoLocks.containsKey(repo)) { - //System.out.println("ERROR : Lock not found"); return; } repoLocks.get(repo).unlock(); - //System.out.println("Unlocked: " + repo); + } + + public boolean getIsRunningStart() { + return this.isRunningStart; } public synchronized void start( String statementsPath, HashMap mapCommandOptionValues) { - + this.isRunningStart = true; + if (this.executor.isShutdown() || this.executor.isTerminated()) { + this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); + } + newVulnerabilities = new LinkedHashSet(); + try { log.info("Updating kaybee..."); kaybeeUpdate(); @@ -84,6 +104,7 @@ public synchronized void start( kaybeePull(); } catch (IOException | InterruptedException e) { log.error("Exception while performing update: " + e.getMessage()); + this.isRunningStart = false; return; } @@ -95,17 +116,17 @@ public synchronized void start( Set vulnDirsPaths = search.search(Paths.get(statementsDir.getPath())); for (Path dirPath : vulnDirsPaths) { File vulnDir = dirPath.toFile(); - - System.out.println("vuln dir " + vulnDir.getName()); log.info("Found vulnerability directory: " + vulnDir.getName()); String vulnId = vulnDir.getName().toString(); setVulnStatus(vulnId, VulnStatus.NOT_STARTED); + } BackendConnector backendConnector = BackendConnector.getInstance(); for (Path vulnDirPath : vulnDirsPaths) { File vulnDir = vulnDirPath.toFile(); String vulnDirStr = vulnDirPath.toString(); log.info("Initializing process for directory " + vulnDirPath); + // It is necessary to copy the arguments to avoid concurrent modification HashMap args = new HashMap(mapCommandOptionValues); args.put(Import.DIRECTORY_OPTION, vulnDirStr); @@ -123,6 +144,7 @@ public synchronized void start( log.error("Process interrupted"); log.error(e.getMessage()); } + this.isRunningStart = false; } private void setUploadConfiguration(HashMap args) { @@ -153,79 +175,56 @@ public void kaybeePull() throws IOException, InterruptedException { } } - public String status() { - int not_started = 0; - int imported = 0; - int processing = 0; - int diff_done = 0; - int no_fixes = 0; - int failed = 0; - int failed_vuln = 0; - int failed_lib = 0; - int skip_clone = 0; - for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { - switch (vulnStatus) { - case NOT_STARTED: - not_started += 1; - break; - case IMPORTED: - imported += 1; - break; - case PROCESSING: - processing += 1; - break; - case DIFF_DONE: - diff_done += 1; - break; - case NO_FIXES: - no_fixes += 1; - break; - case FAILED_IMPORT_VULN: - failed_vuln += 1; - break; - case FAILED_IMPORT_LIB: - failed_lib += 1; - break; - case FAILED: - failed += 1; - break; - case SKIP_CLONE: - skip_clone += 1; - break; - default: - break; - } - } - String statusStr = - "\nnot_started: " - + Integer.toString(not_started) - + "\nextracting/cloning: " - + Integer.toString(processing) - + "\nimporting vuln/libraries: " - + Integer.toString(diff_done) - + "\nimported: " - + Integer.toString(imported); - if (no_fixes > 0) { - statusStr += "\nno_fixes: " - + Integer.toString(no_fixes); + public void stop() { + try { + executor.shutdownNow(); + executor.awaitTermination(24, TimeUnit.HOURS); + this.isRunningStart = false; + } catch (InterruptedException e) { + log.error("Process interrupted"); + log.error(e.getMessage()); } - if (failed > 0) { - statusStr += "\nfailed extract/clone: " - + Integer.toString(failed); + } + + public void importSingleVuln( + String vulnDirStr, HashMap mapCommandOptionValues, String vulnId) { + + // Should have a lock per vulnerability + + log.info("Initializing process for directory " + vulnDirStr); + + if (this.executor.isShutdown() || this.executor.isTerminated()) { + this.executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } - if (failed_vuln > 0) { - statusStr += "\nfailed vuln: " - + Integer.toString(failed_lib); + + // It is necessary to copy the arguments to avoid concurrent modification + HashMap args = new HashMap(mapCommandOptionValues); + args.put(Import.DIRECTORY_OPTION, vulnDirStr); + Import command = new Import(this, args, BackendConnector.getInstance()); + if (mapCommandOptionValues.containsKey(Import.SEQUENTIAL)) { + command.run(); + } else { + executor.submit(command); } - if (failed_lib > 0) { - statusStr += "\nfailed lib: " - + Integer.toString(failed_vuln); + } + + public String status() { + HashMap statusCount = new HashMap(); + for (VulnStatus vulnStatus : new ArrayList(vulnerabilitiesStatus.values())) { + if (!statusCount.containsKey(vulnStatus)) { + statusCount.put(vulnStatus, 0); + } + statusCount.put(vulnStatus, statusCount.get(vulnStatus)+1); } - if (skip_clone > 0) { - statusStr += "\nskip_clone: " - + Integer.toString(skip_clone); + HashMap newVulnStatus = new HashMap(); + for (String vulnId : newVulnerabilities) { + newVulnStatus.put(vulnId, vulnerabilitiesStatus.get(vulnId)); } - return statusStr + "\n"; + HashMap statusMap = new HashMap(); + statusMap.put("count", statusCount); + statusMap.put("new_vulnerabilities", newVulnerabilities); + String statusStr = new Gson().toJson(statusMap); + return statusStr; } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java index 0a993dfb1..bb08c3f81 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ExtractOrClone.java @@ -97,7 +97,8 @@ public void extract(File tarFile, String dirPath) { } catch (IOException | InterruptedException e) { String vulnId = dirPath.split(File.separator)[dirPath.split(File.separator).length - 1]; - manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); + manager.addFailure(vuln.getVulnId(), e.toString()); e.printStackTrace(); } } @@ -133,7 +134,8 @@ public void clone(Vulnerability vuln, String dirPath) { } catch (IOException | InterruptedException e) { e.printStackTrace(); - manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); + manager.addFailure(vuln.getVulnId(), e.toString()); break; } manager.unlockRepo(repoUrl); @@ -173,7 +175,8 @@ public void createAndWriteCommitMetadata(Commit commit, String repoDirPath, Stri log.error("Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); String error = gitShowError.readLine(); log.error("git show: " + error); - manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED); + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); + manager.addFailure(vuln.getVulnId(), "Failed to get commit timestamp for repository " +repoUrl + " commit id " + commitId); } } /* @@ -278,7 +281,8 @@ public void execGitDiffFile(String repoDirPath, String commitId, String filename log.error("git cat-file didn't work"); log.error(gitCatErrorInput.readLine()); // What to do in case it doesn't work? - // manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED); + manager.setVulnStatus(vulnId, Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE); + manager.addFailure(vuln.getVulnId(), "git cat-file didn't work"); } } diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java index 49cd5627c..433bc03b3 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/task/ImportVulnerability.java @@ -78,10 +78,6 @@ public boolean accept(File file) { return file.isDirectory(); } }); - // String commitDirsPaths[] = file.list(); - //System.out.println("ImportVulnerability 2"); - //System.out.println(commitDirs); - //System.out.println(commitDirs.length); for (File commitDir : commitDirs) { diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java index 1bac22ebf..a3de218b3 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/task/TestExtractOrClone.java @@ -38,7 +38,6 @@ public class TestExtractOrClone { public void initialize() { this.manager = new Manager(); classLoader = getClass().getClassLoader(); - //this.dirPath = classLoader.getResource("testRootDir7").getPath(); } public TestExtractOrClone(String dirName) { diff --git a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java index 0eabdf8ac..f8dbce45e 100644 --- a/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java +++ b/kb-importer/src/test/java/org/eclipse/steady/kb/util/MetadataTest.java @@ -105,10 +105,6 @@ public void testGetFromYaml() throws IOException { String path = classLoader.getResource("testRootDir1").getPath() + File.separator + "statement.yaml"; Vulnerability vuln = Metadata.getFromYaml(path); - System.out.println("vuln"); - System.out.println(vuln); - System.out.println(vuln.getArtifacts()); - assertEquals(3, vuln.getArtifacts().size()); assertEquals(3, vuln.getNotes().size()); assertEquals("COLLECTIONS-580", vuln.getVulnId()); From 89ab0627350c69853b51f156975eafe713c72f0a Mon Sep 17 00:00:00 2001 From: Pedro Galvao Date: Wed, 18 May 2022 15:09:40 +0200 Subject: [PATCH 29/83] Fixed problems with parameter refetchAllMs --- .../main/java/org/eclipse/steady/kb/Import.java | 6 ++---- .../eclipse/steady/kb/ImporterController.java | 10 +++++----- .../main/java/org/eclipse/steady/kb/Manager.java | 10 ++++++---- .../eclipse/steady/kb/model/Vulnerability.java | 3 ++- .../eclipse/steady/kb/task/ExtractOrClone.java | 16 +++++++--------- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java index 576c5504e..216221797 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Import.java @@ -62,7 +62,7 @@ public String getVulnId() { @Override public void run() { - manager.setVulnStatus(vulnId, Manager.VulnStatus.EXTRACTING_OR_CLONING); + manager.setVulnStatus(vulnId, Manager.VulnStatus.STARTING); boolean bugExists = false; try { bugExists = this.backendConnector.isBugExisting(vulnId); @@ -107,8 +107,6 @@ public void run() { && (vuln.getArtifacts() == null || vuln.getArtifacts().size() == 0)) { log.warn("No fix commits or affected artifacts for vulnerability " + vuln.getVulnId()); vuln.setCommits(new ArrayList()); - //manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.NO_FIXES); - //return; } else { ExtractOrClone extractOrClone = new ExtractOrClone(this.manager, vuln, new File(this.vulnDir.toString()), (boolean) args.get(SKIP_CLONE_OPTION)); @@ -119,7 +117,7 @@ public void run() { if (manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.FAILED_EXTRACT_OR_CLONE && manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.SKIP_CLONE) { - //&& manager.getVulnStatus(vuln.getVulnId()) != Manager.VulnStatus.NO_FIXES) { + manager.setVulnStatus(vuln.getVulnId(), Manager.VulnStatus.IMPORTING); ImportVulnerability importVulnerability = new ImportVulnerability(); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java index 09e46cbbe..97623aa01 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/ImporterController.java @@ -41,7 +41,7 @@ public class ImporterController { @RequestMapping(value = "/start", method = RequestMethod.POST) public ResponseEntity start(@RequestParam(defaultValue = "false") boolean overwrite, @RequestParam(defaultValue = "false") boolean upload, - @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone, @RequestParam(defaultValue = "0") long refetchAllMs) { + @RequestParam(defaultValue = "false") boolean verbose, @RequestParam(defaultValue = "true") boolean skipClone, @RequestParam(defaultValue = "0") String refetchAllMs) { boolean started = false; try { if (this.manager.getIsRunningStart()) { @@ -55,8 +55,8 @@ public ResponseEntity start(@RequestParam(defaultValue = "false") boole args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); args.put(Import.VERBOSE_OPTION, verbose); args.put(Import.SKIP_CLONE_OPTION, skipClone); - if (refetchAllMs != 0) { - args.put(Import.TIME_REFETCH_ALL_OPTION, refetchAllMs); + if (Long.parseLong(refetchAllMs) != 0) { + args.put(Import.TIME_REFETCH_ALL_OPTION, Long.parseLong(refetchAllMs)); } else { args.put(Import.TIME_REFETCH_ALL_OPTION, defaultRefetchAllMs); } @@ -69,7 +69,7 @@ public void run() { manager.start("/kb-importer/data/statements", args); try { - Thread.sleep(Long.parseLong((String)args.get(Import.TIME_REFETCH_ALL_OPTION))); + Thread.sleep((long) args.get(Import.TIME_REFETCH_ALL_OPTION)); } catch (InterruptedException e) { ImporterController.log.error( "Interrupted exception: " @@ -128,7 +128,7 @@ public ResponseEntity importSingleVuln(@PathVariable String id, @Reques args.put(Import.UPLOAD_CONSTRUCT_OPTION, upload); args.put(Import.VERBOSE_OPTION, verbose); args.put(Import.SKIP_CLONE_OPTION, skipClone); - manager.importSingleVuln("/kb-importer/data/statements/"+id, args, id); + manager.importSingleVuln("/kb-importer/data/statements/" + id, args, id); return new ResponseEntity(true, HttpStatus.OK); } } catch (Exception e) { diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java index c7836b080..0050105a9 100644 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/Manager.java @@ -26,7 +26,7 @@ public class Manager { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); + private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(); private ThreadPoolExecutor executor = // new MyThreadExecutor(16, 32, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); @@ -45,14 +45,15 @@ public class Manager { public enum VulnStatus { NOT_STARTED, - EXTRACTING_OR_CLONING, + STARTING, + EXTRACTING, + CLONING, IMPORTING, IMPORTED, FAILED_EXTRACT_OR_CLONE, SKIP_CLONE, FAILED_IMPORT_LIB, - FAILED_IMPORT_VULN, - NO_FIXES + FAILED_IMPORT_VULN } public void addNewVulnerability(String vulnId) { @@ -140,6 +141,7 @@ public synchronized void start( try { executor.shutdown(); executor.awaitTermination(24, TimeUnit.HOURS); + log.info("Finished importing vulnerabilities"); } catch (InterruptedException e) { log.error("Process interrupted"); log.error(e.getMessage()); diff --git a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java index bb64a8288..684177f5a 100755 --- a/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java +++ b/kb-importer/src/main/java/org/eclipse/steady/kb/model/Vulnerability.java @@ -19,6 +19,7 @@ package org.eclipse.steady.kb.model; import java.util.List; +import java.util.ArrayList; import com.google.gson.annotations.SerializedName; /** @@ -34,7 +35,7 @@ public class Vulnerability { private List notes; private List aliases; - private List commits; + private List commits = new ArrayList(); /** *