001package com.box.sdk;
002
003import com.eclipsesource.json.JsonObject;
004import java.util.Arrays;
005import java.util.HashSet;
006import java.util.Set;
007import okhttp3.Headers;
008import org.jetbrains.annotations.NotNull;
009
010/** Class used to sanitize sensitive data from payload. */
011public final class BoxSensitiveDataSanitizer {
012  private static final Set<String> SENSITIVE_KEYS =
013      new HashSet<>(
014          Arrays.asList(
015              "authorization",
016              "access_token",
017              "refresh_token",
018              "subject_token",
019              "token",
020              "client_id",
021              "client_secret",
022              "code",
023              "shared_link",
024              "download_url",
025              "jwt_private_key",
026              "jwt_private_key_passphrase",
027              "password"));
028
029  private BoxSensitiveDataSanitizer() {}
030
031  /**
032   * Add key that should be sanitized
033   *
034   * @param key key to be sanitized
035   */
036  public static void addKeyToSanitize(String key) {
037    SENSITIVE_KEYS.add(key);
038  }
039
040  @NotNull
041  static Headers sanitizeHeaders(Headers originalHeaders) {
042    Headers.Builder sanitizedHeadersBuilder = originalHeaders.newBuilder();
043
044    for (String originalHeaderName : originalHeaders.names()) {
045      if (isSensitiveKey(originalHeaderName)) {
046        sanitizedHeadersBuilder.set(originalHeaderName, "[REDACTED]");
047      } else {
048        String headerValue = originalHeaders.get(originalHeaderName);
049        if (headerValue != null) {
050          sanitizedHeadersBuilder.set(originalHeaderName, headerValue);
051        }
052      }
053    }
054
055    return sanitizedHeadersBuilder.build();
056  }
057
058  /**
059   * Sanitize the json body. Only for the first level of the json.
060   *
061   * @param originalBody the original json body
062   * @return the sanitized json body
063   */
064  @NotNull
065  static JsonObject sanitizeJsonBody(JsonObject originalBody) {
066    JsonObject sanitizedBody = new JsonObject();
067
068    for (String key : originalBody.names()) {
069      if (isSensitiveKey(key)) {
070        sanitizedBody.set(key, "[REDACATED]");
071      } else {
072        sanitizedBody.set(key, originalBody.get(key));
073      }
074    }
075    return sanitizedBody;
076  }
077
078  private static boolean isSensitiveKey(@NotNull String key) {
079    return SENSITIVE_KEYS.contains(key.toLowerCase(java.util.Locale.ROOT));
080  }
081}