Fix: Support camelCase keyPassword in JSON host import
Summary
Fixed the bulk import endpoint to properly accept keyPassword (camelCase) field from JSON imports, resolving authentication failures with encrypted SSH private keys.
Problem
When importing SSH host configurations from JSON with encrypted private keys, the keyPassword field was not being saved to the database. This caused the error:
Authentication failed: Failed to connect to host: Cannot parse privateKey:
Encrypted private OpenSSH key detected, but no passphrase given
The issue occurred because:
The sample JSON export and UI use keyPassword (camelCase)
The bulk import endpoint was only looking for key_password (snake_case)
This mismatch caused the password to be set as null in the database
Solution
Updated the bulk import endpoint (/ssh/bulk-import) in src/backend/database/routes/ssh.ts to accept keyPassword in camelCase format, which is consistent with:
The JSON export format
The sample JSON download
The rest of the application's camelCase naming convention
✅ Maintains consistency with camelCase naming convention
✅ Aligns with sample JSON format and export functionality
✅ No breaking changes - only affects JSON import functionality
Related Issues
Resolves authentication failures when importing hosts with encrypted SSH keys
Fixes inconsistency between export and import formats
Checklist
Code follows camelCase naming convention
Fix tested with encrypted SSH keys
No breaking changes to existing functionality
Consistent with existing export format
# Fix: Support camelCase `keyPassword` in JSON host import
## Summary
Fixed the bulk import endpoint to properly accept `keyPassword` (camelCase) field from JSON imports, resolving authentication failures with encrypted SSH private keys.
## Problem
When importing SSH host configurations from JSON with encrypted private keys, the `keyPassword` field was not being saved to the database. This caused the error:
```
Authentication failed: Failed to connect to host: Cannot parse privateKey:
Encrypted private OpenSSH key detected, but no passphrase given
```
The issue occurred because:
- The sample JSON export and UI use `keyPassword` (camelCase)
- The bulk import endpoint was only looking for `key_password` (snake_case)
- This mismatch caused the password to be set as `null` in the database
## Solution
Updated the bulk import endpoint (`/ssh/bulk-import`) in `src/backend/database/routes/ssh.ts` to accept `keyPassword` in camelCase format, which is consistent with:
- The JSON export format
- The sample JSON download
- The rest of the application's camelCase naming convention
### Changes Made
**File**: `src/backend/database/routes/ssh.ts` (Line ~1415)
**Before**:
```typescript
key_password:
hostData.authType === "key" ? hostData.key_password : null,
```
**After**:
```typescript
key_password:
hostData.authType === "key" ? hostData.keyPassword : null,
```
## Testing
The fix ensures that JSON imports with the following structure work correctly:
```json
{
"hosts": [
{
"name": "pve-m920q",
"ip": "10.10.0.253",
"port": 22,
"username": "root",
"authType": "key",
"key": "-----BEGIN OPENSSH PRIVATE KEY-----...",
"keyPassword": "12345678",
"keyType": "ssh-ed25519",
"folder": "Proxmox Hosts",
"tags": ["home", "proxmox", "pve"],
"pin": true,
"enableTerminal": true,
"enableTunnel": false,
"enableFileManager": true,
"defaultPath": "~"
}
]
}
```
## Impact
- ✅ Fixes encrypted SSH key imports
- ✅ Maintains consistency with camelCase naming convention
- ✅ Aligns with sample JSON format and export functionality
- ✅ No breaking changes - only affects JSON import functionality
## Related Issues
- Resolves authentication failures when importing hosts with encrypted SSH keys
- Fixes inconsistency between export and import formats
## Checklist
- [x] Code follows camelCase naming convention
- [x] Fix tested with encrypted SSH keys
- [x] No breaking changes to existing functionality
- [x] Consistent with existing export format
Hello @thorved, I'm Gemini Code Assist1 ! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This PR addresses a bug in the SSH host bulk import functionality where encrypted private key passwords (keyPassword) were not being correctly recognized from JSON input due to a camelCase vs. snake_case mismatch. The fix updates the ssh.ts route to correctly parse the keyPassword field, resolving authentication failures and ensuring consistency with the application's naming conventions and JSON export format.
Highlights
Intent: This pull request fixes an issue where the keyPassword field was not correctly processed during JSON host imports, leading to authentication failures for SSH hosts with encrypted private keys. The intent is to align the bulk import endpoint with the camelCase naming convention used elsewhere in the application and in JSON exports.
Changes: The primary change is in src/backend/database/routes/ssh.ts. Specifically, the logic for assigning the key_password field during bulk import was updated. It now directly uses hostData.keyPassword (camelCase) instead of hostData.key_password (snake_case) when authType is 'key'. This ensures that the password for encrypted SSH keys is correctly saved from JSON imports.
Reviewer Activity: No specific reviewer activity has been recorded or is available in the provided context.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.
Feature
Command
Description
Code Review
/gemini review
Performs a code review for the current pull request in its current state.
Pull Request Summary
/gemini summary
Provides a summary of the current pull request in its current state.
Comment
@gemini-code-assist
Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help
/gemini help
Displays a list of available commands.
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
## Summary of Changes
Hello @thorved, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This PR addresses a bug in the SSH host bulk import functionality where encrypted private key passwords (`keyPassword`) were not being correctly recognized from JSON input due to a camelCase vs. snake_case mismatch. The fix updates the `ssh.ts` route to correctly parse the `keyPassword` field, resolving authentication failures and ensuring consistency with the application's naming conventions and JSON export format.
### Highlights
* **Intent**: This pull request fixes an issue where the `keyPassword` field was not correctly processed during JSON host imports, leading to authentication failures for SSH hosts with encrypted private keys. The intent is to align the bulk import endpoint with the camelCase naming convention used elsewhere in the application and in JSON exports.
* **Changes**: The primary change is in `src/backend/database/routes/ssh.ts`. Specifically, the logic for assigning the `key_password` field during bulk import was updated. It now directly uses `hostData.keyPassword` (camelCase) instead of `hostData.key_password` (snake_case) when `authType` is 'key'. This ensures that the password for encrypted SSH keys is correctly saved from JSON imports.
* **Reviewer Activity**: No specific reviewer activity has been recorded or is available in the provided context.
<details>
<summary><b>Using Gemini Code Assist</b></summary>
<br>
The full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.
<b>Invoking Gemini</b>
You can request assistance from Gemini at any point by creating a comment using either `/gemini <command>` or `@gemini-code-assist <command>`. Below is a summary of the supported commands on the current page.
Feature | Command | Description
--- | --- | ---
Code Review | `/gemini review` | Performs a code review for the current pull request in its current state.
Pull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help | `/gemini help` | Displays a list of available commands.
<b>Customization</b>
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).
<b>Limitations & Feedback</b>
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up [here](https://google.qualtrics.com/jfe/form/SV_2cyuGuTWsEw84yG).
<b>You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).</b>
</details>
[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).
gemini-code-assist[bot]
(Migrated from github.com)
reviewed 2025-10-08 21:36:07 +11:00
gemini-code-assist[bot]
(Migrated from github.com)
left a comment
Copy Link
Copy Source
Code Review
Thank you for this contribution. The fix correctly addresses the issue with keyPassword in bulk imports. I've added one suggestion to improve backward compatibility and make the API more robust. Please take a look.
## Code Review
Thank you for this contribution. The fix correctly addresses the issue with `keyPassword` in bulk imports. I've added one suggestion to improve backward compatibility and make the API more robust. Please take a look.
While this change correctly adds support for keyPassword, it removes the existing support for key_password. This could be a breaking change for any clients that might be using the snake_case version.
To ensure backward compatibility and make the API more robust, it would be better to support both formats. You can achieve this by checking for keyPassword first and then falling back to key_password if the former is not present. This approach is also used elsewhere in the codebase (e.g., in resolveHostCredentials).

