> For the complete documentation index, see [llms.txt](https://learn.capstorm.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.capstorm.com/frequently-asked-questions/usage/where-does-copystorm-store-passwords/how-to-add-a-new-database-password-manager.md).

# How to Add a New Database Password Manager

CopyStorm supports reading Database credentials from a user-supplied Database password manager.

This feature was introduced to eliminate the need to:

* Change the saved password in many CopyStorm configuration files.
* Provide the password to CopyStorm on the command line due to security rules.

In addition to security benefits, this feature allows you to use your own company-wide password manager.

## Feature Overview

The process to add a new Database password manager to CopyStorm is to:

1. Write a Java class that extends the class com.aslan.sfdc.connect.credentials.AbstractJDBCUserPasswordCredentials
2. Package the new Java class in a jar and place it in the “lib” subdirectory of the CopyStorm installation.
3. Add a new CredentialsRegistry.xml file to CopyStorm’s config directory to register thenew credential manager with CopyStorm.

## Writing the Java Class

The Java class needs to extend com.aslan.sfdc.connect.credentials.AbstractJDBCUserPasswordCredentials, and will need to override/implement the following methods:

| Method Signature                                 | Required | Description                                                                                                                                                                         |
| ------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| String getUsername()                             | Yes      | Returns the username used when authenticating with the Database.                                                                                                                    |
| String getPassword()                             | Yes      | Returns the password used when authenticating with the Database.                                                                                                                    |
| boolean setRequired(boolean required)            | Yes      | Update the credentials editor to indicate that the connection type does not require credential information (e.g. when using SQL/Server’s integrated security).                      |
| int injectIntoUI(JPanel panel, int startRow)     | No       | Adds any UI elements needed by the password manager to the CopyStorm UI.                                                                                                            |
| boolean isAvailable()                            | No       | Returns true if the password manager should appear as an option in the UI.                                                                                                          |
| void saveState(Element e, boolean savePasswords) | Yes      | Adds XML attributes to the provided Element to save any information needed to restore system state. This information is saved to CopyStorm’s configuration file.                    |
| void restoreState(Element e)                     | Yes      | Restore XML state saved via saveState()                                                                                                                                             |
| String getFingerprint()                          | Yes      | Returns a value used to determine whether or not credentials have changed. This is used to determine whether or not a cached session may be used when connecting with the Database. |
| boolean isComplete()                             | Yes      | Returns true when information provided by the user is enough to attempt a connection to the Database.                                                                               |
| void clear()                                     | Yes      | Clears out any internal state kept by the password manager.                                                                                                                         |

In addition to the required methods above, there are several convenience methods which may be used by credential managers:

| Method Signature                                                                      | Description                                                                                                                                                |
| ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| void fireCredentialsComplete(boolean complete)                                        | Enables or disables the “Test Database Connection” button.                                                                                                 |
| void addRowToUI(String label, String toltip, JComponent editor, JPanel panel, int row | Adds a new editor to the UI. This method can be used in the injectIntoUI() method to maintain consistent styling with the rest of the CopyStorm UI.        |
| String encrypt(String text)                                                           | Encrypts text. This method can be used in the saveState() function to avoid implementing a custom encryption scheme to support encrypting saved passwords. |
| String decrypt(String encryptedText)                                                  | Decrypts text encrypted with encrypt(). This method can be used in the restoreState() function to avoid implementing a custom encryption scheme.           |
| void saveXMLAttribute(Element e, String key, String value)                            | Adds a new attribute to an XML element. This method can be used in the saveState() function to avoid interacting with the Element directly.                |
| String loadXMLAttribute(Element e, String key)                                        | Retrieves an attribute to an XML element This method can be used in the restoreState() function to avoid interacting with the Element directly.            |

## Example Credential Manager: Keepass

Click Here to view the Java source of Capstorm’s built-in Keepass Database password manager.

{% file src="/files/y4F1o2peHZm1B7ilyrxU" %}
