@@ -58,20 +58,22 @@ public DefaultKeyManager(NsecBunkerAdminClient adminClient, ObjectMapper objectM
5858 @ Override
5959 public CompletableFuture <BunkerKey > createKey (String name , String nsec , String passphrase ) {
6060 validateName (name );
61- requirePassphrase (passphrase );
6261 if (nsec == null || nsec .isBlank ()) {
6362 throw new IllegalArgumentException ("nsec must not be null or blank" );
6463 }
6564
66- return sendForKey (METHOD_CREATE_NEW_KEY , List .of (name , passphrase , nsec ), name );
65+ // Empty passphrase is allowed - nsecbunkerd will store the key unencrypted
66+ String normalizedPassphrase = normalizePassphrase (passphrase );
67+ return sendForKey (METHOD_CREATE_NEW_KEY , List .of (name , normalizedPassphrase , nsec ), name );
6768 }
6869
6970 @ Override
7071 public CompletableFuture <BunkerKey > createKey (String name , String passphrase ) {
7172 validateName (name );
72- requirePassphrase (passphrase );
7373
74- return sendForKey (METHOD_CREATE_NEW_KEY , List .of (name , passphrase ), name );
74+ // Empty passphrase is allowed - nsecbunkerd will store the key unencrypted
75+ String normalizedPassphrase = normalizePassphrase (passphrase );
76+ return sendForKey (METHOD_CREATE_NEW_KEY , List .of (name , normalizedPassphrase ), name );
7577 }
7678
7779 @ Override
@@ -83,9 +85,10 @@ public CompletableFuture<List<BunkerKey>> listKeys() {
8385 @ Override
8486 public CompletableFuture <Boolean > unlockKey (String name , String passphrase ) {
8587 validateName (name );
86- requirePassphrase (passphrase );
8788
88- return sendForResult (METHOD_UNLOCK_KEY , List .of (name , passphrase ), "unlock key " + name )
89+ // Empty passphrase is allowed - for keys stored without encryption
90+ String normalizedPassphrase = normalizePassphrase (passphrase );
91+ return sendForResult (METHOD_UNLOCK_KEY , List .of (name , normalizedPassphrase ), "unlock key " + name )
8992 .thenApply (ignored -> Boolean .TRUE );
9093 }
9194
@@ -108,9 +111,9 @@ public CompletableFuture<BunkerKey> getKeyDetails(String name) {
108111 public CompletableFuture <BunkerKey > rotateKey (String oldName , String newName , String passphrase ) {
109112 validateName (oldName );
110113 validateName (newName );
111- requirePassphrase (passphrase );
112114
113- return sendForKey (METHOD_ROTATE_KEY , List .of (oldName , newName , passphrase ), newName );
115+ String normalizedPassphrase = normalizePassphrase (passphrase );
116+ return sendForKey (METHOD_ROTATE_KEY , List .of (oldName , newName , normalizedPassphrase ), newName );
114117 }
115118
116119 private CompletableFuture <String > sendForResult (String method , List <String > params , String description ) {
@@ -185,9 +188,14 @@ private void validateName(String name) {
185188 }
186189 }
187190
188- private void requirePassphrase (String passphrase ) {
189- if (passphrase == null || passphrase .isBlank ()) {
190- throw new IllegalArgumentException ("Passphrase must not be null or blank" );
191- }
191+ /**
192+ * Normalizes a passphrase to an empty string if null or blank.
193+ * This allows creating/unlocking keys without encryption.
194+ *
195+ * @param passphrase the passphrase to normalize
196+ * @return the passphrase or empty string if null/blank
197+ */
198+ private String normalizePassphrase (String passphrase ) {
199+ return passphrase != null && !passphrase .isBlank () ? passphrase : "" ;
192200 }
193201}
0 commit comments