diff --git a/fontus/src/main/java/com/sap/fontus/Main.java b/fontus/src/main/java/com/sap/fontus/Main.java index d3c14728..7f50f1a2 100644 --- a/fontus/src/main/java/com/sap/fontus/Main.java +++ b/fontus/src/main/java/com/sap/fontus/Main.java @@ -39,12 +39,7 @@ public final class Main implements Callable { ) private File outputFile; - @CommandLine.Option( - names = {"--instrumented-classes"}, - required = true, - paramLabel = "Instrumented Classes", - description = "Output file which contains a list of all instrumented classes" - ) + @CommandLine.Option(names = "--instrumented-classes", required = true, paramLabel = "Instrumented Classes", description = "Output file which contains a list of all instrumented classes") private File instrumentedClasses; @CommandLine.Option( diff --git a/fontus/src/main/java/com/sap/fontus/asm/resolver/AgentClassResolver.java b/fontus/src/main/java/com/sap/fontus/asm/resolver/AgentClassResolver.java index 0cb48d6a..f5eda719 100644 --- a/fontus/src/main/java/com/sap/fontus/asm/resolver/AgentClassResolver.java +++ b/fontus/src/main/java/com/sap/fontus/asm/resolver/AgentClassResolver.java @@ -11,7 +11,7 @@ /** * AgentClassResolvers have been split into the following hierarchy: - * + *

* IClassResolver * |-AgentClassResolver * |-CachingAgentClassResolver @@ -19,25 +19,25 @@ * |-BackgroundAgentClassResolver * |-SingleThreadAgentClassResolver * |-ParallelAgentClassResolver - * + *

* The AgentClassResolver is simple and keeps a single cache to itself for resolvedClasses. * No pre-loading is performed. - * + *

* The CachingAgentClassResolver attempts to pre-load classes from the classloader into * the BytecodeRegistry during the initialize() method. This can be performed either * on the calling thread or in the background. - * + *

* The CallingThreadAgentClassResolver pre-caches all classes using the calling thread during * initialization, which may block execution if there are a lot of classes to load or some * are unreachable. - * + *

* The BackgroundAgentClassResolver pre-caches classes using executors in two ways: - * + *

* The SingleThreadAgentClassResolver pre-loads classes using a single thread in the background, * but then wait for the thread to terminate, with a timeout. The behaviour should be similar to * that of the CallingThreadAgentClassResolver, except with a timeout. This resolver in some cases * caused execution to hang (until the timeout) which needs invesitgation. - * + *

* The ParallelAgentClassResolver loads classes using a thread pool, and does not wait for pre-caching * to complete before exiting the initialize method. */ diff --git a/fontus/src/main/java/com/sap/fontus/config/DataProtection.java b/fontus/src/main/java/com/sap/fontus/config/DataProtection.java index a963b0a0..cfc35fcb 100644 --- a/fontus/src/main/java/com/sap/fontus/config/DataProtection.java +++ b/fontus/src/main/java/com/sap/fontus/config/DataProtection.java @@ -29,9 +29,9 @@ public DataProtection() { } public DataProtection(List vendors, List purposes, List aborts) { - this.vendors = vendors.stream().map(vendor -> vendor.trim()).collect(Collectors.toList()); - this.purposes = purposes.stream().map(purpose -> purpose.trim()).collect(Collectors.toList()); - this.aborts = aborts.stream().map(abort -> abort.trim()).collect(Collectors.toList()); + this.vendors = vendors.stream().map(String::trim).toList(); + this.purposes = purposes.stream().map(String::trim).toList(); + this.aborts = aborts.stream().map(String::trim).toList(); } public List getVendors() { diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/Utils.java b/fontus/src/main/java/com/sap/fontus/gdpr/Utils.java index d5f58f0a..42bea2d5 100644 --- a/fontus/src/main/java/com/sap/fontus/gdpr/Utils.java +++ b/fontus/src/main/java/com/sap/fontus/gdpr/Utils.java @@ -55,8 +55,7 @@ private static A processGdprMetaData(IASTaintInformationable taintInformatio for(IASTaintRange range: taintRanges) { IASTaintMetadata meta = range.getMetadata(); - if(meta instanceof GdprTaintMetadata) { - GdprTaintMetadata gdprTaintMetadata = (GdprTaintMetadata) meta; + if(meta instanceof GdprTaintMetadata gdprTaintMetadata) { GdprMetadata gdprMetadata = gdprTaintMetadata.getMetadata(); accumulator = function.apply(accumulator, gdprMetadata); } @@ -73,8 +72,7 @@ public static boolean checkPolicyViolation(RequiredPurposes required, IASString PurposePolicy policy = new SimplePurposePolicy(); for (IASTaintRange range : tainted.getTaintInformation().getTaintRanges(tainted.getString().length())) { // Check policy for each range - if (range.getMetadata() instanceof GdprTaintMetadata) { - GdprTaintMetadata taintMetadata = (GdprTaintMetadata) range.getMetadata(); + if (range.getMetadata() instanceof GdprTaintMetadata taintMetadata) { GdprMetadata metadata = taintMetadata.getMetadata(); if (!policy.areRequiredPurposesAllowed(required, metadata.getAllowedPurposes())) { return true; @@ -125,13 +123,13 @@ public static boolean updateExpiryDatesAndProtectionLevel(IASTaintAware taintAwa gdprData.setProtectionLevel(protectionLevel); for(AllowedPurpose purpose : gdprData.getAllowedPurposes()) { purpose.setExpiryDate(expiryDate); - acc = true; + } - return acc; + return true; }); } - private static final Cache> cookieCache = Caffeine.newBuilder().build();; + private static final Cache> cookieCache = Caffeine.newBuilder().build(); public static Collection getPurposesFromRequest(ReflectedHttpServletRequest servlet) { ReflectedCookie[] cookies = servlet.getCookies(); @@ -159,8 +157,8 @@ public static Pair censorContestedParts(IASTaintAware ta StringBuilder sb = new StringBuilder(s.getString()); for (IASTaintRange range : s.getTaintInformation().getTaintRanges(s.length())) { IASTaintMetadata meta = range.getMetadata(); - if(meta instanceof GdprTaintMetadata) { - GdprMetadata gdprMetadata = ((GdprTaintMetadata) meta).getMetadata(); + if(meta instanceof GdprTaintMetadata gdprTaintMetadata) { + GdprMetadata gdprMetadata = gdprTaintMetadata.getMetadata(); if(!gdprMetadata.isProcessingUnrestricted()) { contested = true; for (int i = range.getStart(); i < range.getEnd(); i++) { diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/broadleaf/BroadleafTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/broadleaf/BroadleafTaintHandler.java index 9fe28591..b0486182 100644 --- a/fontus/src/main/java/com/sap/fontus/gdpr/broadleaf/BroadleafTaintHandler.java +++ b/fontus/src/main/java/com/sap/fontus/gdpr/broadleaf/BroadleafTaintHandler.java @@ -205,7 +205,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O * @param object The object to be tainted * @param sourceId The ID of the taint source function * @return The tainted object - * + *

* This snippet of XML can be added to the source: *

          * {@code
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookie.java b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookie.java
index f6210055..1ffe5930 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookie.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookie.java
@@ -36,7 +36,7 @@ public ConsentCookie() {
         this.created = Instant.now().getEpochSecond();
 
     }
-    private static final Cache cookieCache = Caffeine.newBuilder().build();;
+    private static final Cache cookieCache = Caffeine.newBuilder().build();
 
     @Override
     public int hashCode() {
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookieMetadata.java b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookieMetadata.java
index 34524367..dc2aa00a 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookieMetadata.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/ConsentCookieMetadata.java
@@ -18,7 +18,7 @@ public final class ConsentCookieMetadata {
 
     private ConsentCookieMetadata() {
     }
-    private static final Cache> purposeCache = Caffeine.newBuilder().build();;
+    private static final Cache> purposeCache = Caffeine.newBuilder().build();
 
     public static Collection getAllowedPurposesFromConsentCookie(ConsentCookie cookie) {
         return purposeCache.get(cookie, (ignored)-> {
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/Purpose.java b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/Purpose.java
index 9212c5f2..e0ee686b 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/cookie/Purpose.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/cookie/Purpose.java
@@ -3,7 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-class Purpose {
+public class Purpose {
     private String id;
     private List vendors;
 
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprAbort.java b/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprAbort.java
index 7a380ec2..a5c4a5bf 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprAbort.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprAbort.java
@@ -38,9 +38,8 @@ public IASTaintAware abort(IASTaintAware taintAware, Object instance, String sin
         boolean policyViolation = false;
         for (IASTaintRange range : taintedString.getTaintInformation().getTaintRanges(taintedString.getString().length())) {
             // Check policy for each range
-            if (range.getMetadata() instanceof GdprTaintMetadata) {
-                GdprTaintMetadata taintMetadata = (GdprTaintMetadata) range.getMetadata();
-                GdprMetadata metadata = taintMetadata.getMetadata();
+            if (range.getMetadata() instanceof GdprTaintMetadata gdprTaintMetadata) {
+                GdprMetadata metadata = gdprTaintMetadata.getMetadata();
                 if (!policy.areRequiredPurposesAllowed(requiredPurposes, metadata.getAllowedPurposes())) {
                     policyViolation = true;
                 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprTaintHandler.java
index a0980ae9..3f1c5ba1 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/handler/GdprTaintHandler.java
@@ -75,7 +75,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/jforum2/JForum2TaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/jforum2/JForum2TaintHandler.java
index dc9bd18d..c5b41eeb 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/jforum2/JForum2TaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/jforum2/JForum2TaintHandler.java
@@ -1,10 +1,8 @@
 package com.sap.fontus.gdpr.jforum2;
 
 import com.sap.fontus.config.Configuration;
-import com.sap.fontus.config.DataProtection;
 import com.sap.fontus.config.Sink;
 import com.sap.fontus.config.Source;
-import com.sap.fontus.config.abort.Abort;
 import com.sap.fontus.gdpr.Utils;
 import com.sap.fontus.gdpr.metadata.*;
 import com.sap.fontus.gdpr.metadata.registry.RequiredPurposeRegistry;
@@ -12,7 +10,6 @@
 import com.sap.fontus.gdpr.metadata.simple.SimpleDataSubject;
 import com.sap.fontus.gdpr.metadata.simple.SimpleGdprMetadata;
 import com.sap.fontus.gdpr.metadata.simple.SimplePurposePolicy;
-import com.sap.fontus.gdpr.openmrs.OpenMrsTaintHandler;
 import com.sap.fontus.gdpr.servlet.ReflectedCookie;
 import com.sap.fontus.gdpr.servlet.ReflectedHttpServletRequest;
 import com.sap.fontus.gdpr.servlet.ReflectedSession;
@@ -24,7 +21,6 @@
 import com.sap.fontus.taintaware.unified.IASString;
 import com.sap.fontus.taintaware.unified.IASTaintHandler;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 
 public class JForum2TaintHandler extends IASTaintHandler {
@@ -84,8 +80,7 @@ public static IASTaintAware handleEmailTaint(IASTaintAware taintAware, Object in
             IASString tainted = taintAware.toIASString();
             for (IASTaintRange range : tainted.getTaintInformation().getTaintRanges(tainted.length())) {
                 // Check policy for each range
-                if (range.getMetadata() instanceof GdprTaintMetadata) {
-                    GdprTaintMetadata taintMetadata = (GdprTaintMetadata) range.getMetadata();
+                if (range.getMetadata() instanceof GdprTaintMetadata taintMetadata) {
                     GdprMetadata metadata = taintMetadata.getMetadata();
                     if (!policy.areRequiredPurposesAllowed(rp, metadata.getAllowedPurposes())) {
                         StringBuilder sb = new StringBuilder(50);
@@ -93,7 +88,7 @@ public static IASTaintAware handleEmailTaint(IASTaintAware taintAware, Object in
                             sb.append(ap);
                             sb.append(", ");
                         }
-                        System.out.printf("Policy violation for %s!%nRequired: %s, got %s", tainted.getString(), rp, sb.toString());
+                        System.out.printf("Policy violation for %s!%nRequired: %s, got %s", tainted.getString(), rp, sb);
                         return null;
                     }
                 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/AllowedPurpose.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/AllowedPurpose.java
index a890df1a..2c0b923b 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/AllowedPurpose.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/AllowedPurpose.java
@@ -4,10 +4,10 @@
 
 public interface AllowedPurpose {
 
-    public ExpiryDate getExpiryDate();
-    public void setExpiryDate(ExpiryDate expiryDate);
-    public Purpose getAllowedPurpose();
+    ExpiryDate getExpiryDate();
+    void setExpiryDate(ExpiryDate expiryDate);
+    Purpose getAllowedPurpose();
 
-    public Set getAllowedVendors();
+    Set getAllowedVendors();
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataId.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataId.java
index d22aa117..d4fc77a0 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataId.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataId.java
@@ -4,6 +4,6 @@
 
 public interface DataId {
 
-    public UUID getUUID();
+    UUID getUUID();
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataSubject.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataSubject.java
index c86988f1..f4578e8f 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataSubject.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/DataSubject.java
@@ -3,6 +3,6 @@
 
 public interface DataSubject {
 
-    public String getIdentifier();
+    String getIdentifier();
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/ExpiryDate.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/ExpiryDate.java
index f59dd88d..b580d1ad 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/ExpiryDate.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/ExpiryDate.java
@@ -4,8 +4,8 @@
 
 public interface ExpiryDate extends Comparable {
 
-    public Instant getDate();
+    Instant getDate();
 
-    public boolean hasExpiry();
+    boolean hasExpiry();
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadata.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadata.java
index 95f87b3c..8637ba1c 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadata.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadata.java
@@ -7,44 +7,44 @@ public interface GdprMetadata {
     // List of allowed purposes for a given receiver, together with expiry information
     // Metadatum 1
     // TCF - getAllowedPurposes and getAllowedVendorIds
-    public Collection getAllowedPurposes();
+    Collection getAllowedPurposes();
 
     // Level of protection required, e.g. sensitive medical data
     // Metadatum 2
-    public ProtectionLevel getProtectionLevel();
+    ProtectionLevel getProtectionLevel();
 
     // The data subject needs to be identified
     // Metadatum 3
     // Enables Subject Access Request as per GDPR Article 15
-    public Collection getSubjects();
+    Collection getSubjects();
 
     // Unique ID to uniquely identify this piece of data
     // Metadatum 4
     // Allows e.g. logging of which data has been sent to whom
-    public DataId getId();
+    DataId getId();
 
     // Is the data portable?
     // Metadatum 5
     // Maps to GDPR Article 20
     // Data requested to be shared by the data subject with a third party
     // All data which is directly input by the user (not those which have been processed)
-    public boolean isQualifiedForPortability();
+    boolean isQualifiedForPortability();
 
     // Is processing restricted?
     // Metadatum 6
     // Is unrestricted processing allowed on this data?
     // Processing might be restricted e.g. due to inaccurate data, which needs to be corrected.
     // Maps to GDPR Article 18
-    public boolean isProcessingUnrestricted();
+    boolean isProcessingUnrestricted();
 
     // Can the data be used to directly identify a person?
     // Explicit / not explicit
     // Metadatum 7
-    public Identifiability isIdentifiable();
+    Identifiability isIdentifiable();
 
     // Switches Metadatum 6 to true
-    public void restrictProcessing();
+    void restrictProcessing();
 
-    public void setProtectionLevel(ProtectionLevel protectionLevel);
+    void setProtectionLevel(ProtectionLevel protectionLevel);
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadataConflictResolverInterface.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadataConflictResolverInterface.java
index 0fdfef65..73c2803e 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadataConflictResolverInterface.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/GdprMetadataConflictResolverInterface.java
@@ -6,6 +6,6 @@
  */
 public interface GdprMetadataConflictResolverInterface {
 
-    public GdprMetadata resolveConflicts(GdprMetadata first, GdprMetadata second);
+    GdprMetadata resolveConflicts(GdprMetadata first, GdprMetadata second);
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/RequiredPurposes.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/RequiredPurposes.java
index 5f7a0846..9266fc43 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/RequiredPurposes.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/RequiredPurposes.java
@@ -5,11 +5,11 @@
 
 public interface RequiredPurposes {
 
-    public Collection getPurposes();
+    Collection getPurposes();
 
-    public Collection getVendors();
+    Collection getVendors();
 
-    public static class EmptyRequiredPurposes implements RequiredPurposes {
+    class EmptyRequiredPurposes implements RequiredPurposes {
         @Override
         public Collection getPurposes() {
             return Collections.emptyList();
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/Vendor.java b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/Vendor.java
index 55833594..627e7d92 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/metadata/Vendor.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/metadata/Vendor.java
@@ -4,8 +4,8 @@
 
 public interface Vendor extends NamedObject {
 
-    public int getId();
+    int getId();
 
-    public String getName();
+    String getName();
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/oh/OpenHospitalTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/oh/OpenHospitalTaintHandler.java
index fa201599..03f80093 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/oh/OpenHospitalTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/oh/OpenHospitalTaintHandler.java
@@ -154,7 +154,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

@@ -186,8 +186,7 @@ public static IASTaintAware applyPolicy(IASTaintAware taintAware, Object instanc
             boolean policyViolation = false;
             for (IASTaintRange range : taintedString.getTaintInformation().getTaintRanges(taintedString.getString().length())) {
                 // Check policy for each range
-                if (range.getMetadata() instanceof GdprTaintMetadata) {
-                    GdprTaintMetadata taintMetadata = (GdprTaintMetadata) range.getMetadata();
+                if (range.getMetadata() instanceof GdprTaintMetadata taintMetadata) {
                     GdprMetadata metadata = taintMetadata.getMetadata();
                     if (!policy.areRequiredPurposesAllowed(requiredPurposes, metadata.getAllowedPurposes())) {
                         policyViolation = true;
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/openmrs/OpenMrsTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/openmrs/OpenMrsTaintHandler.java
index df9e92fc..129dfac8 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/openmrs/OpenMrsTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/openmrs/OpenMrsTaintHandler.java
@@ -256,8 +256,7 @@ private static IASTaintAware setDiagnosisTaint(IASTaintAware taintAware, Object
         if (jsonList.isTainted()) {
             IASTaintMetadata metadata = jsonList.getTaintInformation().getTaint(0);
             // As a diagnosis is sensitive information, set the appropriate bit:
-            if (metadata instanceof GdprTaintMetadata) {
-                GdprTaintMetadata gdprMetadata = (GdprTaintMetadata) metadata;
+            if (metadata instanceof GdprTaintMetadata gdprMetadata) {
                 gdprMetadata.getMetadata().setProtectionLevel(ProtectionLevel.Sensitive);
             } else {
                 System.err.println("Metadata is not of type GdprTaintMetadata! Actual type: " + metadata.getClass());
@@ -273,7 +272,7 @@ private static IASTaintAware setDiagnosisTaint(IASTaintAware taintAware, Object
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

@@ -309,8 +308,7 @@ public static IASTaintAware applyPolicy(IASTaintAware taintAware, Object instanc
             boolean policyViolation = false;
             for (IASTaintRange range : taintedString.getTaintInformation().getTaintRanges(taintedString.getString().length())) {
                 // Check policy for each range
-                if (range.getMetadata() instanceof GdprTaintMetadata) {
-                    GdprTaintMetadata taintMetadata = (GdprTaintMetadata) range.getMetadata();
+                if (range.getMetadata() instanceof GdprTaintMetadata taintMetadata) {
                     GdprMetadata metadata = taintMetadata.getMetadata();
                     if (!policy.areRequiredPurposesAllowed(requiredPurposes, metadata.getAllowedPurposes())) {
                         policyViolation = true;
@@ -345,11 +343,6 @@ public static RequiredPurposes getRequiredPurposesFromStackTrace(StackTraceEleme
 
     /**
      * This is called for sink functions
-     * @param taintAware
-     * @param instance
-     * @param sinkFunction
-     * @param sinkName
-     * @return
      */
     public static IASTaintAware handleTaint(IASTaintAware taintAware, Object instance, String sinkFunction, String sinkName, String callerFunction) {
         boolean isTainted = taintAware.isTainted();
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/petclinic/PetClinicTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/petclinic/PetClinicTaintHandler.java
index a4ba2a16..c02370f9 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/petclinic/PetClinicTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/petclinic/PetClinicTaintHandler.java
@@ -101,7 +101,7 @@ private static GdprMetadata getMetadataFromPetRequest(ReflectedHttpServletReques
             // See if we can retrieve original the name using the PetClinic interface...
             String idMatch = m.group(1);
             // Let it throw...
-            int id = Integer.valueOf(idMatch);
+            int id = Integer.parseInt(idMatch);
             // Can we get the Owner object corresponding to this?
             metadata = new SimpleGdprMetadata(
                     Utils.getPurposesFromRequest(servlet),
@@ -208,7 +208,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/sap/SapCloudTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/sap/SapCloudTaintHandler.java
index 681a3c5a..c170afb5 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/sap/SapCloudTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/sap/SapCloudTaintHandler.java
@@ -91,7 +91,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
 
             // Add taint information if match was found
             if (metadata != null) {
-                System.out.println("Adding Taint metadata to string '" + taintAware.toString() + "': " + metadata);
+                System.out.println("Adding Taint metadata to string '" + taintAware + "': " + metadata);
                 taintAware.setTaint(new GdprTaintMetadata(sourceId, metadata));
             }
         }
@@ -103,7 +103,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/servlet/ReflectedHttpServletRequest.java b/fontus/src/main/java/com/sap/fontus/gdpr/servlet/ReflectedHttpServletRequest.java
index 2b696efa..e74b4932 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/servlet/ReflectedHttpServletRequest.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/servlet/ReflectedHttpServletRequest.java
@@ -38,7 +38,7 @@ public IASString getHeader(IASString name) {
     }
 
     public String getHeader(String name) {
-        IASString h = name == null ? null : getHeader(new IASString(name));
+        IASString h = name == null ? null : this.getHeader(new IASString(name));
         return h == null ? null : h.getString();
     }
 
@@ -62,7 +62,7 @@ public IASString getMethod() {
     }
 
     public String getMethodString() {
-        return getMethod().getString();
+        return this.getMethod().getString();
     }
     
     public IASString getPathInfo() {
@@ -319,17 +319,17 @@ public String toString() {
 	    sb.append("Object is null!");
 	} else {
 	    sb.append("URL: " + this.getRequestURL());
-	    sb.append(System.getProperty("line.separator"));
+	    sb.append(System.lineSeparator());
 
 	    sb.append("PathInfo: " + this.getPathInfo());
-	    sb.append(System.getProperty("line.separator"));
+	    sb.append(System.lineSeparator());
 
 	    sb.append("URI: " + this.getRequestURI());
-	    sb.append(System.getProperty("line.separator"));
+	    sb.append(System.lineSeparator());
 
 	    Enumeration e = this.getParameterNames();
 	    sb.append("Query Parameters:");
-        sb.append(System.getProperty("line.separator"));
+        sb.append(System.lineSeparator());
         if (e == null) {
             sb.append("NULL");
         } else {
@@ -339,46 +339,46 @@ public String toString() {
                 for (IASString value : this.getParameterValues(s)) {
                     sb.append(value.getString() + ", ");
                 }
-                sb.append(System.getProperty("line.separator"));
+                sb.append(System.lineSeparator());
             }
         }
-        sb.append(System.getProperty("line.separator"));
+        sb.append(System.lineSeparator());
 
         Enumeration h = this.getHeaderNames();
         sb.append("Headers:");
-        sb.append(System.getProperty("line.separator"));
+        sb.append(System.lineSeparator());
         if (h == null) {
             sb.append("NULL");
         } else {
             while (h.hasMoreElements()) {
                 IASString s = (IASString) h.nextElement();
                 sb.append(s.getString() + " = ");
-                IASString header = getHeader(s);
+                IASString header = this.getHeader(s);
                 sb.append(header.getString() + ", ");
-                sb.append(System.getProperty("line.separator"));
+                sb.append(System.lineSeparator());
             }
         }
-        sb.append(System.getProperty("line.separator"));
+        sb.append(System.lineSeparator());
 
         Enumeration a = this.getAttributeNames();
 	    sb.append("Attributes:");
-	    sb.append(System.getProperty("line.separator"));
+	    sb.append(System.lineSeparator());
 	    if (a == null) {
 		sb.append("NULL");
 	    } else {
 		while (a.hasMoreElements()) {
 		    IASString s = (IASString) a.nextElement();
 		    sb.append(s.getString() + " = " + this.getAttribute(s));
-		    sb.append(System.getProperty("line.separator"));
+		    sb.append(System.lineSeparator());
 		}
 	    }
 	    ReflectedCookie[] cookies = this.getCookies();
 	    sb.append("Cookies: " + Arrays.toString(cookies));
-	    sb.append(System.getProperty("line.separator"));
+	    sb.append(System.lineSeparator());
 	    if (cookies != null) {
 		for (ReflectedCookie cookie : cookies) {
 		    sb.append(cookie.toString());
-		    sb.append(System.getProperty("line.separator"));
+		    sb.append(System.lineSeparator());
 		}
 	    }
 	}
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/sflight/SflightTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/sflight/SflightTaintHandler.java
index c2cbbd0a..d18a5798 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/sflight/SflightTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/sflight/SflightTaintHandler.java
@@ -80,10 +80,8 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
             GdprMetadata metadata = createUserNameMetadata(taintAware.toIASString().getString(), parameters[0]);
 
             // Add taint information if match was found
-            if (metadata != null) {
-                System.out.println("Adding Taint metadata to string '" + taintAware.toString() + "': " + metadata);
-                taintAware.setTaint(new GdprTaintMetadata(sourceId, metadata));
-            }
+            System.out.println("Adding Taint metadata to string '" + taintAware + "': " + metadata);
+            taintAware.setTaint(new GdprTaintMetadata(sourceId, metadata));
         }
         return taintAware;
     }
diff --git a/fontus/src/main/java/com/sap/fontus/gdpr/tcf/TcfTaintHandler.java b/fontus/src/main/java/com/sap/fontus/gdpr/tcf/TcfTaintHandler.java
index 94bf2fb8..10ba8c14 100644
--- a/fontus/src/main/java/com/sap/fontus/gdpr/tcf/TcfTaintHandler.java
+++ b/fontus/src/main/java/com/sap/fontus/gdpr/tcf/TcfTaintHandler.java
@@ -59,7 +59,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parent, O
      * @param object The object to be tainted
      * @param sourceId The ID of the taint source function
      * @return The tainted object
-     *
+     * 

* This snippet of XML can be added to the source: * *

diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/ClassTaintingVisitor.java b/fontus/src/main/java/com/sap/fontus/instrumentation/ClassTaintingVisitor.java
index 58981c2a..5fd863c9 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/ClassTaintingVisitor.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/ClassTaintingVisitor.java
@@ -283,7 +283,7 @@ private void generateProxyToInstrumented(MethodVisitor mv, String instrumentedNa
         // TODO Handle lists
         int register = 0;
 
-        if (!lambdaCall.isPresent() || (!lambdaCall.get().isStaticCall() && !lambdaCall.get().isConstructorCall())) {
+        if (lambdaCall.isEmpty() || (!lambdaCall.get().isStaticCall() && !lambdaCall.get().isConstructorCall())) {
             mv.visitVarInsn(Opcodes.ALOAD, 0);
             register++;
         }
@@ -532,7 +532,7 @@ private void declareMissingJdkMethods() {
                 .filter(method -> this.shouldBeInstrumented(method.getDescriptor()))
                 .filter(method -> !Modifier.isStatic(method.getAccess()))
                 .filter(method -> !MethodUtils.isToString(method.getName(), method.getDescriptor()))
-                .collect(Collectors.toList());
+                .toList();
         methods.forEach(this::createJdkDeclaring);
     }
 
@@ -563,7 +563,7 @@ private void overrideMissingJdkMethods() {
                 .filter(method -> !this.containsOverriddenJdkMethod(method))
                 .filter(method -> this.shouldBeInstrumented(method.getDescriptor()))
                 //.filter(method -> !Modifier.isStatic(method.getAccess()))
-                .collect(Collectors.toList());
+                .toList();
         methods.forEach(this::createInstrumentedJdkProxy);
     }
 
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/CompatHelper.java b/fontus/src/main/java/com/sap/fontus/instrumentation/CompatHelper.java
index eacb117a..65bcbc66 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/CompatHelper.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/CompatHelper.java
@@ -1,19 +1,13 @@
 package com.sap.fontus.instrumentation;
 
-import com.sap.fontus.Constants;
 import com.sap.fontus.instrumentation.compat.SqliteCollation;
 import com.sap.fontus.instrumentation.compat.SqliteDB;
 import com.sap.fontus.instrumentation.compat.SqliteNativeDB;
-import com.sap.fontus.taintaware.unified.IASString;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
 
-import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
 
-public class CompatHelper {
-    private ConcurrentHashMap implementations;
+public final class CompatHelper {
+    private final ConcurrentHashMap implementations;
 
     private CompatHelper() {
         this.implementations = new ConcurrentHashMap<>();
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/InstrumenterInterface.java b/fontus/src/main/java/com/sap/fontus/instrumentation/InstrumenterInterface.java
index 8b604176..983708d5 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/InstrumenterInterface.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/InstrumenterInterface.java
@@ -2,6 +2,6 @@
 
 public interface InstrumenterInterface {
 
-    public byte[] instrumentClassByteArray(byte[] classfileBuffer, ClassLoader loader, String className);
+    byte[] instrumentClassByteArray(byte[] classfileBuffer, ClassLoader loader, String className);
 
 }
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/LambdaCall.java b/fontus/src/main/java/com/sap/fontus/instrumentation/LambdaCall.java
index 1958550f..77dbac2b 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/LambdaCall.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/LambdaCall.java
@@ -6,7 +6,6 @@
 import com.sap.fontus.asm.resolver.IClassResolver;
 import com.sap.fontus.utils.ClassTraverser;
 import com.sap.fontus.asm.resolver.ClassResolverFactory;
-import com.sap.fontus.utils.lookups.AnnotationLookup;
 import com.sap.fontus.utils.lookups.CombinedExcludedLookup;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Opcodes;
@@ -17,7 +16,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 public class LambdaCall implements Serializable {
     /**
@@ -74,7 +72,7 @@ public Descriptor getProxyDescriptor(ClassLoader loader, InstrumentationHelper i
                 .filter((m) -> (m.getAccess() & Opcodes.ACC_ABSTRACT) != 0)
                 .filter((m) -> !Constants.ObjectQN.equals(m.getOwner()))
                 .filter((m) -> objMethods.stream().noneMatch(om -> m.getName().equals(om.getName()) && m.getDescriptor().equals(om.getDescriptor())))
-                .collect(Collectors.toList());
+                .toList();
 
         int enclosedCount;
         if (methods.size() > 1) {
@@ -96,7 +94,7 @@ public Descriptor getProxyDescriptor(ClassLoader loader, InstrumentationHelper i
 
         // Type.getDescriptor will give a class name back like Ljava/lang/Integer; so need to convert it
         // Also check whether the class is an annotation, which we also do not instrument, and therefore need to proxy
-        String descriptor = Descriptor.removeLeadingLandTrailingSemiColon(getConcreteOrOwnerImplementation().getDescriptor());
+        String descriptor = Descriptor.removeLeadingLandTrailingSemiColon(this.getConcreteOrOwnerImplementation().getDescriptor());
         if (lookup.isPackageExcludedOrJdkOrAnnotation(descriptor)) {
             return this.generateProxyToJdkDescriptor(instrumentationHelper);
         } else {
@@ -111,7 +109,7 @@ private Descriptor generateProxyToJdkDescriptor(InstrumentationHelper instrument
         List proxyParameters = new ArrayList<>(implementationDesc.parameterCount());
 
         if (this.isInstanceCall()) {
-            String concreteOwnerOrImplementation = getConcreteOrOwnerImplementation().getDescriptor();
+            String concreteOwnerOrImplementation = this.getConcreteOrOwnerImplementation().getDescriptor();
             String instrumentedConcreteOwnerOrImplementation = instrumentationHelper.instrument(concreteOwnerOrImplementation);
             proxyParameters.add(instrumentedConcreteOwnerOrImplementation);
         }
@@ -152,7 +150,7 @@ private Descriptor generateProxyToInstrumentedDescriptor(int enclosedCount, Inst
         List mergedParameters = new ArrayList<>(implementationDesc.parameterCount());
 
         if (this.isInstanceCall()) {
-            String concreteOwnerOrImplementation = getConcreteOrOwnerImplementation().getDescriptor();
+            String concreteOwnerOrImplementation = this.getConcreteOrOwnerImplementation().getDescriptor();
             String instrumentedConcreteOwnerOrImplementation = instrumentationHelper.instrument(concreteOwnerOrImplementation);
             mergedParameters.add(instrumentedConcreteOwnerOrImplementation);
         }
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingUtils.java b/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingUtils.java
index 68f8d472..f95ea27f 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingUtils.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingUtils.java
@@ -114,18 +114,16 @@ void invokeVisitLambdaCall(MethodVisitor mv,
         Descriptor desc = Descriptor.parseDescriptor(descriptor);
         Handle realFunction = (Handle) bootstrapMethodArguments[1];
 
-        boolean isExcludedOrJdk = needsLambdaProxy(descriptor, realFunction, (Type) bootstrapMethodArguments[2], instrumentationHelper);
+        boolean isExcludedOrJdk = this.needsLambdaProxy(descriptor, realFunction, (Type) bootstrapMethodArguments[2], instrumentationHelper);
 
         Object[] bsArgs;
         if (!isExcludedOrJdk) {
             bsArgs = new Object[bootstrapMethodArguments.length];
             for (int i = 0; i < bootstrapMethodArguments.length; i++) {
                 Object arg = bootstrapMethodArguments[i];
-                if (arg instanceof Handle) {
-                    Handle a = (Handle) arg;
+                if (arg instanceof Handle a) {
                     bsArgs[i] = Utils.instrumentHandle(a, instrumentationHelper);
-                } else if (arg instanceof Type) {
-                    Type a = (Type) arg;
+                } else if (arg instanceof Type a) {
                     if (a.getSort() == Type.OBJECT) {
                         bsArgs[i] = Type.getObjectType(instrumentationHelper.instrumentQN(a.getInternalName()));
                     } else {
@@ -137,7 +135,7 @@ void invokeVisitLambdaCall(MethodVisitor mv,
             }
         } else {
             bsArgs = bootstrapMethodArguments.clone();
-            if (lookup.isPackageExcludedOrJdk(lambdaCall.getImplementation().getOwner())) {
+            if (this.lookup.isPackageExcludedOrJdk(lambdaCall.getImplementation().getOwner())) {
                 bsArgs[0] = Utils.instrumentType((Type) bsArgs[0], instrumentationHelper);
                 bsArgs[2] = Utils.instrumentType((Type) bsArgs[2], instrumentationHelper);
             }
@@ -150,6 +148,6 @@ void invokeVisitLambdaCall(MethodVisitor mv,
     }
 
     public boolean needsLambdaProxy(String descriptor, Handle realFunction, Type concreteDescriptor, InstrumentationHelper instrumentationHelper) {
-        return isFunctionalInterfaceJdkOrExcluded(descriptor) || (!instrumentationHelper.canHandleType(Type.getObjectType(realFunction.getOwner()).getDescriptor()) && isMethodReferenceJdkOrExcluded(realFunction));
+        return this.isFunctionalInterfaceJdkOrExcluded(descriptor) || (!instrumentationHelper.canHandleType(Type.getObjectType(realFunction.getOwner()).getDescriptor()) && this.isMethodReferenceJdkOrExcluded(realFunction));
     }
 }
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingVisitor.java b/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingVisitor.java
index 6087cdf0..c75984c8 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingVisitor.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/MethodTaintingVisitor.java
@@ -37,7 +37,7 @@ public class MethodTaintingVisitor extends BasicMethodVisitor {
 
     private int line;
 
-    private MethodProxies methodProxies;
+    private final MethodProxies methodProxies;
     private final MethodTaintingUtils utils;
     /**
      * Some dynamic method invocations can't be handled generically. Add proxy functions here.
@@ -106,7 +106,7 @@ public void visitLocalVariable(String name, String descriptor, String signature,
     }
 
     /**
-     * See https://stackoverflow.com/questions/47674972/getting-the-number-of-local-variables-in-a-method
+     * See ...
      * for keeping track of used locals..
      */
     @Override
@@ -565,8 +565,7 @@ public void visitLdcInsn(Object value) {
             return;
         }
 
-        if (value instanceof Type) {
-            Type type = (Type) value;
+        if (value instanceof Type type) {
             int sort = type.getSort();
             if (sort == Type.OBJECT) {
                 if (this.instrumentationHelper.handleLdcType(this.mv, type)) {
@@ -640,8 +639,8 @@ public void visitInvokeDynamicInsn(
 
             for(int i = 0; i < bootstrapMethodArguments.length; i++) {
                 Object o = bootstrapMethodArguments[i];
-                if (o instanceof Handle) {
-                    bootstrapMethodArguments[i] = Utils.instrumentHandle((Handle) o, instrumentationHelper);
+                if (o instanceof Handle h) {
+                    bootstrapMethodArguments[i] = Utils.instrumentHandle(h, this.instrumentationHelper);
                 }
             }
             super.visitInvokeDynamicInsn(name, desc, instrumentedOriginalHandle, bootstrapMethodArguments);
diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/TaintingUtils.java b/fontus/src/main/java/com/sap/fontus/instrumentation/TaintingUtils.java
index 36343323..fbb54a66 100644
--- a/fontus/src/main/java/com/sap/fontus/instrumentation/TaintingUtils.java
+++ b/fontus/src/main/java/com/sap/fontus/instrumentation/TaintingUtils.java
@@ -17,7 +17,7 @@ private TaintingUtils() {
 
     /**
      * Converts a potentially untainted type on the stack to its untainted version.
-     *
+     * 

* We try to insert "correct" conversion calls instead of calling the generic ConversionUtils here. * * @param sourceType The target type @@ -32,7 +32,7 @@ public static void convertTypeToUntainted(String sourceType, String targetType, /** * Converts a potentially tainted type on the stack to its untainted version. - * + *

* We try to insert "correct" conversion calls instead of calling the generic ConversionUtils here. * * @param source The target type @@ -50,7 +50,7 @@ public static void convertTypeToUntainted(Type source, Type target, MethodVisito /** * Converts a potentially untainted type on the stack to its tainted version. - * + *

* We try to insert "correct" conversion calls instead of calling the generic ConversionUtils here. * * @param source The target type diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteCollation.java b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteCollation.java index 41f4a8d1..7ebefbac 100644 --- a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteCollation.java +++ b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteCollation.java @@ -14,12 +14,12 @@ public class SqliteCollation implements CompatHelper.CompatImplementation { @Override public String getAffects() { - return affects; + return this.affects; } @Override public void apply(String owner, MethodVisitorCreator methodVisitorCreator) { - assert "org/sqlite/Collation".equals(owner); + assert this.affects.equals(owner); MethodVisitor mv = methodVisitorCreator.create(Opcodes.ACC_PUBLIC, "xCompare", Type.getMethodDescriptor(Type.INT_TYPE, Type.getType(String.class), Type.getType(String.class)), null, null); mv.visitCode(); createSqliteXCompareProxy(mv, owner); diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteDB.java b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteDB.java index 786f9e6d..72bf0be7 100644 --- a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteDB.java +++ b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteDB.java @@ -14,12 +14,13 @@ public class SqliteDB implements CompatHelper.CompatImplementation { @Override public String getAffects() { - return affects; + return this.affects; } @Override public void apply(String owner, MethodVisitorCreator methodVisitorCreator) { - createOnUpdate(methodVisitorCreator, owner); + assert this.affects.equals(owner); + this.createOnUpdate(methodVisitorCreator, owner); } private void createOnUpdate(MethodVisitorCreator methodVisitorCreator, String owner) { diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteNativeDB.java b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteNativeDB.java index 0f1e6ddf..d228a58f 100644 --- a/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteNativeDB.java +++ b/fontus/src/main/java/com/sap/fontus/instrumentation/compat/SqliteNativeDB.java @@ -14,11 +14,12 @@ public class SqliteNativeDB implements CompatHelper.CompatImplementation { @Override public String getAffects() { - return affects; + return this.affects; } @Override public void apply(String owner, MethodVisitorCreator methodVisitorCreator) { + assert this.affects.equals(owner); createSqliteXThrowEx(methodVisitorCreator, owner); createSqliteStringToUtf8ByteArray(methodVisitorCreator, owner); } diff --git a/fontus/src/main/java/com/sap/fontus/instrumentation/transformer/ReturnTransformation.java b/fontus/src/main/java/com/sap/fontus/instrumentation/transformer/ReturnTransformation.java index b7859729..d647f45e 100644 --- a/fontus/src/main/java/com/sap/fontus/instrumentation/transformer/ReturnTransformation.java +++ b/fontus/src/main/java/com/sap/fontus/instrumentation/transformer/ReturnTransformation.java @@ -24,11 +24,11 @@ public interface ReturnTransformation { * Does the transformation require the input parameters to the method as local variables? * This is the case with a taint source, which requires the input parameters to have been added * in order to add them to the taint handler. - * + *

* In most cases this will be false. It only needs to be true if the transformer exepects * additional local variables to be present. * - * @return + * @return Does the transformation require the input parameters to the method as local variables? */ boolean requireParameterVariableLocals(); diff --git a/fontus/src/main/java/com/sap/fontus/sql/driver/PreparedStatementWrapper.java b/fontus/src/main/java/com/sap/fontus/sql/driver/PreparedStatementWrapper.java index dbf9c124..bdb06257 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/driver/PreparedStatementWrapper.java +++ b/fontus/src/main/java/com/sap/fontus/sql/driver/PreparedStatementWrapper.java @@ -581,12 +581,11 @@ private void setTaint(IASString value, int parameterIndex) throws SQLException { @Override public void setTObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { TaintAssignment assignment = this.parameters.computeAssignment(parameterIndex); - if(x instanceof IASString && ( + if(x instanceof IASString value && ( targetSqlType == Types.VARCHAR || targetSqlType == Types.NVARCHAR || targetSqlType == Types.LONGNVARCHAR || targetSqlType == Types.LONGVARCHAR)) { - IASString value = (IASString) x; this.delegate.setObject(assignment.getNewIndex(), value.getString(), targetSqlType); if (assignment.isHasTaint()) { this.delegate.setString(assignment.getTaintIndex(), value.isTainted() ? Utils.serializeTaints(value) : Constants.UNTAINTED); @@ -602,12 +601,11 @@ public void setTObject(int parameterIndex, Object x, int targetSqlType) throws S @Override public void setTObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { TaintAssignment assignment = this.parameters.computeAssignment(parameterIndex); - if (x instanceof IASString && ( + if (x instanceof IASString value && ( targetSqlType == Types.VARCHAR || targetSqlType == Types.NVARCHAR || targetSqlType == Types.LONGNVARCHAR || targetSqlType == Types.LONGVARCHAR)) { - IASString value = (IASString) x; this.delegate.setObject(assignment.getNewIndex(), value.getString(), targetSqlType, scaleOrLength); if (assignment.isHasTaint()) { this.delegate.setString(assignment.getTaintIndex(), value.isTainted() ? Utils.serializeTaints(value) : Constants.UNTAINTED); @@ -623,8 +621,7 @@ public void setTObject(int parameterIndex, Object x, int targetSqlType, int scal @Override public void setTObject(int parameterIndex, Object x) throws SQLException { TaintAssignment assignment = this.parameters.computeAssignment(parameterIndex); - if (x instanceof IASString) { - IASString value = (IASString) x; + if (x instanceof IASString value) { this.delegate.setObject(assignment.getNewIndex(), value.getString()); if (assignment.isHasTaint()) { this.delegate.setString(assignment.getTaintIndex(), value.isTainted() ? Utils.serializeTaints(value) : Constants.UNTAINTED); diff --git a/fontus/src/main/java/com/sap/fontus/sql/driver/ResultSetWrapper.java b/fontus/src/main/java/com/sap/fontus/sql/driver/ResultSetWrapper.java index 04a8103e..66b232e1 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/driver/ResultSetWrapper.java +++ b/fontus/src/main/java/com/sap/fontus/sql/driver/ResultSetWrapper.java @@ -1003,7 +1003,7 @@ private IASString getTStringHelper(int idx) throws SQLException { @Override public Object getTObject(String columnLabel) throws SQLException { - return getTObject(this.delegate.findColumn(columnLabel)); + return this.getTObject(this.delegate.findColumn(columnLabel)); } @Override @@ -1011,8 +1011,7 @@ public Object getTObject(int columnIndex) throws SQLException { int idx = transformColumnIndex(columnIndex); Object o = this.delegate.getObject(idx); - if (o instanceof String) { - String s = (String) o; + if (o instanceof String s) { String taint = this.delegate.getString(idx + 1); IASString rv = IASString.fromString(s); if (taint != null && !Constants.UNTAINTED.equals(taint) && !"0".equals(taint)) { diff --git a/fontus/src/main/java/com/sap/fontus/sql/tainter/ParameterType.java b/fontus/src/main/java/com/sap/fontus/sql/tainter/ParameterType.java index 3a7ab969..08bc0a58 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/tainter/ParameterType.java +++ b/fontus/src/main/java/com/sap/fontus/sql/tainter/ParameterType.java @@ -10,7 +10,7 @@ public enum ParameterType { * ^ * Update a set x = ?; * ^ - * + *

* Handling: * Taint column follows directly (idx+1) */ @@ -19,7 +19,7 @@ public enum ParameterType { * Inside a regular where clause * select * from a where id = ?; * ^ - * + *

* Handling: * No taint column */ @@ -28,7 +28,7 @@ public enum ParameterType { * Inside a where clause in a subselect * select * from a where id = (select id from b where x = ?); * ^ - * + *

* Handling: * No taint column */ @@ -45,7 +45,7 @@ public enum ParameterType { * An parameter assignment where the value is retrieved via a subselect * INSERT INTO a VALUES ('a', (select y from b where y = ?)) * ^ - * + *

* Handling: * We need to duplicate the subselect, one for the insert of the regular value and one for the tainted value * The tainted value thus can move further to the back, as the select might have several parameters in its where clause diff --git a/fontus/src/main/java/com/sap/fontus/sql/tainter/QueryCache.java b/fontus/src/main/java/com/sap/fontus/sql/tainter/QueryCache.java index 8d596238..bd6da602 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/tainter/QueryCache.java +++ b/fontus/src/main/java/com/sap/fontus/sql/tainter/QueryCache.java @@ -11,13 +11,14 @@ import net.sf.jsqlparser.statement.Statements; import java.util.List; +import java.util.Objects; public enum QueryCache { INSTANCE; private int hits = 0; private int misses = 0; private final Cache> queryCache; - private boolean collectStatistics; + private final boolean collectStatistics; QueryCache() { this.collectStatistics = Configuration.getConfiguration().collectStats(); @@ -43,11 +44,11 @@ public Pair parseQuery(String query) { // This uses a different SQL parser, probably not ideal List tokens = SqlLexerToken.getLexerTokens(query); Statistics.INSTANCE.incrementTotalQueryLength(tokens.size()); - tokens = SqlLexerToken.getLexerTokens(stmts.toString()); + tokens = SqlLexerToken.getLexerTokens(Objects.requireNonNull(stmts).toString()); Statistics.INSTANCE.incrementRewrittenQueryLength(tokens.size()); } - return new Pair(stmts.toString().trim(), tainter.getParameters()); + return new Pair<>(Objects.requireNonNull(stmts).toString().trim(), tainter.getParameters()); }); } diff --git a/fontus/src/main/java/com/sap/fontus/sql/tainter/SelectTainter.java b/fontus/src/main/java/com/sap/fontus/sql/tainter/SelectTainter.java index 18d2c594..01e26d23 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/tainter/SelectTainter.java +++ b/fontus/src/main/java/com/sap/fontus/sql/tainter/SelectTainter.java @@ -61,7 +61,7 @@ public void visit(PlainSelect plainSelect) { for (Expression e : plannedExpressions) { expression.append(e.toString()).append(","); } - if(expression.length() == 0) { + if(expression.isEmpty()) { throw new IllegalStateException("Expression of length 0"); } String expr = expression.substring(0, expression.length()-1); @@ -140,8 +140,7 @@ public void visit(PlainSelect plainSelect) { if(joins != null) { for (Join join : joins) { FromItem rhs = join.getRightItem(); - if(rhs instanceof SubSelect) { - SubSelect from = (SubSelect) rhs; + if(rhs instanceof SubSelect from) { SelectTainter selectTainter = new SelectTainter(this.parameters); from.getSelectBody().accept(selectTainter); /*if (from != null) { @@ -158,8 +157,7 @@ public void visit(PlainSelect plainSelect) { } } FromItem from = plainSelect.getFromItem(); - if(from instanceof SubSelect) { - SubSelect froms = (SubSelect) from; + if(from instanceof SubSelect froms) { SelectTainter selectTainter = new SelectTainter(this.parameters); froms.getSelectBody().accept(selectTainter); /*if(froms != null) { diff --git a/fontus/src/main/java/com/sap/fontus/sql/tainter/StatementTainter.java b/fontus/src/main/java/com/sap/fontus/sql/tainter/StatementTainter.java index e75247dc..05eeb5ea 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/tainter/StatementTainter.java +++ b/fontus/src/main/java/com/sap/fontus/sql/tainter/StatementTainter.java @@ -207,7 +207,7 @@ private List taintReturningExpression(List returningExpr newReturningExpressionList.add(selectExpressionItem); selectExpressionItem.accept(selectItemTainter); if (!selectItemReference.isEmpty()) { - newReturningExpressionList.add((SelectItem) selectItemReference.get(0)); + newReturningExpressionList.add(selectItemReference.get(0)); selectItemReference.clear(); } } diff --git a/fontus/src/main/java/com/sap/fontus/sql/tainter/Utils.java b/fontus/src/main/java/com/sap/fontus/sql/tainter/Utils.java index 46de08c8..9d95a682 100644 --- a/fontus/src/main/java/com/sap/fontus/sql/tainter/Utils.java +++ b/fontus/src/main/java/com/sap/fontus/sql/tainter/Utils.java @@ -64,7 +64,7 @@ static List taintColumnDefinitions(List colu /** * For consumption by tools related to Fontus. - * + *

* This is factored out here, as it is very easy to get super confusing error messages iff one depends on the shadow * jar of the fontus module and have the JSQLParser stuff as a dependency yourself. * @param query original query diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/shared/IASTaintMetadata.java b/fontus/src/main/java/com/sap/fontus/taintaware/shared/IASTaintMetadata.java index b4c97bc4..05692872 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/shared/IASTaintMetadata.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/shared/IASTaintMetadata.java @@ -4,6 +4,6 @@ public interface IASTaintMetadata extends Serializable { - public IASTaintSource getSource(); + IASTaintSource getSource(); } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASFormatter.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASFormatter.java index 590b0534..e5716e69 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASFormatter.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASFormatter.java @@ -167,8 +167,8 @@ public void close() { @Override public void flush() throws IOException { - if (this.output instanceof Flushable) { - ((Flushable) this.output).flush(); + if (this.output instanceof Flushable flushable) { + flushable.flush(); } } @@ -362,6 +362,7 @@ private void process_START_CONVERSION_STATE() { private void process_FlAGS_STATE() { if (this.token.setFlag(this.currentChar)) { // remains in FLAGS_STATE + return; } else if (Character.isDigit(this.currentChar)) { this.token.setWidth(this.parseInt(this.format)); this.state = WIDTH_STATE; @@ -990,7 +991,8 @@ private IASString transformFromHashCode() { } else { String hexString = Integer.toHexString(this.arg.hashCode()); IASString taintedHexString = new IASString(hexString); - if (this.arg instanceof IASTaintAware && ((IASTaintAware) this.arg).isTainted()) { + if (this.arg instanceof IASTaintAware taintAware && taintAware.isTainted()) { + // TODO: This seems suspiciously wrong, as we convert taints to boolean taints? taintedHexString.setTaint(true); } result.append(taintedHexString); @@ -1012,7 +1014,7 @@ private IASString transformFromString() { + this.formatToken.getConversionType()); } - if (this.arg instanceof Formattable) { + if (this.arg instanceof Formattable formattable) { int flag = 0; // only minus and sharp flag is valid if (IASFormatter.FormatToken.FLAGS_UNSET != (flags & ~IASFormatter.FormatToken.FLAG_MINUS & ~IASFormatter.FormatToken.FLAG_SHARP)) { @@ -1028,7 +1030,7 @@ private IASString transformFromString() { if (Character.isUpperCase(this.formatToken.getConversionType())) { flag |= FormattableFlags.UPPERCASE; } - ((Formattable) this.arg).formatTo(this.formatter.getFormatter(), flag, this.formatToken + formattable.formatTo(this.formatter.getFormatter(), flag, this.formatToken .getWidth(), this.formatToken.getPrecision()); // all actions have been taken out in the // Formattable.formatTo, thus there is nothing to do, just @@ -1080,20 +1082,19 @@ private IASString transformFromCharacter() { } else { if (this.arg instanceof Character) { result.append(this.arg); - } else if (this.arg instanceof Byte) { - byte b = ((Byte) this.arg).byteValue(); + } else if (this.arg instanceof Byte b) { if (!Character.isValidCodePoint(b)) { throw new IllegalFormatCodePointException(b); } - result.append((char) b); - } else if (this.arg instanceof Short) { - short s = ((Short) this.arg).shortValue(); + result.append((char) b.byteValue()); + } else if (this.arg instanceof Short s) { + if (!Character.isValidCodePoint(s)) { throw new IllegalFormatCodePointException(s); } - result.append((char) s); - } else if (this.arg instanceof Integer) { - int codePoint = ((Integer) this.arg).intValue(); + result.append((char) s.shortValue()); + } else if (this.arg instanceof Integer i) { + int codePoint = i; if (!Character.isValidCodePoint(codePoint)) { throw new IllegalFormatCodePointException(codePoint); } @@ -1155,7 +1156,7 @@ private IASString transformFromLineSeparator() { } if (null == lineSeparator) { - lineSeparator = IASString.valueOfInternal(System.getProperty("line.separator")); //$NON-NLS-1$ + lineSeparator = IASString.valueOfInternal(System.lineSeparator()); //$NON-NLS-1$ } return lineSeparator; } @@ -1232,14 +1233,14 @@ private IASString transformFromInteger() { throw new IllegalFormatPrecisionException(this.formatToken .getPrecision()); } - if (this.arg instanceof Long) { - value = ((Long) this.arg).longValue(); - } else if (this.arg instanceof Integer) { - value = ((Integer) this.arg).longValue(); - } else if (this.arg instanceof Short) { - value = ((Short) this.arg).longValue(); - } else if (this.arg instanceof Byte) { - value = ((Byte) this.arg).longValue(); + if (this.arg instanceof Long l) { + value = l; + } else if (this.arg instanceof Integer i) { + value = i.longValue(); + } else if (this.arg instanceof Short s) { + value = s.longValue(); + } else if (this.arg instanceof Byte b) { + value = b.longValue(); } else { throw new IllegalFormatConversionException(this.formatToken .getConversionType(), this.arg.getClass()); @@ -1625,14 +1626,14 @@ private IASString transformFromDateTime() { } Calendar calendar; - if (this.arg instanceof Calendar) { - calendar = (Calendar) this.arg; + if (this.arg instanceof Calendar cal) { + calendar = cal; } else { Date date = null; - if (this.arg instanceof Long) { - date = new Date(((Long) this.arg).longValue()); - } else if (this.arg instanceof Date) { - date = (Date) this.arg; + if (this.arg instanceof Long l) { + date = new Date(l); + } else if (this.arg instanceof Date d) { + date = d; } else { throw new IllegalFormatConversionException( currentConversionType, this.arg.getClass()); @@ -1838,13 +1839,11 @@ void transform_f() { void transform_a() { char currentConversionType = this.formatToken.getConversionType(); - if (this.argument instanceof Float) { - Float F = (Float) this.argument; - this.result.append(Float.toHexString(F.floatValue())); + if (this.argument instanceof Float F) { + this.result.append(Float.toHexString(F)); - } else if (this.argument instanceof Double) { - Double D = (Double) this.argument; - this.result.append(Double.toHexString(D.doubleValue())); + } else if (this.argument instanceof Double D) { + this.result.append(Double.toHexString(D)); } else { // BigInteger is not supported. throw new IllegalFormatConversionException( @@ -2060,7 +2059,7 @@ boolean requireArgument() { private Object getArgument(Object[] args, int index, IASFormatter.FormatToken token, Object lastArgument, boolean hasLastArgumentSet) { if (index == IASFormatter.FormatToken.LAST_ARGUMENT_INDEX && !hasLastArgumentSet) { - throw new MissingFormatArgumentException("<"); //$NON-NLS-1$ + throw new MissingFormatArgumentException("<"); } if (null == args) { diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProperties.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProperties.java index f2872219..65dc6cbb 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProperties.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProperties.java @@ -48,8 +48,8 @@ public IASProperties(IASProperties defaults) { public synchronized Object setProperty(IASString key, IASString value) { Object previousString = this.properties.setProperty(key.getString(), value.getString()); - if (previousString instanceof String) { - return IASString.fromString((String) previousString); + if (previousString instanceof String s) { + return IASString.fromString(s); } return previousString; } @@ -148,7 +148,7 @@ public Enumeration keys() { .list(this.properties.keys()) .stream() .map(ConversionUtils::convertToInstrumented) - .collect(Collectors.toList()) + .toList() ); } @@ -159,7 +159,7 @@ public Enumeration elements() { .list(this.properties.elements()) .stream() .map(ConversionUtils::convertToInstrumented) - .collect(Collectors.toList()) + .toList() ); } @@ -279,8 +279,8 @@ public boolean equals(Object o) { return false; } else if (o instanceof Properties) { return this.properties.equals(o); - } else if (o instanceof IASProperties) { - return this.properties.equals(((IASProperties) o).properties); + } else if (o instanceof IASProperties p) { + return this.properties.equals(p.properties); } return false; } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProxyProxy.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProxyProxy.java index 4aad6dca..55bc8c3f 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProxyProxy.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASProxyProxy.java @@ -26,7 +26,9 @@ protected IASProxyProxy(InvocationHandler h) { } // Prevent instantiation - private IASProxyProxy() { h = null; } + private IASProxyProxy() { + this.h = null; + } public static boolean isProxyClass(Class cls) { if(cls == null) { @@ -157,7 +159,7 @@ public static Object newProxyInstance(ClassLoader classLoader, Class[] interf Constructor constructor = proxy.getConstructor(InvocationHandler.class); try { - return constructor.newInstance(new Object[]{h}); + return constructor.newInstance(h); } catch (InstantiationException | IllegalAccessException e) { throw new InternalError(e.toString(), e); } catch (InvocationTargetException e) { diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASStringUtils.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASStringUtils.java index d45f727e..36d67bd3 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASStringUtils.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASStringUtils.java @@ -18,8 +18,7 @@ public static void arraycopy(Object src, int destPos, int length) { Object source = src; - if(src instanceof String[]) { - String[] strSrc = (String[]) src; + if(src instanceof String[] strSrc) { source = convertStringArray(strSrc); } System.arraycopy(source, srcPos, dest, destPos, length); @@ -29,13 +28,12 @@ public static IASString fromObject(Object obj) { if(obj == null) { return null; } - if(obj instanceof String) { - return IASString.fromString((String)obj); - } else if(obj instanceof IASString) { - return (IASString) obj; - } else if(obj instanceof IASAbstractStringBuilder) { - IASAbstractStringBuilder b = (IASAbstractStringBuilder) obj; - return b.toIASString(); + if(obj instanceof String s) { + return IASString.fromString(s); + } else if(obj instanceof IASString s) { + return s; + } else if(obj instanceof IASAbstractStringBuilder sb) { + return sb.toIASString(); } else { throw new IllegalArgumentException(String.format("Obj is of type %s, but only String or TString are allowed!", obj.getClass().getName())); } @@ -48,8 +46,8 @@ public static IASString fromObject(Object obj) { public static Object convertObject(Object obj) { if (obj == null) { return null; - } else if (obj instanceof String) { - return IASString.fromString((String)obj); + } else if (obj instanceof String s) { + return IASString.fromString(s); } else { return obj; } @@ -62,8 +60,8 @@ public static Object convertObject(Object obj) { public static Object convertTObject(Object obj) { if (obj == null) { return null; - } else if (obj instanceof IASString) { - return ((IASString) obj).getString(); + } else if (obj instanceof IASString s) { + return s.getString(); } else { return obj; } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASTaintHandler.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASTaintHandler.java index 8d21600f..74ed4ba7 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASTaintHandler.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/IASTaintHandler.java @@ -61,7 +61,7 @@ public static List getCleanedStackTrace() { * @param instance The specific instance of the object on which the method is called * @param sinkFunction The name of the function * @param sinkName The name of the sink - * @return + * @return The tainted data after invoking the hook. This can be null even if a non-null value was passed to this function! */ public static IASTaintAware handleTaint(IASTaintAware taintAware, Object instance, String sinkFunction, String sinkName, String callerName) { boolean isTainted = taintAware.isTainted(); @@ -89,7 +89,7 @@ private static IASTaintAware setTaint(IASTaintAware taintAware, Object parentObj protected static Object traverseObject(Object object, Function atomicHandler) { List visited = new ArrayList<>(); - return traverseObject(object, new Function() { + return traverseObject(object, new Function<>() { @Override public Object apply(Object o) { return traverseObject(o, this, visited, atomicHandler); @@ -180,7 +180,7 @@ protected static Object traverseObject(Object object, Function t /** * Hook function called at all taint sinks in the bytecode - * + *

* String object = parentObject.sourceCall(parameters); * * @param object The object to be tainted (can be a string, or something which needs traversing, like a list) @@ -217,7 +217,7 @@ public static Object checkTaint(Object object, Object instance, String sinkFunct /** * Hook function called at all taint sources added to bytecode - * + *

* String object = parentObject.callToSink(parameters); * * @param object The object to be tainted (can be a string, or something which needs traversing, like a list) diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASAccessibleObject.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASAccessibleObject.java index 3e3674cb..45583edc 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASAccessibleObject.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASAccessibleObject.java @@ -16,7 +16,7 @@ protected IASAccessibleObject(T original) { } @Override - public T getAnnotation(Class annotationClass) { + public A getAnnotation(Class annotationClass) { return this.original.getAnnotation(annotationClass); } @@ -41,6 +41,7 @@ public void setAccessible(boolean flag) { UnsafeUtils.setAccessible(this.original); } + @SuppressWarnings("deprecation") public boolean isAccessible() { return this.original.isAccessible(); } @@ -51,17 +52,17 @@ public boolean isAnnotationPresent(Class annotationClass) } @Override - public T[] getAnnotationsByType(Class annotationClass) { + public A[] getAnnotationsByType(Class annotationClass) { return this.original.getAnnotationsByType(annotationClass); } @Override - public T getDeclaredAnnotation(Class annotationClass) { + public A getDeclaredAnnotation(Class annotationClass) { return this.original.getDeclaredAnnotation(annotationClass); } @Override - public T[] getDeclaredAnnotationsByType(Class annotationClass) { + public A[] getDeclaredAnnotationsByType(Class annotationClass) { return this.original.getDeclaredAnnotationsByType(annotationClass); } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASConstructor.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASConstructor.java index b678485f..83714a2b 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASConstructor.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASConstructor.java @@ -70,8 +70,7 @@ public Type[] getGenericExceptionTypes() { @Override public boolean equals(Object obj) { - if (obj instanceof IASConstructor) { - IASConstructor other = (IASConstructor)obj; + if (obj instanceof IASConstructor other) { if (this.getDeclaringClass() == other.getDeclaringClass()) { return Arrays.equals(this.getParameterTypes(), other.getParameterTypes()); } @@ -131,7 +130,7 @@ public boolean isSynthetic() { } @Override - public Annotation getAnnotation(Class annotationClass) { + public R getAnnotation(Class annotationClass) { return super.getAnnotation(annotationClass); } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMember.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMember.java index 3920491a..e30698b4 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMember.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMember.java @@ -6,13 +6,13 @@ public interface IASMember { - public Class getDeclaringClass(); + Class getDeclaringClass(); - public IASString getName(); + IASString getName(); - public int getModifiers(); + int getModifiers(); - public boolean isSynthetic(); + boolean isSynthetic(); - public Member getMember(); + Member getMember(); } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMethod.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMethod.java index ba220418..0d47cccc 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMethod.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/IASMethod.java @@ -119,8 +119,8 @@ private boolean isWrapperForUninstrumentedMethod() { @Override public boolean equals(Object obj) { - if (obj instanceof IASMethod) { - return this.original.equals(((IASMethod) obj).original); + if (obj instanceof IASMethod iasMethod) { + return this.original.equals(iasMethod.original); } return false; } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/type/IASTypeVariableImpl.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/type/IASTypeVariableImpl.java index b767c553..a93836fd 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/type/IASTypeVariableImpl.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/reflect/type/IASTypeVariableImpl.java @@ -41,7 +41,7 @@ public AnnotatedType[] getAnnotatedBounds() { } @Override - public T getAnnotation(Class annotationClass) { + public A getAnnotation(Class annotationClass) { return this.original.getAnnotation(annotationClass); } diff --git a/fontus/src/main/java/com/sap/fontus/taintaware/unified/runtime/ObjectMethods.java b/fontus/src/main/java/com/sap/fontus/taintaware/unified/runtime/ObjectMethods.java index e0321ef2..2265c429 100644 --- a/fontus/src/main/java/com/sap/fontus/taintaware/unified/runtime/ObjectMethods.java +++ b/fontus/src/main/java/com/sap/fontus/taintaware/unified/runtime/ObjectMethods.java @@ -101,31 +101,31 @@ private static MethodHandle tstringifier(Class clazz) { private static MethodHandle makeEquals(Class receiverClass, List getters) { MethodType rr = MethodType.methodType(Boolean.TYPE, receiverClass, receiverClass); MethodType ro = MethodType.methodType(Boolean.TYPE, receiverClass, Object.class); - MethodHandle instanceFalse = MethodHandles.dropArguments(FALSE, 0, new Class[]{receiverClass, Object.class}); - MethodHandle instanceTrue = MethodHandles.dropArguments(TRUE, 0, new Class[]{receiverClass, Object.class}); + MethodHandle instanceFalse = MethodHandles.dropArguments(FALSE, 0, receiverClass, Object.class); + MethodHandle instanceTrue = MethodHandles.dropArguments(TRUE, 0, receiverClass, Object.class); MethodHandle isSameObject = OBJECT_EQ.asType(ro); - MethodHandle isInstance = MethodHandles.dropArguments(CLASS_IS_INSTANCE.bindTo(receiverClass), 0, new Class[]{receiverClass}); - MethodHandle accumulator = MethodHandles.dropArguments(TRUE, 0, new Class[]{receiverClass, receiverClass}); + MethodHandle isInstance = MethodHandles.dropArguments(CLASS_IS_INSTANCE.bindTo(receiverClass), 0, receiverClass); + MethodHandle accumulator = MethodHandles.dropArguments(TRUE, 0, receiverClass, receiverClass); MethodHandle thisFieldEqual; for(Iterator it = getters.iterator(); it.hasNext(); accumulator = MethodHandles.guardWithTest(thisFieldEqual, accumulator, instanceFalse.asType(rr))) { MethodHandle getter = it.next(); MethodHandle equalator = equalator(getter.type().returnType()); - thisFieldEqual = MethodHandles.filterArguments(equalator, 0, new MethodHandle[]{getter, getter}); + thisFieldEqual = MethodHandles.filterArguments(equalator, 0, getter, getter); } return MethodHandles.guardWithTest(isSameObject, instanceTrue, MethodHandles.guardWithTest(isInstance, accumulator.asType(ro), instanceFalse)); } private static MethodHandle makeHashCode(Class receiverClass, List getters) { - MethodHandle accumulator = MethodHandles.dropArguments(ZERO, 0, new Class[]{receiverClass}); + MethodHandle accumulator = MethodHandles.dropArguments(ZERO, 0, receiverClass); MethodHandle combineHashes; - for(Iterator it = getters.iterator(); it.hasNext(); accumulator = MethodHandles.permuteArguments(combineHashes, accumulator.type(), new int[]{0, 0})) { + for(Iterator it = getters.iterator(); it.hasNext(); accumulator = MethodHandles.permuteArguments(combineHashes, accumulator.type(), 0, 0)) { MethodHandle getter = it.next(); MethodHandle hasher = hasher(getter.type().returnType()); - MethodHandle hashThisField = MethodHandles.filterArguments(hasher, 0, new MethodHandle[]{getter}); - combineHashes = MethodHandles.filterArguments(HASH_COMBINER, 0, new MethodHandle[]{accumulator, hashThisField}); + MethodHandle hashThisField = MethodHandles.filterArguments(hasher, 0, getter); + combineHashes = MethodHandles.filterArguments(HASH_COMBINER, 0, accumulator, hashThisField); } return accumulator; @@ -145,7 +145,7 @@ private static MethodHandle makeToString(Class receiverClass, List receiverClass, List receiverClass, List receiverClass, List(); + primitiveHashers = new HashMap<>(); + primitiveToString = new HashMap<>(); + primitiveToTString = new HashMap<>(); try { Class OBJECT_METHODS_CLASS = ObjectMethods.class; MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); diff --git a/fontus/src/main/java/com/sap/fontus/utils/ConversionUtils.java b/fontus/src/main/java/com/sap/fontus/utils/ConversionUtils.java index cc567497..802618c4 100644 --- a/fontus/src/main/java/com/sap/fontus/utils/ConversionUtils.java +++ b/fontus/src/main/java/com/sap/fontus/utils/ConversionUtils.java @@ -240,21 +240,20 @@ public static MethodHandle getToOriginalConverter(Class uninstrumentedClass) } public static Type convertTypeToUninstrumented(Type type) { - if (type instanceof Class) { - return convertClassToOrig((Class) type); - } else if (type instanceof GenericArrayType) { - return new GenericArrayTypeImpl(convertTypeToUninstrumented(((GenericArrayType) type).getGenericComponentType())); - } else if (type instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) type; + if (type instanceof Class cls) { + return convertClassToOrig(cls); + } else if (type instanceof GenericArrayType genericArray) { + return new GenericArrayTypeImpl(convertTypeToUninstrumented(genericArray.getGenericComponentType())); + } else if (type instanceof ParameterizedType pType) { return new ParameterizedTypeImpl( (Class) convertTypeToUninstrumented(pType.getRawType()), Arrays.stream(pType.getActualTypeArguments()).map(ConversionUtils::convertTypeToUninstrumented).toArray(Type[]::new), convertTypeToUninstrumented(pType.getOwnerType()) ); - } else if (type instanceof IASTypeVariableImpl) { - return ((IASTypeVariableImpl) type).getType(); - } else if (type instanceof IASWildcardTypeImpl) { - return ((IASWildcardTypeImpl) type).getType(); + } else if (type instanceof IASTypeVariableImpl typeVar) { + return typeVar.getType(); + } else if (type instanceof IASWildcardTypeImpl wildcardType) { + return wildcardType.getType(); } return type; } @@ -264,21 +263,20 @@ public static Type convertTypeToInstrumented(Type return null; } else if (excludedLookup.isFontusClass(type.getClass())) { return type; - } else if (type instanceof Class) { - return convertClassToConcrete((Class) type); - } else if (type instanceof GenericArrayType) { - return new GenericArrayTypeImpl(convertTypeToInstrumented(((GenericArrayType) type).getGenericComponentType())); - } else if (type instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) type; + } else if (type instanceof Class cls) { + return convertClassToConcrete(cls); + } else if (type instanceof GenericArrayType genericArray) { + return new GenericArrayTypeImpl(convertTypeToInstrumented(genericArray.getGenericComponentType())); + } else if (type instanceof ParameterizedType parameterizedType) { return new ParameterizedTypeImpl( - (Class) convertTypeToInstrumented(pType.getRawType()), - Arrays.stream(pType.getActualTypeArguments()).map(ConversionUtils::convertTypeToInstrumented).toArray(Type[]::new), - convertTypeToInstrumented(pType.getOwnerType()) + (Class) convertTypeToInstrumented(parameterizedType.getRawType()), + Arrays.stream(parameterizedType.getActualTypeArguments()).map(ConversionUtils::convertTypeToInstrumented).toArray(Type[]::new), + convertTypeToInstrumented(parameterizedType.getOwnerType()) ); - } else if (type instanceof TypeVariable) { - return new IASTypeVariableImpl<>((TypeVariable) type); - } else if (type instanceof WildcardType) { - return new IASWildcardTypeImpl((WildcardType) type); + } else if (type instanceof TypeVariable tv) { + return new IASTypeVariableImpl<>(tv); + } else if (type instanceof WildcardType wildcardType) { + return new IASWildcardTypeImpl(wildcardType); } return type; } @@ -314,7 +312,7 @@ public Object convert(Object o) { } } - private static class TypeConverter implements Converter { + private static final class TypeConverter implements Converter { private final Function atomicConverter; private TypeConverter(Function atomicConverter) { @@ -332,7 +330,7 @@ public Object convert(Object o) { } } - private static class ClassConverter implements Converter { + private static final class ClassConverter implements Converter { private final Function, Class> atomicConverter; private ClassConverter(Function, Class> atomicConverter) { @@ -351,7 +349,7 @@ public Object convert(Object o) { } } - private static class ArrayConverter implements Converter { + private static final class ArrayConverter implements Converter { private final Function atomicConverter; private final Function, Class> classConverter; @@ -401,7 +399,7 @@ public Object convert(Object o) { } } - private static class SetConverter implements Converter { + private static final class SetConverter implements Converter { private final Function atomicConverter; private SetConverter(Function atomicConverter) { @@ -416,9 +414,8 @@ public boolean canConvert(Class cls) { @Override public Object convert(Object o) { - if (o instanceof Set) { + if (o instanceof Set set) { try { - Set set = (Set) o; if (set.isEmpty()) { return o; } @@ -464,7 +461,7 @@ public Object convert(Object o) { } - private static class ListConverter implements Converter { + private static final class ListConverter implements Converter { private final Function atomicConverter; private ListConverter(Function atomicConverter) { diff --git a/fontus/src/main/java/com/sap/fontus/utils/ReflectionUtils.java b/fontus/src/main/java/com/sap/fontus/utils/ReflectionUtils.java index eccf9bf3..74f99d01 100644 --- a/fontus/src/main/java/com/sap/fontus/utils/ReflectionUtils.java +++ b/fontus/src/main/java/com/sap/fontus/utils/ReflectionUtils.java @@ -19,7 +19,7 @@ private ReflectionUtils() { @SuppressWarnings("Since15") public static Class getCallerClass() { if (Constants.JAVA_VERSION >= 9) { - return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((Function, Class>) stackFrameStream -> stackFrameStream.filter(new Predicate() { + return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((Function, Class>) stackFrameStream -> stackFrameStream.filter(new Predicate<>() { private int counter = 0; @Override diff --git a/fontus/src/main/java/com/sap/fontus/utils/UnsafeUtils.java b/fontus/src/main/java/com/sap/fontus/utils/UnsafeUtils.java index 3bd8f878..a92099a8 100644 --- a/fontus/src/main/java/com/sap/fontus/utils/UnsafeUtils.java +++ b/fontus/src/main/java/com/sap/fontus/utils/UnsafeUtils.java @@ -9,6 +9,7 @@ import java.lang.reflect.*; import java.net.URL; import java.util.Collection; +import java.util.Objects; public class UnsafeUtils { private static final Unsafe UNSAFE; @@ -29,26 +30,26 @@ public class UnsafeUtils { private static Collection getSetAccessible() { try(InputStream is = UnsafeUtils.class.getClassLoader().getResourceAsStream("SetAccessible.bytes")) { - byte[] bytes = is.readAllBytes(); + byte[] bytes = Objects.requireNonNull(is).readAllBytes(); Class> collectionClass = null; try { - Method defineAnonymousClass = UNSAFE.getClass().getMethod("defineAnonymousClass", Class.class, byte[].class, //$NON-NLS-1$ + Method defineAnonymousClass = UNSAFE.getClass().getMethod("defineAnonymousClass", Class.class, byte[].class, Object[].class); @SuppressWarnings("unchecked") Class> unchecked = (Class>) defineAnonymousClass - .invoke(UNSAFE, URL.class, bytes, (Object[]) null); + .invoke(UNSAFE, URL.class, bytes, null); collectionClass = unchecked; } catch (NoSuchMethodException e) { - long offset = (long) UNSAFE.getClass().getMethod("staticFieldOffset", Field.class).invoke(UNSAFE, //$NON-NLS-1$ - MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP")); //$NON-NLS-1$ + long offset = (long) UNSAFE.getClass().getMethod("staticFieldOffset", Field.class).invoke(UNSAFE, + MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP")); MethodHandles.Lookup lookup = (MethodHandles.Lookup) UNSAFE.getClass() - .getMethod("getObject", Object.class, long.class) //$NON-NLS-1$ + .getMethod("getObject", Object.class, long.class) .invoke(UNSAFE, MethodHandles.Lookup.class, offset); lookup = lookup.in(URL.class); - Class classOption = Class.forName("java.lang.invoke.MethodHandles$Lookup$ClassOption"); //$NON-NLS-1$ + Class classOption = Class.forName("java.lang.invoke.MethodHandles$Lookup$ClassOption"); Object classOptions = Array.newInstance(classOption, 0); - Method defineHiddenClass = MethodHandles.Lookup.class.getMethod("defineHiddenClass", byte[].class, boolean.class, //$NON-NLS-1$ + Method defineHiddenClass = MethodHandles.Lookup.class.getMethod("defineHiddenClass", byte[].class, boolean.class, classOptions.getClass()); lookup = (MethodHandles.Lookup) defineHiddenClass.invoke(lookup, bytes, Boolean.FALSE, classOptions); @SuppressWarnings("unchecked") @@ -63,22 +64,7 @@ private static Collection getSetAccessible() { throw new RuntimeException(e); } } - /** - * Defines a class but does not make it known to the class loader or system dictionary. - *

- * For each CP entry, the corresponding CP patch must either be null or have - * the a format that matches its tag: - *

    - *
  • Integer, Long, Float, Double: the corresponding wrapper object type from java.lang - *
  • Utf8: a string (must have suitable syntax if used as signature or name) - *
  • Class: any java.lang.Class object - *
  • String: any object (not just a java.lang.String) - *
  • InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments - *
- * @param hostClass context for linkage, access control, protection domain, and class loader - * @param data bytes of a class file - * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data - */ + /*@ForceInline public static Class defineAnonymousClass(Class hostClass, byte[] data, Object[] cpPatches) { return UNSAFE.defineAnonymousClass(hostClass, data, cpPatches);