Better FS Locking.

This commit is contained in:
Moxie Marlinspike 2014-05-01 15:02:46 -07:00
parent c8757c2134
commit 79020cd33c
4 changed files with 58 additions and 40 deletions

View File

@ -1,3 +1,13 @@
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android-library'
repositories {

View File

@ -25,16 +25,17 @@ public class PreKeyEntity implements PreKey {
@Expose(serialize = false)
private int deviceId;
@Expose(serialize = false)
private int registrationId;
private int keyId;
private ECPublicKey publicKey;
private IdentityKey identityKey;
private int registrationId;
public PreKeyEntity(int keyId, ECPublicKey publicKey, IdentityKey identityKey) {
this.keyId = keyId;
this.publicKey = publicKey;
this.identityKey = identityKey;
this.registrationId = registrationId;
}
public int getDeviceId() {

View File

@ -22,6 +22,7 @@ public class TextSecurePreKeyStore implements PreKeyStore {
public static final String PREKEY_DIRECTORY = "prekeys";
private static final int CURRENT_VERSION_MARKER = 1;
private static final Object FILE_LOCK = new Object();
private static final String TAG = TextSecurePreKeyStore.class.getSimpleName();
private final Context context;
@ -34,6 +35,7 @@ public class TextSecurePreKeyStore implements PreKeyStore {
@Override
public PreKeyRecord load(int preKeyId) throws InvalidKeyIdException {
synchronized (FILE_LOCK) {
try {
MasterCipher masterCipher = new MasterCipher(masterSecret);
FileInputStream fin = new FileInputStream(getPreKeyFile(preKeyId));
@ -51,9 +53,11 @@ public class TextSecurePreKeyStore implements PreKeyStore {
throw new InvalidKeyIdException(e);
}
}
}
@Override
public void store(int preKeyId, PreKeyRecord record) {
synchronized (FILE_LOCK) {
try {
MasterCipher masterCipher = new MasterCipher(masterSecret);
RandomAccessFile recordFile = new RandomAccessFile(getPreKeyFile(preKeyId), "rw");
@ -69,6 +73,7 @@ public class TextSecurePreKeyStore implements PreKeyStore {
throw new AssertionError(e);
}
}
}
@Override
public boolean contains(int preKeyId) {

View File

@ -74,6 +74,7 @@ public class TextSecureSessionStore implements SessionStore {
@Override
public void store(long recipientId, int deviceId, SessionRecord record) {
synchronized (FILE_LOCK) {
try {
MasterCipher masterCipher = new MasterCipher(masterSecret);
RandomAccessFile sessionFile = new RandomAccessFile(getSessionFile(recipientId, deviceId), "rw");
@ -89,6 +90,7 @@ public class TextSecureSessionStore implements SessionStore {
throw new AssertionError(e);
}
}
}
@Override
public boolean contains(long recipientId, int deviceId) {