| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ike.utils; |
| |
| import android.os.Build; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| |
| import java.util.Locale; |
| import java.util.Objects; |
| |
| /** |
| * Manages logging for all IKE packages. Wraps Android's Log class to prevent leakage of PII. |
| */ |
| public class Log { |
| private final String mTAG; |
| private final boolean mIsEngBuild; |
| private final boolean mLogSensitive; |
| |
| /** |
| * Constructs a Log instance configured with the given tag and logSensitive flag |
| * |
| * @param tag the String tag to be used for this Log's logging |
| * @param logSensitive boolean flag marking whether sensitive data (PII) should be logged |
| */ |
| public Log(String tag, boolean logSensitive) { |
| this(tag, Build.IS_ENG, logSensitive); |
| } |
| |
| @VisibleForTesting |
| Log(String tag, boolean isEngBuild, boolean logSensitive) { |
| this.mTAG = tag; |
| this.mIsEngBuild = isEngBuild; |
| this.mLogSensitive = logSensitive; |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#VERBOSE} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void v(String prefix, String msg) { |
| if (isLoggable(android.util.Log.VERBOSE)) { |
| android.util.Log.v(mTAG, prefix + ": " + msg); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#VERBOSE} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void v(String prefix, String msg, Throwable tr) { |
| if (isLoggable(android.util.Log.VERBOSE)) { |
| android.util.Log.v(mTAG, prefix + ": " + msg, tr); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#DEBUG} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void d(String prefix, String msg) { |
| if (isLoggable(android.util.Log.DEBUG)) { |
| android.util.Log.d(mTAG, prefix + ": " + msg); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#DEBUG} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void d(String prefix, String msg, Throwable tr) { |
| if (isLoggable(android.util.Log.DEBUG)) { |
| android.util.Log.d(mTAG, prefix + ": " + msg, tr); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#INFO} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void i(String prefix, String msg) { |
| if (isLoggable(android.util.Log.INFO)) { |
| android.util.Log.i(mTAG, prefix + ": " + msg); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#INFO} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void i(String prefix, String msg, Throwable tr) { |
| if (isLoggable(android.util.Log.INFO)) { |
| android.util.Log.i(mTAG, prefix + ": " + msg, tr); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#WARN} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void w(String prefix, String msg) { |
| if (isLoggable(android.util.Log.WARN)) { |
| android.util.Log.w(mTAG, prefix + ": " + msg); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#WARN} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void w(String prefix, String msg, Throwable tr) { |
| if (isLoggable(android.util.Log.WARN)) { |
| android.util.Log.w(mTAG, prefix + ": " + msg, tr); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#ERROR} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void e(String prefix, String msg) { |
| if (isLoggable(android.util.Log.ERROR)) { |
| android.util.Log.e(mTAG, prefix + ": " + msg); |
| } |
| } |
| |
| /** |
| * Logs the given prefix and msg Strings. |
| * |
| * <p>Note: Logging is only done if this instance's logging level is {@link |
| * android.util.Log#ERROR} or higher. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void e(String prefix, String msg, Throwable tr) { |
| if (isLoggable(android.util.Log.ERROR)) { |
| android.util.Log.e(mTAG, prefix + ": " + msg, tr); |
| } |
| } |
| |
| /** |
| * What a Terrible Failure: Report a condition that should never happen. |
| * The error will always be logged at level ASSERT with the call stack. |
| * Depending on system configuration, a report may be added to the |
| * {@link android.os.DropBoxManager} and/or the process may be terminated |
| * immediately with an error dialog. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| */ |
| public void wtf(String prefix, String msg) { |
| android.util.Log.wtf(mTAG, prefix + ": " + msg); |
| |
| } |
| |
| /** |
| * What a Terrible Failure: Report a condition that should never happen. |
| * The error will always be logged at level ASSERT with the call stack. |
| * Depending on system configuration, a report may be added to the |
| * {@link android.os.DropBoxManager} and/or the process may be terminated |
| * immediately with an error dialog. |
| * |
| * @param prefix the String prefix to be used for this log entry |
| * @param msg the String msg to be logged |
| * @param tr an Exception to log |
| */ |
| public void wtf(String prefix, String msg, Throwable tr) { |
| android.util.Log.wtf(mTAG, prefix + ": " + msg, tr); |
| } |
| |
| /** |
| * Returns a String-formatted version of the given PII. |
| * |
| * <p>Depending on the logging configurations and build-type, the returned PII may be |
| * obfuscated. |
| * |
| * @param pii the PII to be formatted |
| * @return the String-formatted version of the PII |
| */ |
| public String pii(Object pii) { |
| if (!mIsEngBuild || !mLogSensitive) { |
| return String.valueOf(Objects.hashCode(pii)); |
| } else { |
| if (pii instanceof byte[]) { |
| return byteArrayToHexString((byte[]) pii); |
| } |
| return String.valueOf(pii); |
| } |
| } |
| |
| /** |
| * Checks whether the given logging level (defined in {@link android.util.Log}) is loggable for |
| * this Log. |
| * |
| * @param level the logging level to be checked for being loggable |
| * @return true iff level is at the configured logging level or higher |
| */ |
| private boolean isLoggable(int level) { |
| return android.util.Log.isLoggable(mTAG, level); |
| } |
| |
| /** |
| * Returns the hex-String representation of the given byte[]. |
| * |
| * @param data the byte[] to be represented |
| * @return the String representation of data |
| */ |
| public static String byteArrayToHexString(byte[] data) { |
| if (data == null || data.length == 0) { |
| return ""; |
| } |
| |
| StringBuilder sb = new StringBuilder(); |
| for (byte b : data) { |
| sb.append(String.format(Locale.US, "%02X", b)); |
| } |
| return sb.toString(); |
| } |
| } |