Go back to explicitly storing blank fields in the database

Works around bug in keepassx
This commit is contained in:
Brian Pellin
2012-02-18 13:04:33 -07:00
parent 347c5484b6
commit 7bf18efe39
4 changed files with 51 additions and 96 deletions

View File

@@ -1,3 +1,6 @@
* Go back to explicitly storing blank fields in the database
(works around bug in keepassx)
KeePassdroid (1.9.8) KeePassdroid (1.9.8)
* Fix crashes related to saving missing entries * Fix crashes related to saving missing entries
* Fix issues with setting wrong expiry date * Fix issues with setting wrong expiry date

Binary file not shown.

View File

@@ -23,7 +23,6 @@ import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import com.keepassdroid.database.PwEntryV3; import com.keepassdroid.database.PwEntryV3;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.Types; import com.keepassdroid.utils.Types;
public class PwEntryOutputV3 { public class PwEntryOutputV3 {
@@ -52,7 +51,7 @@ public class PwEntryOutputV3 {
public static final byte[] ZERO_FIELD_SIZE = Types.writeInt(0); public static final byte[] ZERO_FIELD_SIZE = Types.writeInt(0);
public static final byte[] ZERO_FIVE = {0x00, 0x00, 0x00, 0x00, 0x00}; public static final byte[] ZERO_FIVE = {0x00, 0x00, 0x00, 0x00, 0x00};
public static final byte[] TEST = {0x33, 0x33, 0x33, 0x33}; public static final byte[] TEST = {0x33, 0x33, 0x33, 0x33};
private OutputStream mOS; private OutputStream mOS;
private PwEntryV3 mPE; private PwEntryV3 mPE;
private long outputBytes = 0; private long outputBytes = 0;
@@ -82,89 +81,59 @@ public class PwEntryOutputV3 {
mOS.write(Types.writeInt(mPE.groupId)); mOS.write(Types.writeInt(mPE.groupId));
// Image ID // Image ID
if (mPE.icon != null) { mOS.write(IMAGEID_FIELD_TYPE);
mOS.write(IMAGEID_FIELD_TYPE); mOS.write(LONG_FOUR);
mOS.write(LONG_FOUR); mOS.write(Types.writeInt(mPE.icon.iconId));
mOS.write(Types.writeInt(mPE.icon.iconId));
}
// Title // Title
//byte[] title = mPE.title.getBytes("UTF-8"); //byte[] title = mPE.title.getBytes("UTF-8");
if (!EmptyUtils.isNullOrEmpty(mPE.title)) { mOS.write(TITLE_FIELD_TYPE);
mOS.write(TITLE_FIELD_TYPE); int titleLen = Types.writeCString(mPE.title, mOS);
int titleLen = Types.writeCString(mPE.title, mOS); outputBytes += titleLen;
outputBytes += titleLen;
}
// URL // URL
if (!EmptyUtils.isNullOrEmpty(mPE.url)) { mOS.write(URL_FIELD_TYPE);
mOS.write(URL_FIELD_TYPE); int urlLen = Types.writeCString(mPE.url, mOS);
int urlLen = Types.writeCString(mPE.url, mOS); outputBytes += urlLen;
outputBytes += urlLen;
}
// Username // Username
if (!EmptyUtils.isNullOrEmpty(mPE.username)) { mOS.write(USERNAME_FIELD_TYPE);
mOS.write(USERNAME_FIELD_TYPE); int userLen = Types.writeCString(mPE.username, mOS);
int userLen = Types.writeCString(mPE.username, mOS); outputBytes += userLen;
outputBytes += userLen;
}
// Password // Password
byte[] password = mPE.getPasswordBytes(); byte[] password = mPE.getPasswordBytes();
if (!EmptyUtils.isNullOrEmpty(password)) { mOS.write(PASSWORD_FIELD_TYPE);
mOS.write(PASSWORD_FIELD_TYPE); mOS.write(Types.writeInt(password.length+1));
mOS.write(Types.writeInt(password.length+1)); mOS.write(password);
mOS.write(password); mOS.write(0);
mOS.write(0); outputBytes += password.length + 1;
outputBytes += password.length + 1;
}
// Additional // Additional
if (!EmptyUtils.isNullOrEmpty(mPE.additional)) { mOS.write(ADDITIONAL_FIELD_TYPE);
mOS.write(ADDITIONAL_FIELD_TYPE); int addlLen = Types.writeCString(mPE.additional, mOS);
int addlLen = Types.writeCString(mPE.additional, mOS); outputBytes += addlLen;
outputBytes += addlLen;
}
// Create date // Create date
if (!EmptyUtils.isNullOrEmpty(mPE.tCreation)) { writeDate(CREATE_FIELD_TYPE, mPE.tCreation.getCDate());
writeDate(CREATE_FIELD_TYPE, mPE.tCreation.getCDate());
}
// Modification date // Modification date
if (!EmptyUtils.isNullOrEmpty(mPE.tLastMod)) { writeDate(MOD_FIELD_TYPE, mPE.tLastMod.getCDate());
writeDate(MOD_FIELD_TYPE, mPE.tLastMod.getCDate());
}
// Access date // Access date
if (!EmptyUtils.isNullOrEmpty(mPE.tLastAccess)) { writeDate(ACCESS_FIELD_TYPE, mPE.tLastAccess.getCDate());
writeDate(ACCESS_FIELD_TYPE, mPE.tLastAccess.getCDate());
}
// Expiration date // Expiration date
if (mPE.tExpire != null) { writeDate(EXPIRE_FIELD_TYPE, mPE.tExpire.getCDate());
// Correct previously saved wrong expiry dates
if (mPE.tExpire.equals(PwEntryV3.PW_NEVER_EXPIRE_BUG)) {
mPE.tExpire = PwEntryV3.PW_NEVER_EXPIRE;
}
writeDate(EXPIRE_FIELD_TYPE, mPE.tExpire.getCDate());
}
// Binary desc // Binary desc
if (!EmptyUtils.isNullOrEmpty(mPE.binaryDesc)) { mOS.write(BINARY_DESC_FIELD_TYPE);
mOS.write(BINARY_DESC_FIELD_TYPE); int descLen = Types.writeCString(mPE.binaryDesc, mOS);
int descLen = Types.writeCString(mPE.binaryDesc, mOS); outputBytes += descLen;
outputBytes += descLen;
}
// Binary data // Binary data
byte[] binaryData = mPE.getBinaryData(); int dataLen = writeByteArray(mPE.getBinaryData());
if (!EmptyUtils.isNullOrEmpty(binaryData)) { outputBytes += dataLen;
int dataLen = writeByteArray(binaryData);
outputBytes += dataLen;
}
// End // End
mOS.write(END_FIELD_TYPE); mOS.write(END_FIELD_TYPE);

View File

@@ -22,9 +22,8 @@ package com.keepassdroid.database.save;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import com.keepassdroid.database.PwEntryV3;
import com.keepassdroid.database.PwGroupV3; import com.keepassdroid.database.PwGroupV3;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.Types; import com.keepassdroid.utils.Types;
public class PwGroupOutputV3 { public class PwGroupOutputV3 {
@@ -68,49 +67,33 @@ public class PwGroupOutputV3 {
mOS.write(Types.writeInt(mPG.groupId)); mOS.write(Types.writeInt(mPG.groupId));
// Name // Name
if (!EmptyUtils.isNullOrEmpty(mPG.name)) { mOS.write(NAME_FIELD_TYPE);
mOS.write(NAME_FIELD_TYPE); Types.writeCString(mPG.name, mOS);
Types.writeCString(mPG.name, mOS);
}
// Create date // Create date
if (!EmptyUtils.isNullOrEmpty(mPG.tCreation)) { mOS.write(CREATE_FIELD_TYPE);
mOS.write(CREATE_FIELD_TYPE); mOS.write(DATE_FIELD_SIZE);
mOS.write(DATE_FIELD_SIZE); mOS.write(mPG.tCreation.getCDate());
mOS.write(mPG.tCreation.getCDate());
}
// Modification date // Modification date
if (!EmptyUtils.isNullOrEmpty(mPG.tLastMod)) { mOS.write(MOD_FIELD_TYPE);
mOS.write(MOD_FIELD_TYPE); mOS.write(DATE_FIELD_SIZE);
mOS.write(DATE_FIELD_SIZE); mOS.write(mPG.tLastMod.getCDate());
mOS.write(mPG.tLastMod.getCDate());
}
// Access date // Access date
if (!EmptyUtils.isNullOrEmpty(mPG.tLastAccess)) { mOS.write(ACCESS_FIELD_TYPE);
mOS.write(ACCESS_FIELD_TYPE); mOS.write(DATE_FIELD_SIZE);
mOS.write(DATE_FIELD_SIZE); mOS.write(mPG.tLastAccess.getCDate());
mOS.write(mPG.tLastAccess.getCDate());
}
// Expiration date // Expiration date
if (!EmptyUtils.isNullOrEmpty(mPG.tExpire)) { mOS.write(EXPIRE_FIELD_TYPE);
// Correct previously saved wrong expiry dates mOS.write(DATE_FIELD_SIZE);
if (mPG.tExpire.equals(PwEntryV3.PW_NEVER_EXPIRE_BUG)) { mOS.write(mPG.tExpire.getCDate());
mPG.tExpire = PwEntryV3.PW_NEVER_EXPIRE;
}
mOS.write(EXPIRE_FIELD_TYPE);
mOS.write(DATE_FIELD_SIZE);
mOS.write(mPG.tExpire.getCDate());
}
// Image ID // Image ID
if (mPG.icon != null) { mOS.write(IMAGEID_FIELD_TYPE);
mOS.write(IMAGEID_FIELD_TYPE); mOS.write(IMAGEID_FIELD_SIZE);
mOS.write(IMAGEID_FIELD_SIZE); mOS.write(Types.writeInt(mPG.icon.iconId));
mOS.write(Types.writeInt(mPG.icon.iconId));
}
// Level // Level
mOS.write(LEVEL_FIELD_TYPE); mOS.write(LEVEL_FIELD_TYPE);