mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-21 07:09:56 +01:00
Replace persistent logger after deleting account.
This commit is contained in:
@@ -9,8 +9,10 @@ import org.briarproject.bramble.api.account.AccountManager;
|
|||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseConfig;
|
import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
|
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -20,17 +22,21 @@ import javax.annotation.Nullable;
|
|||||||
import javax.annotation.concurrent.GuardedBy;
|
import javax.annotation.concurrent.GuardedBy;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import static android.content.Context.MODE_PRIVATE;
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
|
import static java.util.logging.Level.WARNING;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir;
|
import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir;
|
||||||
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logFileOrDir;
|
import static org.briarproject.bramble.util.LogUtils.logFileOrDir;
|
||||||
|
|
||||||
class AndroidAccountManager extends AccountManagerImpl
|
class AndroidAccountManager extends AccountManagerImpl
|
||||||
implements AccountManager {
|
implements AccountManager {
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(AndroidAccountManager.class.getName());
|
getLogger(AndroidAccountManager.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directories that shouldn't be deleted when deleting the user's account.
|
* Directories that shouldn't be deleted when deleting the user's account.
|
||||||
@@ -40,13 +46,16 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
|
|
||||||
protected final Context appContext;
|
protected final Context appContext;
|
||||||
private final SharedPreferences prefs;
|
private final SharedPreferences prefs;
|
||||||
|
private final PersistentLogManager logManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
AndroidAccountManager(DatabaseConfig databaseConfig,
|
AndroidAccountManager(DatabaseConfig databaseConfig,
|
||||||
CryptoComponent crypto, IdentityManager identityManager,
|
CryptoComponent crypto, IdentityManager identityManager,
|
||||||
SharedPreferences prefs, Application app) {
|
SharedPreferences prefs, PersistentLogManager logManager,
|
||||||
|
Application app) {
|
||||||
super(databaseConfig, crypto, identityManager);
|
super(databaseConfig, crypto, identityManager);
|
||||||
this.prefs = prefs;
|
this.prefs = prefs;
|
||||||
|
this.logManager = logManager;
|
||||||
appContext = app.getApplicationContext();
|
appContext = app.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +83,7 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
LOG.info("Contents of account directory after deleting:");
|
LOG.info("Contents of account directory after deleting:");
|
||||||
logFileOrDir(LOG, INFO, getDataDir());
|
logFileOrDir(LOG, INFO, getDataDir());
|
||||||
}
|
}
|
||||||
|
replacePersistentLogger();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,4 +144,13 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
private void addIfNotNull(Set<File> files, @Nullable File file) {
|
private void addIfNotNull(Set<File> files, @Nullable File file) {
|
||||||
if (file != null) files.add(file);
|
if (file != null) files.add(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void replacePersistentLogger() {
|
||||||
|
File logDir = appContext.getDir("log", MODE_PRIVATE);
|
||||||
|
try {
|
||||||
|
logManager.addLogHandler(logDir, getLogger(""));
|
||||||
|
} catch (IOException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public interface PersistentLogManager {
|
public interface PersistentLogManager {
|
||||||
@@ -24,11 +25,16 @@ public interface PersistentLogManager {
|
|||||||
/**
|
/**
|
||||||
* Creates and returns a persistent log handler that stores its logs in
|
* Creates and returns a persistent log handler that stores its logs in
|
||||||
* the given directory.
|
* the given directory.
|
||||||
* <p>
|
|
||||||
* This method should only be called once.
|
|
||||||
*/
|
*/
|
||||||
Handler createLogHandler(File dir) throws IOException;
|
Handler createLogHandler(File dir) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a persistent log handler that stores its logs in the given
|
||||||
|
* directory and adds the handler to the given logger, replacing any
|
||||||
|
* existing persistent log handler.
|
||||||
|
*/
|
||||||
|
void addLogHandler(File dir, Logger logger) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads and returns the persistent log entries stored in the given
|
* Loads and returns the persistent log entries stored in the given
|
||||||
* directory, or an empty list if no log entries are found.
|
* directory, or an empty list if no log entries are found.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import java.util.List;
|
|||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.logging.Formatter;
|
import java.util.logging.Formatter;
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@@ -62,7 +62,8 @@ class PersistentLogManagerImpl implements PersistentLogManager,
|
|||||||
private final StreamWriterFactory streamWriterFactory;
|
private final StreamWriterFactory streamWriterFactory;
|
||||||
private final Formatter formatter;
|
private final Formatter formatter;
|
||||||
private final SecretKey logKey;
|
private final SecretKey logKey;
|
||||||
private final AtomicBoolean handlerCreated = new AtomicBoolean(false);
|
private final AtomicReference<Integer> shutdownHookHandle =
|
||||||
|
new AtomicReference<>();
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private volatile SecretKey oldLogKey = null;
|
private volatile SecretKey oldLogKey = null;
|
||||||
@@ -103,7 +104,6 @@ class PersistentLogManagerImpl implements PersistentLogManager,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Handler createLogHandler(File dir) throws IOException {
|
public Handler createLogHandler(File dir) throws IOException {
|
||||||
if (handlerCreated.getAndSet(true)) throw new IllegalStateException();
|
|
||||||
File logFile = new File(dir, LOG_FILE);
|
File logFile = new File(dir, LOG_FILE);
|
||||||
File oldLogFile = new File(dir, OLD_LOG_FILE);
|
File oldLogFile = new File(dir, OLD_LOG_FILE);
|
||||||
if (oldLogFile.exists() && !oldLogFile.delete())
|
if (oldLogFile.exists() && !oldLogFile.delete())
|
||||||
@@ -117,7 +117,7 @@ class PersistentLogManagerImpl implements PersistentLogManager,
|
|||||||
StreamHandler handler = new FlushingStreamHandler(scheduler,
|
StreamHandler handler = new FlushingStreamHandler(scheduler,
|
||||||
ioExecutor, writer.getOutputStream(), formatter);
|
ioExecutor, writer.getOutputStream(), formatter);
|
||||||
// Flush the log and terminate the stream at shutdown
|
// Flush the log and terminate the stream at shutdown
|
||||||
shutdownManager.addShutdownHook(() -> {
|
Runnable shutdownHook = () -> {
|
||||||
LOG.info("Shutting down");
|
LOG.info("Shutting down");
|
||||||
handler.flush();
|
handler.flush();
|
||||||
try {
|
try {
|
||||||
@@ -125,13 +125,27 @@ class PersistentLogManagerImpl implements PersistentLogManager,
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logException(LOG, WARNING, e);
|
logException(LOG, WARNING, e);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
int handle = shutdownManager.addShutdownHook(shutdownHook);
|
||||||
|
// If a previous handler registered a shutdown hook, remove it
|
||||||
|
Integer oldHandle = shutdownHookHandle.getAndSet(handle);
|
||||||
|
if (oldHandle != null) {
|
||||||
|
shutdownManager.removeShutdownHook(oldHandle);
|
||||||
|
}
|
||||||
return handler;
|
return handler;
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addLogHandler(File dir, Logger logger) throws IOException {
|
||||||
|
for (Handler h : logger.getHandlers()) {
|
||||||
|
if (h instanceof FlushingStreamHandler) logger.removeHandler(h);
|
||||||
|
}
|
||||||
|
logger.addHandler(createLogHandler(dir));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getPersistedLog(File dir, boolean old)
|
public List<String> getPersistedLog(File dir, boolean old)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.content.SharedPreferences;
|
|||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseConfig;
|
import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
|
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.Localizer;
|
import org.briarproject.briar.android.Localizer;
|
||||||
import org.briarproject.briar.android.util.UiUtils;
|
import org.briarproject.briar.android.util.UiUtils;
|
||||||
@@ -17,8 +18,8 @@ class BriarAccountManager extends AndroidAccountManager {
|
|||||||
@Inject
|
@Inject
|
||||||
BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
|
BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
|
||||||
IdentityManager identityManager, SharedPreferences prefs,
|
IdentityManager identityManager, SharedPreferences prefs,
|
||||||
Application app) {
|
PersistentLogManager logManager, Application app) {
|
||||||
super(databaseConfig, crypto, identityManager, prefs, app);
|
super(databaseConfig, crypto, identityManager, prefs, logManager, app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import org.briarproject.briar.android.util.UiUtils;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.logging.Formatter;
|
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.LogRecord;
|
import java.util.logging.LogRecord;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@@ -130,12 +129,9 @@ public class BriarApplicationImpl extends Application
|
|||||||
|
|
||||||
PersistentLogManager logManager =
|
PersistentLogManager logManager =
|
||||||
applicationComponent.persistentLogManager();
|
applicationComponent.persistentLogManager();
|
||||||
Formatter formatter = applicationComponent.formatter();
|
File logDir = getDir("log", MODE_PRIVATE);
|
||||||
try {
|
try {
|
||||||
File logDir = getDir("log", MODE_PRIVATE);
|
rootLogger.addHandler(logManager.createLogHandler(logDir));
|
||||||
Handler handler = logManager.createLogHandler(logDir);
|
|
||||||
handler.setFormatter(formatter);
|
|
||||||
rootLogger.addHandler(handler);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logException(LOG, WARNING, e);
|
logException(LOG, WARNING, e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user