Files
project-auth-server/build/reports/jacoco/aggregate/html/com.project.auth.application.support.logging/LogSanitizer.java.html
T

129 lines
8.1 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>LogSanitizer.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">project-auth-server</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.application.support.logging</a> &gt; <span class="el_source">LogSanitizer.java</span></div><h1>LogSanitizer.java</h1><pre class="source lang-java linenums">package com.project.auth.application.support.logging;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat;
public final class LogSanitizer {
private static final String UNAVAILABLE_VALUE = &quot;-&quot;;
private static final String ANONYMOUS_VALUE = &quot;anonymous&quot;;
private static final String HASH_PREFIX = &quot;sha256:&quot;;
private static final int HASH_HEX_LENGTH = 16;
private static final int DEFAULT_MAX_LENGTH = 160;
private static final int USER_AGENT_MAX_LENGTH = 120;
private static final int REQUEST_PATH_MAX_LENGTH = 200;
<span class="fc" id="L17"> private static final HexFormat HEX_FORMAT = HexFormat.of();</span>
private LogSanitizer() {
}
public static String userAgent(String value) {
<span class="fc" id="L23"> return normalize(value, USER_AGENT_MAX_LENGTH);</span>
}
public static String clientIp(String value) {
<span class="fc bfc" id="L27" title="All 4 branches covered."> if (value == null || value.isBlank()) {</span>
<span class="fc" id="L28"> return UNAVAILABLE_VALUE;</span>
}
<span class="fc" id="L30"> String normalized = normalize(value, DEFAULT_MAX_LENGTH);</span>
<span class="fc" id="L31"> String[] octets = normalized.split(&quot;\\.&quot;, -1);</span>
<span class="fc bfc" id="L32" title="All 4 branches covered."> if (octets.length == 4 &amp;&amp; isIpv4Octets(octets)) {</span>
<span class="fc" id="L33"> return octets[0] + &quot;.&quot; + octets[1] + &quot;.&quot; + octets[2] + &quot;.0&quot;;</span>
}
<span class="fc" id="L35"> return HASH_PREFIX + sha256Hex(normalized).substring(0, HASH_HEX_LENGTH);</span>
}
public static String requestPath(String value) {
<span class="fc" id="L39"> return normalize(value, REQUEST_PATH_MAX_LENGTH);</span>
}
public static String actorId(String value) {
<span class="fc bfc" id="L43" title="All 6 branches covered."> if (value == null || value.isBlank() || ANONYMOUS_VALUE.equals(value)) {</span>
<span class="fc" id="L44"> return ANONYMOUS_VALUE;</span>
}
<span class="fc" id="L46"> String normalized = normalize(value, DEFAULT_MAX_LENGTH);</span>
<span class="fc bfc" id="L47" title="All 2 branches covered."> if (normalized.contains(&quot;@&quot;)) {</span>
<span class="fc" id="L48"> return maskEmail(normalized);</span>
}
<span class="fc" id="L50"> return HASH_PREFIX + sha256Hex(normalized).substring(0, HASH_HEX_LENGTH);</span>
}
public static String normalize(String value) {
<span class="fc" id="L54"> return normalize(value, DEFAULT_MAX_LENGTH);</span>
}
private static String normalize(String value, int maxLength) {
<span class="fc bfc" id="L58" title="All 4 branches covered."> if (value == null || value.isBlank()) {</span>
<span class="fc" id="L59"> return UNAVAILABLE_VALUE;</span>
}
<span class="fc" id="L62"> StringBuilder builder = new StringBuilder(Math.min(value.length(), maxLength));</span>
<span class="fc bfc" id="L63" title="All 4 branches covered."> for (int index = 0; index &lt; value.length() &amp;&amp; builder.length() &lt; maxLength; index++) {</span>
<span class="fc" id="L64"> char character = value.charAt(index);</span>
<span class="fc bfc" id="L65" title="All 8 branches covered."> if (Character.isISOControl(character) || Character.isWhitespace(character) || character == '='</span>
|| character == '|') {
<span class="fc" id="L67"> builder.append('_');</span>
} else {
<span class="fc" id="L69"> builder.append(character);</span>
}
}
<span class="fc bfc" id="L72" title="All 2 branches covered."> if (value.length() &gt; maxLength) {</span>
<span class="fc" id="L73"> builder.append(&quot;...&quot;);</span>
}
<span class="fc" id="L75"> return builder.toString();</span>
}
private static String maskEmail(String email) {
<span class="fc" id="L79"> int atIndex = email.indexOf('@');</span>
<span class="fc bfc" id="L80" title="All 4 branches covered."> if (atIndex &lt;= 0 || atIndex == email.length() - 1) {</span>
<span class="fc" id="L81"> return &quot;***&quot;;</span>
}
<span class="fc" id="L84"> String localPart = email.substring(0, atIndex);</span>
<span class="fc" id="L85"> String domain = email.substring(atIndex + 1);</span>
<span class="fc" id="L86"> return localPartPrefix(localPart) + &quot;***@&quot; + domain;</span>
}
private static String localPartPrefix(String localPart) {
<span class="fc bfc" id="L90" title="All 2 branches covered."> if (localPart.length() == 1) {</span>
<span class="fc" id="L91"> return localPart;</span>
}
<span class="fc" id="L93"> return localPart.substring(0, Math.min(localPart.length(), 2));</span>
}
private static boolean isIpv4Octets(String[] octets) {
<span class="fc bfc" id="L97" title="All 2 branches covered."> for (String octet : octets) {</span>
<span class="fc bfc" id="L98" title="All 2 branches covered."> if (!isIpv4Octet(octet)) {</span>
<span class="fc" id="L99"> return false;</span>
}
}
<span class="fc" id="L102"> return true;</span>
}
private static boolean isIpv4Octet(String octet) {
<span class="pc bpc" id="L106" title="1 of 4 branches missed."> if (octet.isEmpty() || octet.length() &gt; 3) {</span>
<span class="fc" id="L107"> return false;</span>
}
<span class="fc" id="L109"> int value = 0;</span>
<span class="fc bfc" id="L110" title="All 2 branches covered."> for (int index = 0; index &lt; octet.length(); index++) {</span>
<span class="fc" id="L111"> char character = octet.charAt(index);</span>
<span class="fc bfc" id="L112" title="All 2 branches covered."> if (!Character.isDigit(character)) {</span>
<span class="fc" id="L113"> return false;</span>
}
<span class="fc" id="L115"> value = value * 10 + Character.digit(character, 10);</span>
}
<span class="fc bfc" id="L117" title="All 2 branches covered."> return value &lt;= 255;</span>
}
private static String sha256Hex(String value) {
try {
<span class="fc" id="L122"> MessageDigest digest = MessageDigest.getInstance(&quot;SHA-256&quot;);</span>
<span class="fc" id="L123"> return HEX_FORMAT.formatHex(digest.digest(value.getBytes(StandardCharsets.UTF_8)));</span>
<span class="nc" id="L124"> } catch (NoSuchAlgorithmException exception) {</span>
<span class="nc" id="L125"> throw new IllegalStateException(&quot;SHA-256 digest is not available.&quot;, exception);</span>
}
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.14.202510111229</span></div></body></html>