Skip to content

Commit 56d7be5

Browse files
committed
Implement generate-password request uses KeePassXC's password generator popup
(KeePassXC 2.7.0+)
1 parent 1fa01c6 commit 56d7be5

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

src/main/java/org/purejava/KeepassProxyAccess.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.IOException;
1616
import java.io.ObjectInputStream;
1717
import java.io.ObjectOutputStream;
18+
import java.lang.module.ModuleDescriptor.Version;
1819
import java.nio.file.Files;
1920
import java.nio.file.Path;
2021
import java.nio.file.StandardCopyOption;
@@ -36,6 +37,8 @@ public class KeepassProxyAccess implements PropertyChangeListener {
3637
private final AtomicReference<ScheduledFuture<?>> scheduledSaveCmd = new AtomicReference<>();
3738
private final ScheduledExecutorService scheduler;
3839

40+
private final String V2_7_0 = "2.7.0";
41+
3942
public KeepassProxyAccess() {
4043
if (SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC_OSX) {
4144
connection = new LinuxMacConnection();
@@ -322,8 +325,12 @@ public JSONObject getDatabaseGroups() {
322325
*/
323326
public String generatePassword() {
324327
try {
325-
var response = connection.generatePassword().getJSONArray("entries");
326-
return response.getJSONObject(0).getString("password");
328+
var response = connection.generatePassword();
329+
if (isMinimiumVersion(response.getString("version"), V2_7_0)) {
330+
return response.getString("password");
331+
} else {
332+
return response.getJSONArray("entries").getJSONObject(0).getString("password");
333+
}
327334
} catch (IOException | IllegalStateException | KeepassProxyAccessException | JSONException e) {
328335
log.info(e.toString(), e.getCause());
329336
return "";
@@ -458,6 +465,17 @@ private void traverse(List<Object> children, Map<String, String> groups) {
458465
});
459466
}
460467

468+
/**
469+
* Compare two software version strings to check for a minimum software version.
470+
*
471+
* @param v1 The first version string.
472+
* @param v2 The second version string.
473+
* @return True in case v1 >= v2, false otherwise.
474+
*/
475+
private boolean isMinimiumVersion(String v1, String v2) {
476+
return Version.parse(v1).compareTo(Version.parse(v2)) >= 0;
477+
}
478+
461479
@Override
462480
public void propertyChange(PropertyChangeEvent event) {
463481
scheduleSave((Optional<Credentials>) event.getNewValue());

src/test/java/org/purejava/UnlockedDatabaseTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void shouldHaveNoErrors() throws InterruptedException {
4242
assertTrue(kpa.getLogins("https://github.com", null, false, l).toString().contains("uuid=2aafee1a89fd435c8bad7df12bbaaa3e"));
4343
assertTrue(kpa.setLogin("https://github.com", "https://github.com", null, "User", "Passsword", "Group", null, null));
4444
assertTrue(kpa.databaseGroupsToMap(kpa.getDatabaseGroups()).toString().contains("KeePassXC-Browser Passwords"));
45-
assertTrue(null != kpa.generatePassword() && !kpa.generatePassword().isEmpty());
45+
assertFalse(kpa.generatePassword().isEmpty());
4646
log.info("Please allow to create new group");
4747
assertEquals(kpa.createNewGroup("Testgroup").get("name"), "Testgroup");
4848
assertTrue(null != kpa.getTotp("2aafee1a89fd435c8bad7df12bbaaa3e") && !kpa.getTotp("2aafee1a89fd435c8bad7df12bbaaa3e").isEmpty());

0 commit comments

Comments
 (0)