Start factorise

This commit is contained in:
J-Jamet
2018-03-22 23:06:05 +01:00
parent 33404add38
commit cf93044d3f
35 changed files with 604 additions and 848 deletions

View File

@@ -42,7 +42,7 @@ public class PwEntryTestV3 extends AndroidTestCase {
}
public void testName() {
assertTrue("Name was " + mPE.title, mPE.title.equals("Amazon"));
assertTrue("Name was " + mPE.getTitle(), mPE.getTitle().equals("Amazon"));
}
public void testPassword() throws UnsupportedEncodingException {
@@ -54,7 +54,7 @@ public class PwEntryTestV3 extends AndroidTestCase {
public void testCreation() {
Calendar cal = Calendar.getInstance();
cal.setTime(mPE.tCreation.getJDate());
cal.setTime(mPE.getCreationTime().getDate());
assertEquals("Incorrect year.", cal.get(Calendar.YEAR), 2009);
assertEquals("Incorrect month.", cal.get(Calendar.MONTH), 3);

View File

@@ -52,7 +52,7 @@ public class PwEntryTestV4 extends TestCase {
entry.parent = new PwGroupV4();
entry.addField("key2", new ProtectedString(false, "value2"));
entry.url = "http://localhost";
entry.uuid = UUID.randomUUID();
entry.setUUID(UUID.randomUUID());
PwEntryV4 target = new PwEntryV4();
target.assign(entry);

View File

@@ -38,7 +38,7 @@ public class PwGroupTest extends AndroidTestCase {
}
public void testGroupName() {
assertTrue("Name was " + mPG.name, mPG.name.equals("Internet"));
assertTrue("Name was " + mPG.getName(), mPG.getName().equals("Internet"));
}
}

View File

@@ -30,12 +30,12 @@ import biz.source_code.base64Coder.Base64Coder;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.load.ImporterV4;
import com.keepassdroid.utils.SprEngine;
import com.keepassdroid.utils.SprEngineV4;
import com.keepassdroid.utils.Types;
public class SprEngineTest extends AndroidTestCase {
private PwDatabaseV4 db;
private SprEngine spr;
private SprEngineV4 spr;
@Override
protected void setUp() throws Exception {
@@ -51,7 +51,7 @@ public class SprEngineTest extends AndroidTestCase {
is.close();
spr = SprEngine.getInstance(db);
spr = new SprEngineV4();
}
private final String REF = "{REF:P@I:2B1D56590D961F48A8CE8C392CE6CD35}";

View File

@@ -146,6 +146,8 @@ public class EntryActivity extends LockingHideActivity {
fillData();
invalidateOptionsMenu();
// TODO Start decode
// If notifications enabled in settings
// Don't if application timeout
if (firstLaunchOfActivity && !App.isShutdown() && isClipboardNotificationsEnable(getApplicationContext())) {
@@ -177,7 +179,7 @@ public class EntryActivity extends LockingHideActivity {
if (mEntry.allowExtraFields()) {
try {
int anonymousFieldNumber = 0;
for (Map.Entry<String, String> entry : mEntry.getExtraFields(App.getDB().pm).entrySet()) {
for (Map.Entry<String, String> entry : mEntry.getExtraFields().entrySet()) {
notificationFields.add(
new NotificationField(
NotificationField.NotificationFieldId.getAnonymousFieldId()[anonymousFieldNumber],
@@ -196,6 +198,7 @@ public class EntryActivity extends LockingHideActivity {
startService(intent);
}
// TODO end decode
}
firstLaunchOfActivity = false;
}
@@ -209,34 +212,36 @@ public class EntryActivity extends LockingHideActivity {
Database db = App.getDB();
PwDatabase pm = db.pm;
mEntry.startToDecodeReference(pm);
// Assign title
populateTitle(db.drawFactory.getIconDrawable(getResources(), mEntry.getIcon()),
mEntry.getTitle(true, pm));
mEntry.getTitle());
// Assign basic fields
entryContentsView.assignUserName(mEntry.getUsername(true, pm));
entryContentsView.assignUserName(mEntry.getUsername());
entryContentsView.assignUserNameCopyListener(view ->
clipboardHelper.timeoutCopyToClipboard(mEntry.getUsername(true, App.getDB().pm),
clipboardHelper.timeoutCopyToClipboard(mEntry.getUsername(),
getString(R.string.copy_field, getString(R.string.entry_user_name)))
);
entryContentsView.assignPassword(mEntry.getPassword(true, pm));
entryContentsView.assignPassword(mEntry.getPassword());
if (PreferencesUtil.allowCopyPassword(this)) {
entryContentsView.assignPasswordCopyListener(view ->
clipboardHelper.timeoutCopyToClipboard(mEntry.getPassword(true, App.getDB().pm),
clipboardHelper.timeoutCopyToClipboard(mEntry.getPassword(),
getString(R.string.copy_field, getString(R.string.entry_password)))
);
}
entryContentsView.assignURL(mEntry.getUrl(true, pm));
entryContentsView.assignURL(mEntry.getUrl());
entryContentsView.setHiddenPasswordStyle(!mShowPassword);
entryContentsView.assignComment(mEntry.getNotes(true, pm));
entryContentsView.assignComment(mEntry.getNotes());
// Assign custom fields
if (mEntry.allowExtraFields()) {
entryContentsView.clearExtraFields();
for (Map.Entry<String, String> field : mEntry.getExtraFields(pm).entrySet()) {
for (Map.Entry<String, String> field : mEntry.getExtraFields().entrySet()) {
final String label = field.getKey();
final String value = field.getValue();
entryContentsView.addExtraField(label, value, view ->
@@ -245,15 +250,17 @@ public class EntryActivity extends LockingHideActivity {
}
// Assign dates
entryContentsView.assignCreationDate(mEntry.getCreationTime());
entryContentsView.assignModificationDate(mEntry.getLastModificationTime());
entryContentsView.assignLastAccessDate(mEntry.getLastAccessTime());
Date expires = mEntry.getExpiryTime();
entryContentsView.assignCreationDate(mEntry.getCreationTime().getDate());
entryContentsView.assignModificationDate(mEntry.getLastModificationTime().getDate());
entryContentsView.assignLastAccessDate(mEntry.getLastAccessTime().getDate());
Date expires = mEntry.getExpiryTime().getDate();
if ( mEntry.expires() ) {
entryContentsView.assignExpiresDate(expires);
} else {
entryContentsView.assignExpiresDate(getString(R.string.never));
}
mEntry.endToDecodeReference(pm);
}
@Override

View File

@@ -39,6 +39,7 @@ import com.keepassdroid.app.App;
import com.keepassdroid.database.Database;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwDate;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.PwGroup;
@@ -254,12 +255,14 @@ public class EntryEditActivity extends LockingHideActivity
PwEntry newEntry = mEntry.clone(true);
Date now = Calendar.getInstance().getTime();
newEntry.setLastAccessTime(now);
newEntry.setLastModificationTime(now);
newEntry.setLastAccessTime(new PwDate());
newEntry.setLastModificationTime(new PwDate());
PwDatabase db = App.getDB().pm;
newEntry.setTitle(entryTitleView.getText().toString(), db);
newEntry.startToDecodeReference(db);
newEntry.setTitle(entryTitleView.getText().toString());
if(mSelectedIconID != -1)
// or TODO icon factory newEntry.setIcon(App.getDB().pm.iconFactory.getIcon(mSelectedIconID));
newEntry.setIcon(new PwIconStandard(mSelectedIconID));
@@ -272,10 +275,10 @@ public class EntryEditActivity extends LockingHideActivity
newEntry.setIcon(mEntry.icon);
}
}
newEntry.setUrl(entryUrlView.getText().toString(), db);
newEntry.setUsername(entryUserNameView.getText().toString(), db);
newEntry.setNotes(entryCommentView.getText().toString(), db);
newEntry.setPassword(entryPasswordView.getText().toString(), db);
newEntry.setUrl(entryUrlView.getText().toString());
newEntry.setUsername(entryUserNameView.getText().toString());
newEntry.setNotes(entryCommentView.getText().toString());
newEntry.setPassword(entryPasswordView.getText().toString());
if (newEntry.allowExtraFields()) {
// Delete all new standard strings
@@ -290,6 +293,8 @@ public class EntryEditActivity extends LockingHideActivity
}
}
newEntry.endToDecodeReference(db);
return newEntry;
}

View File

@@ -52,7 +52,7 @@ public abstract class EntrySearchHandler extends EntryHandler<PwEntry> {
return true;
}
if (sp.excludeExpired && entry.expires() && now.after(entry.getExpiryTime())) {
if (sp.excludeExpired && entry.expires() && now.after(entry.getExpiryTime().getDate())) {
return true;
}

View File

@@ -39,7 +39,7 @@ public class EntrySearchHandlerAll extends EntryHandler<PwEntry> {
return true;
}
if (sp.excludeExpired && entry.expires() && now.after(entry.getExpiryTime())) {
if (sp.excludeExpired && entry.expires() && now.after(entry.getExpiryTime().getDate())) {
return true;
}

View File

@@ -37,7 +37,7 @@ public class EntrySearchHandlerV4 extends EntrySearchHandler {
protected boolean searchID(PwEntry e) {
PwEntryV4 entry = (PwEntryV4) e;
if (sp.searchInUUIDs) {
String hex = UuidUtil.toHexString(entry.uuid);
String hex = UuidUtil.toHexString(entry.getUUID());
return StrUtil.indexOfIgnoreCase(hex, sp.searchString, Locale.ENGLISH) >= 0;
}

View File

@@ -19,20 +19,18 @@
*/
package com.keepassdroid.database;
import java.util.Date;
public interface ITimeLogger {
Date getLastModificationTime();
void setLastModificationTime(Date date);
PwDate getLastModificationTime();
void setLastModificationTime(PwDate date);
Date getCreationTime();
void setCreationTime(Date date);
PwDate getCreationTime();
void setCreationTime(PwDate date);
Date getLastAccessTime();
void setLastAccessTime(Date date);
PwDate getLastAccessTime();
void setLastAccessTime(PwDate date);
Date getExpiryTime();
void setExpiryTime(Date date);
PwDate getExpiryTime();
void setExpiryTime(PwDate date);
boolean expires();
void setExpires(boolean exp);
@@ -40,7 +38,7 @@ public interface ITimeLogger {
long getUsageCount();
void setUsageCount(long count);
Date getLocationChanged();
void setLocationChanged(Date date);
PwDate getLocationChanged();
void setLocationChanged(PwDate date);
}

View File

@@ -317,8 +317,8 @@ public abstract class PwDatabase {
public void populateGlobals(PwGroup currentGroup) {
List<PwGroup> childGroups = currentGroup.childGroups;
List<PwEntry> childEntries = currentGroup.childEntries;
List<PwGroup> childGroups = currentGroup.getChildGroups();
List<PwEntry> childEntries = currentGroup.getChildEntries();
for (int i = 0; i < childEntries.size(); i++ ) {
PwEntry cur = childEntries.get(i);

View File

@@ -105,7 +105,7 @@ public class PwDatabaseV3 extends PwDatabase {
List<PwGroup> kids = new ArrayList<PwGroup>();
for (int i = 0; i < groups.size(); i++) {
PwGroupV3 grp = (PwGroupV3) groups.get(i);
if (grp.level == target)
if (grp.getLevel() == target)
kids.add(grp);
}
return kids;
@@ -114,8 +114,8 @@ public class PwDatabaseV3 extends PwDatabase {
public int getRootGroupId() {
for (int i = 0; i < groups.size(); i++) {
PwGroupV3 grp = (PwGroupV3) groups.get(i);
if (grp.level == 0) {
return grp.groupId;
if (grp.getLevel() == 0) {
return grp.getGroupId();
}
}
@@ -124,13 +124,13 @@ public class PwDatabaseV3 extends PwDatabase {
public List<PwGroup> getGrpChildren(PwGroupV3 parent) {
int idx = groups.indexOf(parent);
int target = parent.level + 1;
int target = parent.getLevel() + 1;
List<PwGroup> kids = new ArrayList<PwGroup>();
while (++idx < groups.size()) {
PwGroupV3 grp = (PwGroupV3) groups.get(idx);
if (grp.level < target)
if (grp.getLevel() < target)
break;
else if (grp.level == target)
else if (grp.getLevel() == target)
kids.add(grp);
}
return kids;
@@ -145,7 +145,7 @@ public class PwDatabaseV3 extends PwDatabase {
*/
for (int i = 0; i < entries.size(); i++) {
PwEntryV3 ent = (PwEntryV3) entries.get(i);
if (ent.groupId == parent.groupId)
if (ent.getGroupId() == parent.getGroupId())
kids.add(ent);
}
return kids;
@@ -163,11 +163,11 @@ public class PwDatabaseV3 extends PwDatabase {
List<PwGroup> rootChildGroups = getGrpRoots();
root.setGroups(rootChildGroups);
root.childEntries = new ArrayList<>();
root.level = -1;
root.setEntries(new ArrayList<>());
root.setLevel(-1);
for (int i = 0; i < rootChildGroups.size(); i++) {
PwGroupV3 grp = (PwGroupV3) rootChildGroups.get(i);
grp.parent = root;
grp.setParent(root);
constructTree(grp);
}
return;
@@ -176,18 +176,18 @@ public class PwDatabaseV3 extends PwDatabase {
// I'm in non-root
// get child groups
currentGroup.setGroups(getGrpChildren(currentGroup));
currentGroup.childEntries = getEntries(currentGroup);
currentGroup.setEntries(getEntries(currentGroup));
// set parent in child entries
for (int i = 0; i < currentGroup.numbersOfChildEntries(); i++) {
PwEntryV3 entry = (PwEntryV3) currentGroup.childEntries.get(i);
entry.parent = currentGroup;
PwEntryV3 entry = (PwEntryV3) currentGroup.getChildEntryAt(i);
entry.setParent(currentGroup);
}
// recursively construct child groups
for (int i = 0; i < currentGroup.numbersOfChildGroups(); i++) {
PwGroupV3 grp = (PwGroupV3) currentGroup.childGroups.get(i);
grp.parent = currentGroup;
constructTree((PwGroupV3) currentGroup.childGroups.get(i));
PwGroupV3 grp = (PwGroupV3) currentGroup.getChildGroupAt(i);
grp.setParent(currentGroup);
constructTree((PwGroupV3) currentGroup.getChildGroupAt(i));
}
return;
}
@@ -316,11 +316,11 @@ public class PwDatabaseV3 extends PwDatabase {
public boolean isBackup(PwGroup group) {
PwGroupV3 g = (PwGroupV3) group;
while (g != null) {
if (g.level == 0 && g.name.equalsIgnoreCase("Backup")) {
if (g.getLevel() == 0 && g.getName().equalsIgnoreCase("Backup")) {
return true;
}
g = g.parent;
g = (PwGroupV3) g.getParent();
}
return false;
@@ -338,7 +338,7 @@ public class PwDatabaseV3 extends PwDatabase {
private void initAndAddGroup(String name, int iconId, PwGroup parent) {
PwGroup group = createGroup();
group.initNewGroup(name, newGroupId());
group.icon = iconFactory.getIcon(iconId);
group.setIcon(iconFactory.getIcon(iconId));
addGroupTo(group, parent);
}

View File

@@ -58,7 +58,6 @@ import biz.source_code.base64Coder.Base64Coder;
public class PwDatabaseV4 extends PwDatabase {
public static final Date DEFAULT_NOW = new Date();
public static final UUID UUID_ZERO = new UUID(0,0);
public static final int DEFAULT_ROUNDS = 6000;
private static final int DEFAULT_HISTORY_MAX_ITEMS = 10; // -1 unlimited
@@ -71,14 +70,14 @@ public class PwDatabaseV4 extends PwDatabase {
public PwCompressionAlgorithm compressionAlgorithm = PwCompressionAlgorithm.Gzip;
// TODO: Refactor me away to get directly from kdfParameters
public long numKeyEncRounds = 6000;
public Date nameChanged = DEFAULT_NOW;
public Date settingsChanged = DEFAULT_NOW;
public Date nameChanged = new Date();
public Date settingsChanged = new Date();
public String description = "";
public Date descriptionChanged = DEFAULT_NOW;
public Date descriptionChanged = new Date();
public String defaultUserName = "";
public Date defaultUserNameChanged = DEFAULT_NOW;
public Date defaultUserNameChanged = new Date();
public Date keyLastChanged = DEFAULT_NOW;
public Date keyLastChanged = new Date();
public long keyChangeRecDays = -1;
public long keyChangeForceDays = 1;
public boolean keyChangeForceOnce = false;
@@ -87,17 +86,17 @@ public class PwDatabaseV4 extends PwDatabase {
public String color = "";
public boolean recycleBinEnabled = true;
public UUID recycleBinUUID = UUID_ZERO;
public Date recycleBinChanged = DEFAULT_NOW;
public Date recycleBinChanged = new Date();
public UUID entryTemplatesGroup = UUID_ZERO;
public Date entryTemplatesGroupChanged = DEFAULT_NOW;
public Date entryTemplatesGroupChanged = new Date();
public int historyMaxItems = DEFAULT_HISTORY_MAX_ITEMS;
public long historyMaxSize = DEFAULT_HISTORY_MAX_SIZE;
public UUID lastSelectedGroup = UUID_ZERO;
public UUID lastTopVisibleGroup = UUID_ZERO;
public MemoryProtectionConfig memoryProtection = new MemoryProtectionConfig();
public List<PwDeletedObject> deletedObjects = new ArrayList<PwDeletedObject>();
public List<PwIconCustom> customIcons = new ArrayList<PwIconCustom>();
public Map<String, String> customData = new HashMap<String, String>();
public List<PwDeletedObject> deletedObjects = new ArrayList<>();
public List<PwIconCustom> customIcons = new ArrayList<>();
public Map<String, String> customData = new HashMap<>();
public KdfParameters kdfParameters = KdfFactory.getDefaultParameters();
public VariantDictionary publicCustomData = new VariantDictionary();
public BinaryPool binPool = new BinaryPool();
@@ -276,7 +275,7 @@ public class PwDatabaseV4 extends PwDatabase {
@Override
public List<PwGroup> getGrpRoots() {
return rootGroup.childGroups;
return rootGroup.getChildGroups();
}
@Override
@@ -351,7 +350,7 @@ public class PwDatabaseV4 extends PwDatabase {
if (getRecycleBin() == null) {
// Create recycle bin
PwGroupV4 recycleBin = new PwGroupV4(true, true, RECYCLEBIN_NAME, iconFactory.getIcon(PwIconStandard.TRASH_BIN));
PwGroupV4 recycleBin = new PwGroupV4(true, RECYCLEBIN_NAME, iconFactory.getIcon(PwIconStandard.TRASH_BIN));
recycleBin.enableAutoType = false;
recycleBin.enableSearching = false;
recycleBin.isExpanded = false;
@@ -480,7 +479,7 @@ public class PwDatabaseV4 extends PwDatabase {
public void initNew(String dbPath) {
String filename = URLUtil.guessFileName(dbPath, null, null);
rootGroup = new PwGroupV4(true, true, dbNameFromPath(dbPath), iconFactory.getIcon(PwIconStandard.FOLDER));
rootGroup = new PwGroupV4(true, dbNameFromPath(dbPath), iconFactory.getIcon(PwIconStandard.FOLDER));
groups.put(rootGroup.getId(), rootGroup);
}

View File

@@ -43,6 +43,56 @@ public class PwDate implements Cloneable, Serializable {
private Date jDate;
private byte[] cDate;
public static final Date NEVER_EXPIRE = getNeverExpire();
public static final Date NEVER_EXPIRE_BUG = getNeverExpireBug();
public static final Date DEFAULT_DATE = getDefaultDate();
public static final PwDate PW_NEVER_EXPIRE = new PwDate(NEVER_EXPIRE);
public static final PwDate PW_NEVER_EXPIRE_BUG = new PwDate(NEVER_EXPIRE_BUG);
public static final PwDate DEFAULT_PWDATE = new PwDate(DEFAULT_DATE);
private static Date getDefaultDate() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2004);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
private static Date getNeverExpire() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2999);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 28);
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
/** This date was was accidentally being written
* out when an entry was supposed to be marked as
* expired. We'll use this to silently correct those
* entries.
* @return
*/
private static Date getNeverExpireBug() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2999);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 30);
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
public PwDate(byte[] buf, int offset) {
cDate = new byte[DATE_SIZE];
System.arraycopy(buf, offset, cDate, 0, DATE_SIZE);
@@ -59,8 +109,9 @@ public class PwDate implements Cloneable, Serializable {
jDateBuilt = true;
}
private PwDate() {
public PwDate() {
jDate = new Date();
jDateBuilt = true;
}
@Override
@@ -82,9 +133,7 @@ public class PwDate implements Cloneable, Serializable {
return copy;
}
public Date getJDate() {
public Date getDate() {
if ( ! jDateBuilt ) {
jDate = readTime(cDate, 0, App.getCalendar());
jDateBuilt = true;
@@ -102,7 +151,6 @@ public class PwDate implements Cloneable, Serializable {
return cDate;
}
/**
* Unpack date from 5 byte format. The five bytes at 'offset' are unpacked
* to a java.util.Date instance.
@@ -189,7 +237,7 @@ public class PwDate implements Cloneable, Serializable {
} else if ( cDateBuilt && date.jDateBuilt ) {
return Arrays.equals(date.getCDate(), cDate);
} else {
return IsSameDate(date.getJDate(), jDate);
return IsSameDate(date.getDate(), jDate);
}
}

View File

@@ -69,52 +69,30 @@ public abstract class PwEntry extends PwNode implements Cloneable {
}
public void assign(PwEntry source) {
super.assign(source);
icon = source.icon;
}
public abstract UUID getUUID();
public abstract void setUUID(UUID u);
public String getTitle() {
return getTitle(false, null);
}
public void startToDecodeReference(PwDatabase db) {}
public void endToDecodeReference(PwDatabase db) {}
public String getUsername() {
return getUsername(false, null);
}
public abstract String getTitle();
public abstract void setTitle(String title);
public String getPassword() {
return getPassword(false, null);
}
public abstract String getUsername();
public abstract void setUsername(String user);
public String getUrl() {
return getUrl(false, null);
}
public abstract String getPassword();
public abstract void setPassword(String pass);
public String getNotes() {
return getNotes(false, null);
}
public abstract String getUrl();
public abstract void setUrl(String url);
public abstract String getTitle(boolean decodeRef, PwDatabase db);
public abstract String getUsername(boolean decodeRef, PwDatabase db);
public abstract String getPassword(boolean decodeRef, PwDatabase db);
public abstract String getUrl(boolean decodeRef, PwDatabase db);
public abstract String getNotes(boolean decodeRef, PwDatabase db);
public abstract Date getLastModificationTime();
public abstract Date getLastAccessTime();
public abstract Date getExpiryTime();
public abstract boolean expires();
public abstract void setTitle(String title, PwDatabase db);
public abstract void setUsername(String user, PwDatabase db);
public abstract void setPassword(String pass, PwDatabase db);
public abstract void setUrl(String url, PwDatabase db);
public abstract void setNotes(String notes, PwDatabase db);
public abstract void setCreationTime(Date create);
public abstract void setLastModificationTime(Date mod);
public abstract void setLastAccessTime(Date access);
public abstract void setExpires(boolean exp);
public abstract void setExpiryTime(Date expires);
public abstract String getNotes();
public abstract void setNotes(String notes);
public PwIcon getIcon() {
return icon;
@@ -148,10 +126,9 @@ public abstract class PwEntry extends PwNode implements Cloneable {
/**
* Retrieve extra fields to show, key is the label, value is the value of field
* @param pm Database
* @return Map of label/value
*/
public Map<String, String> getExtraFields(PwDatabase pm) {
public Map<String, String> getExtraFields() {
return new HashMap<>();
}
@@ -196,7 +173,7 @@ public abstract class PwEntry extends PwNode implements Cloneable {
}
public void touch(boolean modified, boolean touchParents) {
Date now = new Date();
PwDate now = new PwDate();
setLastAccessTime(now);
@@ -282,7 +259,8 @@ public abstract class PwEntry extends PwNode implements Cloneable {
if (object1.equals(object2))
return 0;
int entryCreationComp = object1.getCreationTime().compareTo(object2.getCreationTime());
int entryCreationComp = object1.getCreationTime().getDate()
.compareTo(object2.getCreationTime().getDate());
// If same creation, can be different
if (entryCreationComp == 0) {
return object1.hashCode() - object2.hashCode();

View File

@@ -42,12 +42,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
package com.keepassdroid.database;
// PhoneID
import com.keepassdroid.utils.Types;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
@@ -74,340 +71,60 @@ import java.util.UUID;
*/
public class PwEntryV3 extends PwEntry {
public static final Date NEVER_EXPIRE = getNeverExpire();
public static final Date NEVER_EXPIRE_BUG = getNeverExpireBug();
public static final Date DEFAULT_DATE = getDefaultDate();
public static final PwDate PW_NEVER_EXPIRE = new PwDate(NEVER_EXPIRE);
public static final PwDate PW_NEVER_EXPIRE_BUG = new PwDate(NEVER_EXPIRE_BUG);
public static final PwDate DEFAULT_PWDATE = new PwDate(DEFAULT_DATE);
/** Size of byte buffer needed to hold this struct. */
public static final String PMS_ID_BINDESC = "bin-stream";
public static final String PMS_ID_TITLE = "Meta-Info";
public static final String PMS_ID_USER = "SYSTEM";
public static final String PMS_ID_URL = "$";
public int groupId;
public String username;
private byte[] password;
private byte[] uuid;
public String title;
public String url;
public String additional;
public PwDate tCreation;
public PwDate tLastMod;
public PwDate tLastAccess;
public PwDate tExpire;
/** A string describing what is in pBinaryData */
public String binaryDesc;
private byte[] binaryData;
private static Date getDefaultDate() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2004);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
private static Date getNeverExpire() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2999);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 28);
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
/** This date was was accidentally being written
* out when an entry was supposed to be marked as
* expired. We'll use this to silently correct those
* entries.
* @return
*/
private static Date getNeverExpireBug() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2999);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 30);
cal.set(Calendar.HOUR, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
public static boolean IsNever(Date date) {
return PwDate.IsSameDate(NEVER_EXPIRE, date);
}
private static final String PMS_ID_BINDESC = "bin-stream";
private static final String PMS_ID_TITLE = "Meta-Info";
private static final String PMS_ID_USER = "SYSTEM";
private static final String PMS_ID_URL = "$";
// for tree traversing
public PwGroupV3 parent = null;
private PwGroupV3 parent = null;
private int groupId;
private byte[] uuid;
private String username;
private byte[] password;
private String title;
private String url;
private String additional;
/** A string describing what is in pBinaryData */
private String binaryDesc;
private byte[] binaryData;
public PwEntryV3() {
super();
}
/*
public PwEntryV3(PwEntryV3 source) {
assign(source);
}
*/
public PwEntryV3(PwGroupV3 p) {
this(p, true, true);
}
public PwEntryV3(PwGroupV3 p, boolean initId, boolean initDates) {
parent = p;
groupId = ((PwGroupIdV3)parent.getId()).getId();
if (initId) {
Random random = new Random();
uuid = new byte[16];
random.nextBytes(uuid);
}
if (initDates) {
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
tCreation = new PwDate(now);
tLastAccess = new PwDate(now);
tLastMod = new PwDate(now);
tExpire = new PwDate(NEVER_EXPIRE);
}
}
/**
* @return the actual password byte array.
*/
@Override
public String getPassword(boolean decodeRef, PwDatabase db) {
if (password == null) {
return "";
}
return new String(password);
}
public byte[] getPasswordBytes() {
return password;
}
/**
* fill byte array
*/
private static void fill(byte[] array, byte value)
{
for (int i=0; i<array.length; i++)
array[i] = value;
return;
}
/** Securely erase old password before copying new. */
public void setPassword( byte[] buf, int offset, int len ) {
if( password != null ) {
fill( password, (byte)0 );
password = null;
}
password = new byte[len];
System.arraycopy( buf, offset, password, 0, len );
}
@Override
public void setPassword(String pass, PwDatabase db) {
byte[] password;
try {
password = pass.getBytes("UTF-8");
setPassword(password, 0, password.length);
} catch (UnsupportedEncodingException e) {
assert false;
password = pass.getBytes();
setPassword(password, 0, password.length);
}
}
/**
* @return the actual binaryData byte array.
*/
public byte[] getBinaryData() {
return binaryData;
}
/** Securely erase old data before copying new. */
public void setBinaryData( byte[] buf, int offset, int len ) {
if( binaryData != null ) {
fill( binaryData, (byte)0 );
binaryData = null;
}
binaryData = new byte[len];
System.arraycopy( buf, offset, binaryData, 0, len );
}
// Determine if this is a MetaStream entry
@Override
public boolean isMetaStream() {
if ( binaryData == null ) return false;
if ( additional == null || additional.length() == 0 ) return false;
if ( ! binaryDesc.equals(PMS_ID_BINDESC) ) return false;
if ( title == null ) return false;
if ( ! title.equals(PMS_ID_TITLE) ) return false;
if ( username == null ) return false;
if ( ! username.equals(PMS_ID_USER) ) return false;
if ( url == null ) return false;
if ( ! url.equals(PMS_ID_URL)) return false;
if ( !icon.isMetaStreamIcon() ) return false;
return true;
}
@Override
public void assign(PwEntry source) {
if ( ! (source instanceof PwEntryV3) ) {
throw new RuntimeException("DB version mix");
}
super.assign(source);
PwEntryV3 src = (PwEntryV3) source;
assign(src);
}
private void assign(PwEntryV3 source) {
title = source.title;
url = source.url;
groupId = source.groupId;
username = source.username;
additional = source.additional;
uuid = source.uuid;
int passLen = source.password.length;
password = new byte[passLen];
System.arraycopy(source.password, 0, password, 0, passLen);
tCreation = (PwDate) source.tCreation.clone();
tLastMod = (PwDate) source.tLastMod.clone();
tLastAccess = (PwDate) source.tLastAccess.clone();
tExpire = (PwDate) source.tExpire.clone();
binaryDesc = source.binaryDesc;
if ( source.binaryData != null ) {
int descLen = source.binaryData.length;
binaryData = new byte[descLen];
System.arraycopy(source.binaryData, 0, binaryData, 0, descLen);
}
parent = source.parent;
}
@Override
public Object clone() {
PwEntryV3 newEntry = (PwEntryV3) super.clone();
if (password != null) {
int passLen = password.length;
password = new byte[passLen];
System.arraycopy(password, 0, newEntry.password, 0, passLen);
}
newEntry.tCreation = (PwDate) tCreation.clone();
newEntry.tLastMod = (PwDate) tLastMod.clone();
newEntry.tLastAccess = (PwDate) tLastAccess.clone();
newEntry.tExpire = (PwDate) tExpire.clone();
newEntry.binaryDesc = binaryDesc;
if ( binaryData != null ) {
int descLen = binaryData.length;
newEntry.binaryData = new byte[descLen];
System.arraycopy(binaryData, 0, newEntry.binaryData, 0, descLen);
}
newEntry.parent = parent;
return newEntry;
}
@Override
public Date getLastAccessTime() {
return tLastAccess.getJDate();
}
@Override
public Date getCreationTime() {
return tCreation.getJDate();
}
@Override
public Date getExpiryTime() {
return tExpire.getJDate();
}
@Override
public Date getLastModificationTime() {
return tLastMod.getJDate();
}
@Override
public void setCreationTime(Date create) {
tCreation = new PwDate(create);
}
@Override
public void setLastModificationTime(Date mod) {
tLastMod = new PwDate(mod);
}
@Override
public void setLastAccessTime(Date access) {
tLastAccess = new PwDate(access);
}
@Override
public void setExpires(boolean expires) {
if (!expires) {
tExpire = PW_NEVER_EXPIRE;
}
}
@Override
public void setExpiryTime(Date expires) {
tExpire = new PwDate(expires);
}
@Override
public PwGroupV3 getParent() {
return parent;
}
@Override
public void setParent(PwGroup parent) {
this.parent = (PwGroupV3) parent;
}
public int getGroupId() {
return groupId;
}
public void setGroupId(int groupId) {
this.groupId = groupId;
}
@Override
public UUID getUUID() {
return Types.bytestoUUID(uuid);
@@ -419,54 +136,48 @@ public class PwEntryV3 extends PwEntry {
}
@Override
public String getUsername(boolean decodeRef, PwDatabase db) {
public String getUsername() {
if (username == null) {
return "";
}
return username;
}
@Override
public void setUsername(String user, PwDatabase db) {
public void setUsername(String user) {
username = user;
}
@Override
public String getTitle(boolean decodeRef, PwDatabase db) {
public String getTitle() {
return title;
}
@Override
public void setTitle(String title, PwDatabase db) {
public void setTitle(String title) {
this.title = title;
}
@Override
public String getNotes(boolean decodeRef, PwDatabase db) {
public String getNotes() {
return additional;
}
@Override
public void setNotes(String notes, PwDatabase db) {
public void setNotes(String notes) {
additional = notes;
}
@Override
public String getUrl(boolean decodeRef, PwDatabase db) {
public String getUrl() {
return url;
}
@Override
public void setUrl(String url, PwDatabase db) {
public void setUrl(String url) {
this.url = url;
}
@Override
public boolean expires() {
return ! IsNever(tExpire.getJDate());
}
public void populateBlankFields(PwDatabaseV3 db) {
if (icon == null) {
icon = db.iconFactory.getIcon(1);
@@ -496,22 +207,6 @@ public class PwEntryV3 extends PwEntry {
additional = "";
}
if (tCreation == null) {
tCreation = DEFAULT_PWDATE;
}
if (tLastMod == null) {
tLastMod = DEFAULT_PWDATE;
}
if (tLastAccess == null) {
tLastAccess = DEFAULT_PWDATE;
}
if (tExpire == null) {
tExpire = PW_NEVER_EXPIRE;
}
if (binaryDesc == null) {
binaryDesc = "";
}
@@ -521,8 +216,163 @@ public class PwEntryV3 extends PwEntry {
}
}
/**
* @return the actual password byte array.
*/
@Override
public void setParent(PwGroup parent) {
this.parent = (PwGroupV3) parent;
public String getPassword() {
if (password == null) {
return "";
}
return new String(password);
}
public byte[] getPasswordBytes() {
return password;
}
/**
* fill byte array
*/
private static void fill(byte[] array, byte value)
{
for (int i=0; i<array.length; i++)
array[i] = value;
return;
}
/** Securely erase old password before copying new. */
public void setPassword( byte[] buf, int offset, int len ) {
if( password != null ) {
fill( password, (byte)0 );
password = null;
}
password = new byte[len];
System.arraycopy( buf, offset, password, 0, len );
}
@Override
public void setPassword(String pass) {
byte[] password;
try {
password = pass.getBytes("UTF-8");
setPassword(password, 0, password.length);
} catch (UnsupportedEncodingException e) {
assert false;
password = pass.getBytes();
setPassword(password, 0, password.length);
}
}
/**
* @return the actual binaryData byte array.
*/
public byte[] getBinaryData() {
return binaryData;
}
/** Securely erase old data before copying new. */
public void setBinaryData( byte[] buf, int offset, int len ) {
if( binaryData != null ) {
fill( binaryData, (byte)0 );
binaryData = null;
}
binaryData = new byte[len];
System.arraycopy( buf, offset, binaryData, 0, len );
}
public String getBinaryDesc() {
return binaryDesc;
}
public void setBinaryDesc(String binaryDesc) {
this.binaryDesc = binaryDesc;
}
// Determine if this is a MetaStream entry
@Override
public boolean isMetaStream() {
if ( binaryData == null ) return false;
if ( additional == null || additional.length() == 0 ) return false;
if ( ! binaryDesc.equals(PMS_ID_BINDESC) ) return false;
if ( title == null ) return false;
if ( ! title.equals(PMS_ID_TITLE) ) return false;
if ( username == null ) return false;
if ( ! username.equals(PMS_ID_USER) ) return false;
if ( url == null ) return false;
if ( ! url.equals(PMS_ID_URL)) return false;
if ( !icon.isMetaStreamIcon() ) return false;
return true;
}
@Override
public void assign(PwEntry source) {
if ( ! (source instanceof PwEntryV3) ) {
throw new RuntimeException("DB version mix");
}
super.assign(source);
PwEntryV3 src = (PwEntryV3) source;
assign(src);
}
private void assign(PwEntryV3 source) {
title = source.title;
url = source.url;
groupId = source.groupId;
username = source.username;
additional = source.additional;
uuid = source.uuid;
int passLen = source.password.length;
password = new byte[passLen];
System.arraycopy(source.password, 0, password, 0, passLen);
setCreationTime( (PwDate) source.getCreationTime().clone() );
setLastModificationTime( (PwDate) source.getLastModificationTime().clone() );
setLastAccessTime( (PwDate) source.getLastAccessTime().clone() );
setExpiryTime( (PwDate) source.getExpiryTime().clone() );
binaryDesc = source.binaryDesc;
if ( source.binaryData != null ) {
int descLen = source.binaryData.length;
binaryData = new byte[descLen];
System.arraycopy(source.binaryData, 0, binaryData, 0, descLen);
}
parent = source.parent;
}
@Override
public Object clone() {
PwEntryV3 newEntry = (PwEntryV3) super.clone();
if (password != null) {
int passLen = password.length;
password = new byte[passLen];
System.arraycopy(password, 0, newEntry.password, 0, passLen);
}
newEntry.setCreationTime( (PwDate) getCreationTime().clone() );
newEntry.setLastModificationTime( (PwDate) getLastModificationTime().clone() );
newEntry.setLastAccessTime( (PwDate) getLastAccessTime().clone() );
newEntry.setExpiryTime( (PwDate) getExpiryTime().clone() );
newEntry.binaryDesc = binaryDesc;
if ( binaryData != null ) {
int descLen = binaryData.length;
newEntry.binaryData = new byte[descLen];
System.arraycopy(binaryData, 0, newEntry.binaryData, 0, descLen);
}
newEntry.parent = parent;
return newEntry;
}
}

View File

@@ -21,11 +21,10 @@ package com.keepassdroid.database;
import com.keepassdroid.database.security.ProtectedBinary;
import com.keepassdroid.database.security.ProtectedString;
import com.keepassdroid.utils.SprEngine;
import com.keepassdroid.utils.SprEngineV4;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -41,8 +40,12 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
public static final String STR_URL = "URL";
public static final String STR_NOTES = "Notes";
// To decode each field not serializable
private transient PwDatabase mDatabase = null;
private transient boolean mDecodeRef = false;
public PwGroupV4 parent;
public UUID uuid = PwDatabaseV4.UUID_ZERO;
private UUID uuid = PwDatabaseV4.UUID_ZERO;
private HashMap<String, ProtectedString> fields = new HashMap<>();
public HashMap<String, ProtectedBinary> binaries = new HashMap<>();
public PwIconCustom customIcon = PwIconCustom.ZERO;
@@ -52,17 +55,12 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
public AutoType autoType = new AutoType();
public ArrayList<PwEntryV4> history = new ArrayList<>();
private Date parentGroupLastMod = PwDatabaseV4.DEFAULT_NOW;
private Date creation = PwDatabaseV4.DEFAULT_NOW;
private Date lastMod = PwDatabaseV4.DEFAULT_NOW;
private Date lastAccess = PwDatabaseV4.DEFAULT_NOW;
private Date expireDate = PwDatabaseV4.DEFAULT_NOW;
private boolean expires = false;
private PwDate parentGroupLastMod = new PwDate();
private long usageCount = 0;
public String url = "";
public String additional = "";
public String tags = "";
public Map<String, String> customData = new HashMap<String, String>();
public Map<String, String> customData = new HashMap<>();
public class AutoType implements Cloneable, Serializable {
private static final long OBF_OPT_NONE = 0;
@@ -71,7 +69,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
public long obfuscationOptions = OBF_OPT_NONE;
public String defaultSequence = "";
private HashMap<String, String> windowSeqPairs = new HashMap<String, String>();
private HashMap<String, String> windowSeqPairs = new HashMap<>();
@SuppressWarnings("unchecked")
public Object clone() {
@@ -80,7 +78,6 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
auto = (AutoType) super.clone();
}
catch (CloneNotSupportedException e) {
assert(false);
throw new RuntimeException(e);
}
@@ -101,30 +98,13 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
}
public PwEntryV4() {
}
public PwEntryV4(PwGroupV4 p) {
this(p, true, true);
}
public PwEntryV4(PwGroupV4 p, boolean initId, boolean initDates) {
parent = p;
if (initId) {
uuid = UUID.randomUUID();
}
if (initDates) {
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
creation = now;
lastAccess = now;
lastMod = now;
expires = false;
}
}
@SuppressWarnings("unchecked")
@Override
@@ -152,6 +132,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
}
private void assign(PwEntryV4 source) {
super.assign(source);
parent = source.parent;
uuid = source.uuid;
fields = source.fields;
@@ -163,131 +144,98 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
autoType = source.autoType;
history = source.history;
parentGroupLastMod = source.parentGroupLastMod;
creation = source.creation;
lastMod = source.lastMod;
lastAccess = source.lastAccess;
expireDate = source.expireDate;
expires = source.expires;
usageCount = source.usageCount;
url = source.url;
additional = source.additional;
}
@Override
public Object clone() {
PwEntryV4 newEntry = (PwEntryV4) super.clone();
return newEntry;
}
private String decodeRefKey(boolean decodeRef, String key, PwDatabase db) {
String text = getString(key);
if (decodeRef) {
text = decodeRef(text, db);
@Override
public void startToDecodeReference(PwDatabase db) {
this.mDatabase = db;
this.mDecodeRef = true;
}
@Override
public void endToDecodeReference(PwDatabase db) {
this.mDatabase = null;
this.mDecodeRef = false;
}
private String decodeRefKey(boolean decodeRef, String key) {
String text = getString(key);
if (decodeRef) {
text = decodeRef(text, mDatabase);
}
return text;
}
private String decodeRef(String text, PwDatabase db) {
if (db == null) { return text; }
SprEngine spr = SprEngine.getInstance(db);
SprEngineV4 spr = new SprEngineV4();
return spr.compile(text, this, db);
}
@Override
public String getUsername(boolean decodeRef, PwDatabase db) {
return decodeRefKey(decodeRef, STR_USERNAME, db);
public String getUsername() {
return decodeRefKey(mDecodeRef, STR_USERNAME);
}
@Override
public String getTitle(boolean decodeRef, PwDatabase db) {
return decodeRefKey(decodeRef, STR_TITLE, db);
public String getTitle() {
return decodeRefKey(mDecodeRef, STR_TITLE);
}
@Override
public String getPassword(boolean decodeRef, PwDatabase db) {
return decodeRefKey(decodeRef, STR_PASSWORD, db);
public String getPassword() {
return decodeRefKey(mDecodeRef, STR_PASSWORD);
}
@Override
public Date getLastAccessTime() {
return lastAccess;
}
@Override
public Date getCreationTime() {
return creation;
}
@Override
public Date getExpiryTime() {
return expireDate;
}
@Override
public Date getLastModificationTime() {
return lastMod;
}
@Override
public void setTitle(String title, PwDatabase d) {
PwDatabaseV4 db = (PwDatabaseV4) d;
public void setTitle(String title) {
PwDatabaseV4 db = (PwDatabaseV4) mDatabase;
boolean protect = db.memoryProtection.protectTitle;
setString(STR_TITLE, title, protect);
}
@Override
public void setUsername(String user, PwDatabase d) {
PwDatabaseV4 db = (PwDatabaseV4) d;
public void setUsername(String user) {
PwDatabaseV4 db = (PwDatabaseV4) mDatabase;
boolean protect = db.memoryProtection.protectUserName;
setString(STR_USERNAME, user, protect);
}
@Override
public void setPassword(String pass, PwDatabase d) {
PwDatabaseV4 db = (PwDatabaseV4) d;
public void setPassword(String pass) {
PwDatabaseV4 db = (PwDatabaseV4) mDatabase;
boolean protect = db.memoryProtection.protectPassword;
setString(STR_PASSWORD, pass, protect);
}
@Override
public void setUrl(String url, PwDatabase d) {
PwDatabaseV4 db = (PwDatabaseV4) d;
public void setUrl(String url) {
PwDatabaseV4 db = (PwDatabaseV4) mDatabase;
boolean protect = db.memoryProtection.protectUrl;
setString(STR_URL, url, protect);
}
@Override
public void setNotes(String notes, PwDatabase d) {
PwDatabaseV4 db = (PwDatabaseV4) d;
public void setNotes(String notes) {
PwDatabaseV4 db = (PwDatabaseV4) mDatabase;
boolean protect = db.memoryProtection.protectNotes;
setString(STR_NOTES, notes, protect);
}
public void setCreationTime(Date date) {
creation = date;
}
public void setExpiryTime(Date date) {
expireDate = date;
}
public void setLastAccessTime(Date date) {
lastAccess = date;
}
public void setLastModificationTime(Date date) {
lastMod = date;
}
@Override
public PwGroupV4 getParent() {
return parent;
@@ -307,7 +255,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
public String getString(String key) {
ProtectedString value = fields.get(key);
if ( value == null ) return new String("");
if ( value == null ) return "";
return value.toString();
}
@@ -317,7 +265,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
fields.put(key, ps);
}
public Date getLocationChanged() {
public PwDate getLocationChanged() {
return parentGroupLastMod;
}
@@ -325,7 +273,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
return usageCount;
}
public void setLocationChanged(Date date) {
public void setLocationChanged(PwDate date) {
parentGroupLastMod = date;
}
@@ -334,22 +282,13 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
}
@Override
public boolean expires() {
return expires;
}
public void setExpires(boolean exp) {
expires = exp;
public String getNotes() {
return decodeRefKey(mDecodeRef, STR_NOTES);
}
@Override
public String getNotes(boolean decodeRef, PwDatabase db) {
return decodeRefKey(decodeRef, STR_NOTES, db);
}
@Override
public String getUrl(boolean decodeRef, PwDatabase db) {
return decodeRefKey(decodeRef, STR_URL, db);
public String getUrl() {
return decodeRefKey(mDecodeRef, STR_URL);
}
@Override
@@ -417,7 +356,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
for (int i = 0; i < history.size(); i++) {
PwEntry entry = history.get(i);
Date lastMod = entry.getLastModificationTime();
Date lastMod = entry.getLastModificationTime().getDate();
if ((min == null) || lastMod.before(min)) {
index = i;
min = lastMod;
@@ -453,16 +392,16 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
}
@Override
public Map<String, String> getExtraFields(PwDatabase pm) {
Map<String, String> extraFields = super.getExtraFields(pm);
SprEngine spr = SprEngine.getInstance(pm);
public Map<String, String> getExtraFields() {
Map<String, String> extraFields = super.getExtraFields();
SprEngineV4 spr = new SprEngineV4();
// Display custom fields
if (fields.size() > 0) {
for (Map.Entry<String, ProtectedString> pair : fields.entrySet()) {
String key = pair.getKey();
// TODO Add hidden style for protection field
if (!PwEntryV4.IsStandardField(key)) {
extraFields.put(key, spr.compile(pair.getValue().toString(), this, pm));
extraFields.put(key, spr.compile(pair.getValue().toString(), this, mDatabase));
}
}
}
@@ -529,7 +468,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger {
@Override
public void touchLocation() {
parentGroupLastMod = new Date();
parentGroupLastMod = new PwDate();
}
@Override

View File

@@ -24,24 +24,40 @@ import com.keepassdroid.utils.StrUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public abstract class PwGroup extends PwNode {
// TODO Change dependency and make private
public List<PwGroup> childGroups = new ArrayList<>();
public List<PwEntry> childEntries = new ArrayList<>();
public String name = "";
public PwIconStandard icon;
private List<PwNode> children = new ArrayList<>();
protected String name = "";
protected PwIconStandard icon;
protected List<PwGroup> childGroups = new ArrayList<>();
protected List<PwEntry> childEntries = new ArrayList<>();
private transient List<PwNode> children = new ArrayList<>();
public void initNewGroup(String nm, PwGroupId newId) {
setId(newId);
name = nm;
}
public List<PwGroup> getChildGroups() {
return childGroups;
}
public List<PwEntry> getChildEntries() {
return childEntries;
}
public void setGroups(List<PwGroup> groups) {
childGroups = groups;
}
public void setEntries(List<PwEntry> entries) {
childEntries = entries;
}
public void addChildGroup(PwGroup group) {
this.childGroups.add(group);
}
@@ -50,6 +66,15 @@ public abstract class PwGroup extends PwNode {
this.childEntries.add(entry);
}
// Todo parameter type
public PwGroup getChildGroupAt(int number) {
return this.childGroups.get(number);
}
public PwEntry getChildEntryAt(int number) {
return this.childEntries.get(number);
}
public void removeChildGroup(PwGroup group) {
this.childGroups.remove(group);
}
@@ -112,24 +137,33 @@ public abstract class PwGroup extends PwNode {
return getName();
}
public abstract String getName();
public String getName() {
return name;
}
public abstract Date getLastMod();
public void setName(String name) {
this.name = name;
}
public PwIcon getIcon() {
return icon;
}
public abstract void setLastAccessTime(Date date);
public PwIconStandard getIconStandard() {
return icon;
}
public abstract void setLastModificationTime(Date date);
public void setIcon(PwIconStandard icon) {
this.icon = icon;
}
public boolean allowAddEntryIfIsRoot() {
return false;
}
public void touch(boolean modified, boolean touchParents) {
Date now = new Date();
PwDate now = new PwDate();
setLastAccessTime(now);
if (modified) {
@@ -299,7 +333,8 @@ public abstract class PwGroup extends PwNode {
if (object1.equals(object2))
return 0;
int groupCreationComp = object1.getCreationTime().compareTo(object2.getCreationTime());
int groupCreationComp = object1.getCreationTime().getDate()
.compareTo(object2.getCreationTime().getDate());
// If same creation, can be different
if (groupCreationComp == 0) {
return object1.hashCode() - object2.hashCode();

View File

@@ -1,15 +1,5 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
This file was derived from
Copyright 2007 Naomaru Itoi <nao@phoneid.org>
This file was derived from
Java clone of KeePass - A KeePass file viewer for Java
Copyright 2006 Bill Zwicky <billzwicky@users.sourceforge.net>
*
* This file is part of KeePass DX.
*
@@ -30,15 +20,6 @@ Copyright 2006 Bill Zwicky <billzwicky@users.sourceforge.net>
package com.keepassdroid.database;
import android.content.Intent;
import android.os.Bundle;
import com.keepassdroid.utils.Types;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author Brian Pellin <bpellin@gmail.com>
* @author Naomaru Itoi <nao@phoneid.org>
@@ -47,39 +28,43 @@ import java.util.List;
*/
public class PwGroupV3 extends PwGroup {
public String toString() {
return name;
}
public static final Date NEVER_EXPIRE = PwEntryV3.NEVER_EXPIRE;
/** Size of byte buffer needed to hold this struct. */
public static final int BUF_SIZE = 124;
// TODO Same as PwEntryV3
// for tree traversing
public PwGroupV3 parent = null;
private PwGroupV3 parent = null;
private int groupId;
public int groupId;
public PwDate tCreation;
public PwDate tLastMod;
public PwDate tLastAccess;
public PwDate tExpire;
public int level; // short
private int level = 0; // short
/** Used by KeePass internally, don't use */
public int flags;
public void setGroups(List<PwGroup> groups) {
childGroups = groups;
}
private int flags;
@Override
public PwGroup getParent() {
return parent;
}
@Override
public void setParent(PwGroup prt) {
parent = (PwGroupV3) prt;
level = parent.getLevel() + 1;
}
public int getGroupId() {
return groupId;
}
public void setGroupId(int groupId) {
this.groupId = groupId;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
public PwGroupId getId() {
return new PwGroupIdV3(groupId);
@@ -91,35 +76,6 @@ public class PwGroupV3 extends PwGroup {
groupId = id3.getId();
}
@Override
public String getName() {
return name;
}
@Override
public Date getLastMod() {
return tLastMod.getJDate();
}
@Override
public void setParent(PwGroup prt) {
parent = (PwGroupV3) prt;
level = parent.level + 1;
}
@Override
public void initNewGroup(String nm, PwGroupId newId) {
super.initNewGroup(nm, newId);
Date now = Calendar.getInstance().getTime();
tCreation = new PwDate(now);
tLastAccess = new PwDate(now);
tLastMod = new PwDate(now);
tExpire = new PwDate(PwGroupV3.NEVER_EXPIRE);
}
public void populateBlankFields(PwDatabaseV3 db) {
if (icon == null) {
icon = db.iconFactory.getIcon(1);
@@ -128,39 +84,18 @@ public class PwGroupV3 extends PwGroup {
if (name == null) {
name = "";
}
if (tCreation == null) {
tCreation = PwEntryV3.DEFAULT_PWDATE;
}
if (tLastMod == null) {
tLastMod = PwEntryV3.DEFAULT_PWDATE;
public int getFlags() {
return flags;
}
if (tLastAccess == null) {
tLastAccess = PwEntryV3.DEFAULT_PWDATE;
}
if (tExpire == null) {
tExpire = PwEntryV3.DEFAULT_PWDATE;
}
public void setFlags(int flags) {
this.flags = flags;
}
@Override
public void setLastAccessTime(Date date) {
tLastAccess = new PwDate(date);
}
@Override
public void setLastModificationTime(Date date) {
tLastMod = new PwDate(date);
}
@Override
public Date getCreationTime() {
if(tCreation != null)
return tCreation.getJDate();
else
return new Date();
public String toString() {
return getName();
}
}

View File

@@ -19,7 +19,6 @@
*/
package com.keepassdroid.database;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -27,7 +26,6 @@ import java.util.UUID;
public class PwGroupV4 extends PwGroup implements ITimeLogger {
//public static final int FOLDER_ICON = 48;
public static final boolean DEFAULT_SEARCHING_ENABLED = true;
public PwGroupV4 parent = null;
@@ -39,26 +37,19 @@ public class PwGroupV4 extends PwGroup implements ITimeLogger {
public Boolean enableAutoType = null;
public Boolean enableSearching = null;
public UUID lastTopVisibleEntry = PwDatabaseV4.UUID_ZERO;
private Date parentGroupLastMod = PwDatabaseV4.DEFAULT_NOW;
private Date creation = PwDatabaseV4.DEFAULT_NOW;
private Date lastMod = PwDatabaseV4.DEFAULT_NOW;
private Date lastAccess = PwDatabaseV4.DEFAULT_NOW;
private Date expireDate = PwDatabaseV4.DEFAULT_NOW;
private PwDate parentGroupLastMod = new PwDate();
private boolean expires = false;
private long usageCount = 0;
public Map<String, String> customData = new HashMap<String, String>();
public Map<String, String> customData = new HashMap<>();
public PwGroupV4() {}
public PwGroupV4(boolean createUUID, boolean setTimes, String name, PwIconStandard icon) {
public PwGroupV4(boolean createUUID, String name, PwIconStandard icon) {
if (createUUID) {
uuid = UUID.randomUUID();
}
if (setTimes) {
creation = lastMod = lastAccess = new Date();
}
this.name = name;
this.icon = icon;
}
@@ -67,7 +58,7 @@ public class PwGroupV4 extends PwGroup implements ITimeLogger {
public void initNewGroup(String nm, PwGroupId newId) {
super.initNewGroup(nm, newId);
lastAccess = lastMod = creation = parentGroupLastMod = new Date();
parentGroupLastMod = new PwDate();
}
public void AddGroup(PwGroupV4 subGroup, boolean takeOwnership) {
@@ -81,7 +72,7 @@ public class PwGroupV4 extends PwGroup implements ITimeLogger {
if ( takeOwnership ) subGroup.parent = this;
if ( updateLocationChanged ) subGroup.parentGroupLastMod = new Date(System.currentTimeMillis());
if ( updateLocationChanged ) subGroup.parentGroupLastMod = new PwDate(System.currentTimeMillis());
}
@@ -96,7 +87,7 @@ public class PwGroupV4 extends PwGroup implements ITimeLogger {
if ( takeOwnership ) pe.parent = this;
if ( updateLocationChanged ) pe.setLocationChanged(new Date(System.currentTimeMillis()));
if ( updateLocationChanged ) pe.setLocationChanged(new PwDate(System.currentTimeMillis()));
}
@Override
@@ -138,69 +129,31 @@ public class PwGroupV4 extends PwGroup implements ITimeLogger {
}
@Override
public String getName() {
return name;
public PwDate getLocationChanged() {
return parentGroupLastMod;
}
@Override
public Date getLastMod() {
return parentGroupLastMod;
}
public Date getCreationTime() {
return creation;
}
public Date getExpiryTime() {
return expireDate;
}
public Date getLastAccessTime() {
return lastAccess;
}
public Date getLastModificationTime() {
return lastMod;
}
public Date getLocationChanged() {
return parentGroupLastMod;
public void setLocationChanged(PwDate date) {
parentGroupLastMod = date;
}
@Override
public long getUsageCount() {
return usageCount;
}
public void setCreationTime(Date date) {
creation = date;
}
public void setExpiryTime(Date date) {
expireDate = date;
}
@Override
public void setLastAccessTime(Date date) {
lastAccess = date;
}
@Override
public void setLastModificationTime(Date date) {
lastMod = date;
}
public void setLocationChanged(Date date) {
parentGroupLastMod = date;
}
public void setUsageCount(long count) {
usageCount = count;
}
@Override
public boolean expires() {
return expires;
}
@Override
public void setExpires(boolean exp) {
expires = exp;
}

View File

@@ -7,8 +7,4 @@ public abstract class PwIcon implements Serializable {
public boolean isMetaStreamIcon() {
return false;
}
public void writeBytes() {
}
}

View File

@@ -23,11 +23,19 @@ package com.keepassdroid.database;
import java.io.Serializable;
import java.util.Date;
import static com.keepassdroid.database.PwDate.NEVER_EXPIRE;
import static com.keepassdroid.database.PwDate.PW_NEVER_EXPIRE;
/**
* Abstract class who manage Groups and Entries
*/
public abstract class PwNode implements Serializable {
private PwDate creation = new PwDate();
private PwDate lastMod = new PwDate();
private PwDate lastAccess = new PwDate();
private PwDate expireDate = new PwDate(NEVER_EXPIRE);
/**
* Type of available Nodes
*/
@@ -50,11 +58,6 @@ public abstract class PwNode implements Serializable {
*/
public abstract PwIcon getIcon();
/**
* @return Creation date and time of the node
*/
public abstract Date getCreationTime();
/**
* Retrieve the parent node
* @return PwGroup parent as group
@@ -85,4 +88,53 @@ public abstract class PwNode implements Serializable {
boolean isSameType(PwNode otherNode) {
return getType() != null ? getType().equals(otherNode.getType()) : otherNode.getType() == null;
}
public void assign(PwNode source) {
this.creation = source.creation;
this.lastMod = source.lastMod;
this.lastAccess = source.lastAccess;
this.expireDate = source.expireDate;
}
public PwDate getCreationTime() {
return creation;
}
public void setCreationTime(PwDate date) {
creation = date;
}
public PwDate getLastModificationTime() {
return lastMod;
}
public void setLastModificationTime(PwDate date) {
lastMod = date;
}
public PwDate getLastAccessTime() {
return lastAccess;
}
public void setLastAccessTime(PwDate date) {
lastAccess = date;
}
public PwDate getExpiryTime() {
return expireDate;
}
public void setExpiryTime(PwDate date) {
expireDate = date;
}
public void setExpires(boolean expires) {
if (!expires) {
expireDate = PW_NEVER_EXPIRE;
}
}
public boolean expires() {
return ! PwDate.IsSameDate(NEVER_EXPIRE, expireDate.getDate());
}
}

View File

@@ -164,8 +164,8 @@ public enum SortNodeEnum {
return -1;
}
}
int nodeCreationComp = object1.getCreationTime()
.compareTo(object2.getCreationTime());
int nodeCreationComp = object1.getCreationTime().getDate()
.compareTo(object2.getCreationTime().getDate());
// If same creation, can be different
if (nodeCreationComp == 0) {
return object1.hashCode() - object2.hashCode();

View File

@@ -56,7 +56,7 @@ public class AddGroup extends RunnableOnFinish {
// Generate new group
mGroup = pm.createGroup();
mGroup.initNewGroup(mName, pm.newGroupId());
mGroup.icon = mDb.pm.iconFactory.getIcon(mIconID);
mGroup.setIcon(mDb.pm.iconFactory.getIcon(mIconID));
pm.addGroupTo(mGroup, mParent);
// Commit to disk

View File

@@ -72,14 +72,14 @@ public class DeleteGroup extends RunnableOnFinish {
else {
// TODO tests
// Remove child entries
List<PwEntry> childEnt = new ArrayList<>(mGroup.childEntries);
List<PwEntry> childEnt = new ArrayList<>(mGroup.getChildEntries());
for ( int i = 0; i < childEnt.size(); i++ ) {
DeleteEntry task = new DeleteEntry(mContext, mDb, childEnt.get(i), null, true);
task.run();
}
// Remove child groups
List<PwGroup> childGrp = new ArrayList<>(mGroup.childGroups);
List<PwGroup> childGrp = new ArrayList<>(mGroup.getChildGroups());
for ( int i = 0; i < childGrp.size(); i++ ) {
DeleteGroup task = new DeleteGroup(mContext, mDb, childGrp.get(i), null, true);
task.run();

View File

@@ -340,31 +340,31 @@ public class ImporterV3 extends Importer {
// Ignore field
break;
case 0x0001 :
grp.groupId = LEDataInputStream.readInt(buf, offset);
grp.setGroupId(LEDataInputStream.readInt(buf, offset));
break;
case 0x0002 :
grp.name = Types.readCString(buf, offset);
grp.setName(Types.readCString(buf, offset));
break;
case 0x0003 :
grp.tCreation = new PwDate(buf, offset);
grp.setCreationTime(new PwDate(buf, offset));
break;
case 0x0004 :
grp.tLastMod = new PwDate(buf, offset);
grp.setLastModificationTime(new PwDate(buf, offset));
break;
case 0x0005 :
grp.tLastAccess = new PwDate(buf, offset);
grp.setLastAccessTime(new PwDate(buf, offset));
break;
case 0x0006 :
grp.tExpire = new PwDate(buf, offset);
grp.setExpiryTime(new PwDate(buf, offset));
break;
case 0x0007 :
grp.icon = db.iconFactory.getIcon(LEDataInputStream.readInt(buf, offset));
grp.setIcon(db.iconFactory.getIcon(LEDataInputStream.readInt(buf, offset)));
break;
case 0x0008 :
grp.level = LEDataInputStream.readUShort(buf, offset);
grp.setLevel(LEDataInputStream.readUShort(buf, offset));
break;
case 0x0009 :
grp.flags = LEDataInputStream.readInt(buf, offset);
grp.setFlags(LEDataInputStream.readInt(buf, offset));
break;
}
}
@@ -387,7 +387,7 @@ public class ImporterV3 extends Importer {
ent.setUUID(Types.bytestoUUID(buf, offset));
break;
case 0x0002 :
ent.groupId = LEDataInputStream.readInt(buf, offset);
ent.setGroupId(LEDataInputStream.readInt(buf, offset));
break;
case 0x0003 :
int iconId = LEDataInputStream.readInt(buf, offset);
@@ -400,34 +400,34 @@ public class ImporterV3 extends Importer {
ent.icon = db.iconFactory.getIcon(iconId);
break;
case 0x0004 :
ent.title = Types.readCString(buf, offset);
ent.setTitle(Types.readCString(buf, offset));
break;
case 0x0005 :
ent.url = Types.readCString(buf, offset);
ent.setUrl(Types.readCString(buf, offset));
break;
case 0x0006 :
ent.username = Types.readCString(buf, offset);
ent.setUsername(Types.readCString(buf, offset));
break;
case 0x0007 :
ent.setPassword(buf, offset, Types.strlen(buf, offset));
break;
case 0x0008 :
ent.additional = Types.readCString(buf, offset);
ent.setNotes(Types.readCString(buf, offset));
break;
case 0x0009 :
ent.tCreation = new PwDate(buf, offset);
ent.setCreationTime(new PwDate(buf, offset));
break;
case 0x000A :
ent.tLastMod = new PwDate(buf, offset);
ent.setLastModificationTime(new PwDate(buf, offset));
break;
case 0x000B :
ent.tLastAccess = new PwDate(buf, offset);
ent.setLastAccessTime(new PwDate(buf, offset));
break;
case 0x000C :
ent.tExpire = new PwDate(buf, offset);
ent.setExpiryTime(new PwDate(buf, offset));
break;
case 0x000D :
ent.binaryDesc = Types.readCString(buf, offset);
ent.setBinaryDesc(Types.readCString(buf, offset));
break;
case 0x000E :
ent.setBinaryData(buf, offset, fieldSize);

View File

@@ -46,6 +46,7 @@ import org.xmlpull.v1.XmlPullParserFactory;
import biz.source_code.base64Coder.Base64Coder;
import com.keepassdroid.database.PwDate;
import com.keepassdroid.tasks.UpdateStatus;
import com.keepassdroid.crypto.CipherFactory;
import com.keepassdroid.crypto.PwStreamCipherFactory;
@@ -559,11 +560,11 @@ public class ImporterV4 extends Importer {
if ( name.equalsIgnoreCase(ElemUuid) ) {
ctxGroup.uuid = ReadUuid(xpp);
} else if ( name.equalsIgnoreCase(ElemName) ) {
ctxGroup.name = ReadString(xpp);
ctxGroup.setName(ReadString(xpp));
} else if ( name.equalsIgnoreCase(ElemNotes) ) {
ctxGroup.notes = ReadString(xpp);
} else if ( name.equalsIgnoreCase(ElemIcon) ) {
ctxGroup.icon = db.iconFactory.getIcon((int)ReadUInt(xpp, 0));
ctxGroup.setIcon(db.iconFactory.getIcon((int)ReadUInt(xpp, 0)));
} else if ( name.equalsIgnoreCase(ElemCustomIconID) ) {
ctxGroup.customIcon = db.iconFactory.getIcon(ReadUuid(xpp));
} else if ( name.equalsIgnoreCase(ElemTimes) ) {
@@ -679,19 +680,19 @@ public class ImporterV4 extends Importer {
}
if ( name.equalsIgnoreCase(ElemLastModTime) ) {
tl.setLastModificationTime(ReadTime(xpp));
tl.setLastModificationTime(ReadPwTime(xpp));
} else if ( name.equalsIgnoreCase(ElemCreationTime) ) {
tl.setCreationTime(ReadTime(xpp));
tl.setCreationTime(ReadPwTime(xpp));
} else if ( name.equalsIgnoreCase(ElemLastAccessTime) ) {
tl.setLastAccessTime(ReadTime(xpp));
tl.setLastAccessTime(ReadPwTime(xpp));
} else if ( name.equalsIgnoreCase(ElemExpiryTime) ) {
tl.setExpiryTime(ReadTime(xpp));
tl.setExpiryTime(ReadPwTime(xpp));
} else if ( name.equalsIgnoreCase(ElemExpires) ) {
tl.setExpires(ReadBool(xpp, false));
} else if ( name.equalsIgnoreCase(ElemUsageCount) ) {
tl.setUsageCount(ReadULong(xpp, 0));
} else if ( name.equalsIgnoreCase(ElemLocationChanged) ) {
tl.setLocationChanged(ReadTime(xpp));
tl.setLocationChanged(ReadPwTime(xpp));
} else {
ReadUnknown(xpp);
}
@@ -849,8 +850,8 @@ public class ImporterV4 extends Importer {
return KdbContext.GroupCustomData;
} else if ( ctx == KdbContext.Entry && name.equalsIgnoreCase(ElemEntry) ) {
if ( ctxEntry.uuid == null || ctxEntry.uuid.equals(PwDatabaseV4.UUID_ZERO) ) {
ctxEntry.uuid = UUID.randomUUID();
if ( ctxEntry.getUUID() == null || ctxEntry.getUUID().equals(PwDatabaseV4.UUID_ZERO) ) {
ctxEntry.setUUID(UUID.randomUUID());
}
if ( entryInHistory ) {
@@ -913,6 +914,10 @@ public class ImporterV4 extends Importer {
}
}
private PwDate ReadPwTime(XmlPullParser xpp) throws IOException, XmlPullParserException {
return new PwDate(ReadTime(xpp));
}
private Date ReadTime(XmlPullParser xpp) throws IOException, XmlPullParserException {
String sDate = ReadString(xpp);
Date utcDate = null;

View File

@@ -261,7 +261,7 @@ public class PwDbV3Output extends PwDbOutput {
// Recurse over children
for ( int i = 0; i < group.numbersOfChildGroups(); i++ ) {
sortGroup((PwGroupV3) group.childGroups.get(i), groupList);
sortGroup((PwGroupV3) group.getChildGroupAt(i), groupList);
}
}

View File

@@ -435,9 +435,9 @@ public class PwDbV4Output extends PwDbOutput {
private void startGroup(PwGroupV4 group) throws IllegalArgumentException, IllegalStateException, IOException {
xml.startTag(null, ElemGroup);
writeObject(ElemUuid, group.uuid);
writeObject(ElemName, group.name);
writeObject(ElemName, group.getName());
writeObject(ElemNotes, group.notes);
writeObject(ElemIcon, group.icon.iconId);
writeObject(ElemIcon, group.getIconStandard().iconId);
if (!group.customIcon.equals(PwIconCustom.ZERO)) {
writeObject(ElemCustomIconID, group.customIcon.uuid);
@@ -461,7 +461,7 @@ public class PwDbV4Output extends PwDbOutput {
xml.startTag(null, ElemEntry);
writeObject(ElemUuid, entry.uuid);
writeObject(ElemUuid, entry.getUUID());
writeObject(ElemIcon, entry.icon.iconId);
if (!entry.customIcon.equals(PwIconCustom.ZERO)) {
@@ -755,13 +755,13 @@ public class PwDbV4Output extends PwDbOutput {
xml.startTag(null, name);
writeObject(ElemLastModTime, it.getLastModificationTime());
writeObject(ElemCreationTime, it.getCreationTime());
writeObject(ElemLastAccessTime, it.getLastAccessTime());
writeObject(ElemExpiryTime, it.getExpiryTime());
writeObject(ElemLastModTime, it.getLastModificationTime().getDate());
writeObject(ElemCreationTime, it.getCreationTime().getDate());
writeObject(ElemLastAccessTime, it.getLastAccessTime().getDate());
writeObject(ElemExpiryTime, it.getExpiryTime().getDate());
writeObject(ElemExpires, it.expires());
writeObject(ElemUsageCount, it.getUsageCount());
writeObject(ElemLocationChanged, it.getLocationChanged());
writeObject(ElemLocationChanged, it.getLocationChanged().getDate());
xml.endTag(null, name);
}

View File

@@ -79,7 +79,7 @@ public class PwEntryOutputV3 {
// Group ID
mOS.write(GROUPID_FIELD_TYPE);
mOS.write(LONG_FOUR);
mOS.write(LEDataOutputStream.writeIntBuf(mPE.groupId));
mOS.write(LEDataOutputStream.writeIntBuf(mPE.getGroupId()));
// Image ID
mOS.write(IMAGEID_FIELD_TYPE);
@@ -89,17 +89,17 @@ public class PwEntryOutputV3 {
// Title
//byte[] title = mPE.title.getBytes("UTF-8");
mOS.write(TITLE_FIELD_TYPE);
int titleLen = Types.writeCString(mPE.title, mOS);
int titleLen = Types.writeCString(mPE.getTitle(), mOS);
outputBytes += titleLen;
// URL
mOS.write(URL_FIELD_TYPE);
int urlLen = Types.writeCString(mPE.url, mOS);
int urlLen = Types.writeCString(mPE.getUrl(), mOS);
outputBytes += urlLen;
// Username
mOS.write(USERNAME_FIELD_TYPE);
int userLen = Types.writeCString(mPE.username, mOS);
int userLen = Types.writeCString(mPE.getUsername(), mOS);
outputBytes += userLen;
// Password
@@ -112,24 +112,24 @@ public class PwEntryOutputV3 {
// Additional
mOS.write(ADDITIONAL_FIELD_TYPE);
int addlLen = Types.writeCString(mPE.additional, mOS);
int addlLen = Types.writeCString(mPE.getNotes(), mOS);
outputBytes += addlLen;
// Create date
writeDate(CREATE_FIELD_TYPE, mPE.tCreation.getCDate());
writeDate(CREATE_FIELD_TYPE, mPE.getCreationTime().getCDate());
// Modification date
writeDate(MOD_FIELD_TYPE, mPE.tLastMod.getCDate());
writeDate(MOD_FIELD_TYPE, mPE.getLastModificationTime().getCDate());
// Access date
writeDate(ACCESS_FIELD_TYPE, mPE.tLastAccess.getCDate());
writeDate(ACCESS_FIELD_TYPE, mPE.getLastAccessTime().getCDate());
// Expiration date
writeDate(EXPIRE_FIELD_TYPE, mPE.tExpire.getCDate());
writeDate(EXPIRE_FIELD_TYPE, mPE.getExpiryTime().getCDate());
// Binary desc
mOS.write(BINARY_DESC_FIELD_TYPE);
int descLen = Types.writeCString(mPE.binaryDesc, mOS);
int descLen = Types.writeCString(mPE.getBinaryDesc(), mOS);
outputBytes += descLen;
// Binary data

View File

@@ -65,46 +65,46 @@ public class PwGroupOutputV3 {
// Group ID
mOS.write(GROUPID_FIELD_TYPE);
mOS.write(GROUPID_FIELD_SIZE);
mOS.write(LEDataOutputStream.writeIntBuf(mPG.groupId));
mOS.write(LEDataOutputStream.writeIntBuf(mPG.getGroupId()));
// Name
mOS.write(NAME_FIELD_TYPE);
Types.writeCString(mPG.name, mOS);
Types.writeCString(mPG.getName(), mOS);
// Create date
mOS.write(CREATE_FIELD_TYPE);
mOS.write(DATE_FIELD_SIZE);
mOS.write(mPG.tCreation.getCDate());
mOS.write(mPG.getCreationTime().getCDate());
// Modification date
mOS.write(MOD_FIELD_TYPE);
mOS.write(DATE_FIELD_SIZE);
mOS.write(mPG.tLastMod.getCDate());
mOS.write(mPG.getLastModificationTime().getCDate());
// Access date
mOS.write(ACCESS_FIELD_TYPE);
mOS.write(DATE_FIELD_SIZE);
mOS.write(mPG.tLastAccess.getCDate());
mOS.write(mPG.getLastAccessTime().getCDate());
// Expiration date
mOS.write(EXPIRE_FIELD_TYPE);
mOS.write(DATE_FIELD_SIZE);
mOS.write(mPG.tExpire.getCDate());
mOS.write(mPG.getExpiryTime().getCDate());
// Image ID
mOS.write(IMAGEID_FIELD_TYPE);
mOS.write(IMAGEID_FIELD_SIZE);
mOS.write(LEDataOutputStream.writeIntBuf(mPG.icon.iconId));
mOS.write(LEDataOutputStream.writeIntBuf(mPG.getIconStandard().iconId));
// Level
mOS.write(LEVEL_FIELD_TYPE);
mOS.write(LEVEL_FIELD_SIZE);
mOS.write(LEDataOutputStream.writeUShortBuf(mPG.level));
mOS.write(LEDataOutputStream.writeUShortBuf(mPG.getLevel()));
// Flags
mOS.write(FLAGS_FIELD_TYPE);
mOS.write(FLAGS_FIELD_SIZE);
mOS.write(LEDataOutputStream.writeIntBuf(mPG.flags));
mOS.write(LEDataOutputStream.writeIntBuf(mPG.getFlags()));
// End
mOS.write(END_FIELD_TYPE);

View File

@@ -66,8 +66,8 @@ public class SearchDbHelper {
Log.d("SearchDbHelper", "Tried to search with unknown db");
return null;
}
group.name = mCtx.getString(R.string.search_results);
group.childEntries = new ArrayList<PwEntry>();
group.setName(mCtx.getString(R.string.search_results));
group.setEntries(new ArrayList<>());
// Search all entries
Locale loc = Locale.getDefault();
@@ -83,11 +83,11 @@ public class SearchDbHelper {
PwGroup top = worklist.remove();
if (pm.isGroupSearchable(top, isOmitBackup)) {
for (PwEntry entry : top.childEntries) {
processEntries(entry, group.childEntries, qStr, loc);
for (PwEntry entry : top.getChildEntries()) {
processEntries(entry, group.getChildEntries(), qStr, loc);
}
for (PwGroup childGroup : top.childGroups) {
for (PwGroup childGroup : top.getChildGroups()) {
if (childGroup != null) {
worklist.add(childGroup);
}

View File

@@ -22,7 +22,8 @@ package com.keepassdroid.utils;
import android.net.Uri;
import com.keepassdroid.database.PwDate;
import com.keepassdroid.database.PwEntryV3;
import static com.keepassdroid.database.PwDate.DEFAULT_PWDATE;
public class EmptyUtils {
public static boolean isNullOrEmpty(String str) {
@@ -34,7 +35,7 @@ public class EmptyUtils {
}
public static boolean isNullOrEmpty(PwDate date) {
return (date == null) || date.equals(PwEntryV3.DEFAULT_PWDATE);
return (date == null) || date.equals(DEFAULT_PWDATE);
}
public static boolean isNullOrEmpty(Uri uri) {

View File

@@ -1,44 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.utils;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwEntry;
public class SprEngine {
private static SprEngineV4 sprV4 = new SprEngineV4();
private static SprEngine spr = new SprEngine();
public static SprEngine getInstance(PwDatabase db) {
if (db instanceof PwDatabaseV4) {
return sprV4;
}
else {
return spr;
}
}
public String compile(String text, PwEntry entry, PwDatabase database) {
return text;
}
}

View File

@@ -30,7 +30,7 @@ import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.SearchParametersV4;
public class SprEngineV4 extends SprEngine {
public class SprEngineV4 {
private final int MAX_RECURSION_DEPTH = 12;
private final String STR_REF_START = "{REF:";
private final String STR_REF_END = "}";
@@ -45,7 +45,6 @@ public class SprEngineV4 extends SprEngine {
}
}
@Override
public String compile(String text, PwEntry entry, PwDatabase database) {
SprContextV4 ctx = new SprContextV4((PwDatabaseV4)database, (PwEntryV4)entry);