While this change correctly adds support for `keyPassword`, it removes the existing support for `key_password`. This could be a breaking change for any clients that might be using the snake_case version.
To ensure backward compatibility and make the API more robust, it would be better to support both formats. You can achieve this by checking for `keyPassword` first and then falling back to `key_password` if the former is not present. This approach is also used elsewhere in the codebase (e.g., in `resolveHostCredentials`).
```suggestion
hostData.authType === "key" ? (hostData.keyPassword || hostData.key_password || null) : null,
```
thorved
(Migrated from github.com)
reviewed 2025-10-08 21:38:47 +11:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fix: Support camelCase
keyPasswordin JSON host importSummary
Fixed the bulk import endpoint to properly accept
keyPassword(camelCase) field from JSON imports, resolving authentication failures with encrypted SSH private keys.Problem
When importing SSH host configurations from JSON with encrypted private keys, the
keyPasswordfield was not being saved to the database. This caused the error:The issue occurred because:
keyPassword(camelCase)key_password(snake_case)nullin the databaseSolution
Updated the bulk import endpoint (
/ssh/bulk-import) insrc/backend/database/routes/ssh.tsto acceptkeyPasswordin camelCase format, which is consistent with:Changes Made
File:
src/backend/database/routes/ssh.ts(Line ~1415)Before:
After:
Testing
The fix ensures that JSON imports with the following structure work correctly:
Impact
Related Issues
Checklist
Summary of Changes
Hello @thorved, I'm Gemini Code Assist1 ! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This PR addresses a bug in the SSH host bulk import functionality where encrypted private key passwords (
keyPassword) were not being correctly recognized from JSON input due to a camelCase vs. snake_case mismatch. The fix updates thessh.tsroute to correctly parse thekeyPasswordfield, resolving authentication failures and ensuring consistency with the application's naming conventions and JSON export format.Highlights
keyPasswordfield was not correctly processed during JSON host imports, leading to authentication failures for SSH hosts with encrypted private keys. The intent is to align the bulk import endpoint with the camelCase naming convention used elsewhere in the application and in JSON exports.src/backend/database/routes/ssh.ts. Specifically, the logic for assigning thekey_passwordfield during bulk import was updated. It now directly useshostData.keyPassword(camelCase) instead ofhostData.key_password(snake_case) whenauthTypeis 'key'. This ensures that the password for encrypted SSH keys is correctly saved from JSON imports.Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point by creating a comment using either
/gemini <command>or@gemini-code-assist <command>. Below is a summary of the supported commands on the current page./gemini review/gemini summary/gemini helpCustomization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a
.gemini/folder in the base of the repository. Detailed instructions can be found here.Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩︎
Code Review
Thank you for this contribution. The fix correctly addresses the issue with
keyPasswordin bulk imports. I've added one suggestion to improve backward compatibility and make the API more robust. Please take a look.@@ -1414,3 +1414,3 @@key_password:hostData.authType === "key" ? hostData.key_password : null,hostData.authType === "key" ? hostData.keyPassword : null,keyType:While this change correctly adds support for
keyPassword, it removes the existing support forkey_password. This could be a breaking change for any clients that might be using the snake_case version.To ensure backward compatibility and make the API more robust, it would be better to support both formats. You can achieve this by checking for
keyPasswordfirst and then falling back tokey_passwordif the former is not present. This approach is also used elsewhere in the codebase (e.g., inresolveHostCredentials).@@ -1414,3 +1414,3 @@key_password:hostData.authType === "key" ? hostData.key_password : null,hostData.authType === "key" ? hostData.keyPassword : null,keyType:Before:
After:
The fix ensures that JSON imports with the following structure work correctly: