> 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-password-manager.md).

# How to Add a New Salesforce Password Manager

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

This feature was introduced when a customer had strict rules on password changes for service accounts in Salesforce and did not want to:

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

Since this customer used their own company-wide password manager, an extension was added to CopyStorm to allow them to retrieve password information directly from their password manager instead of from CopyStorm configuration files or the command line.

This article describes how to add a new custom password manager to CopyStorm.

## Feature Overview

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

1. Write a Java class that extends the class com.aslan.sfdc.connect.credentials.AbstractSalesforceUserPasswordCredentials.
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 the new credential manager with CopyStorm.

## Writing the Java Class

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

| Method Signature                                 | Required | Description                                                                                                                                                                       |
| ------------------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| String getUsername()                             | Yes      | Returns the username used when authenticating with Salesforce.                                                                                                                    |
| String getPassword()                             | Yes      | Returns the password used when authenticating with Salesforce.                                                                                                                    |
| String getSecurityToken()                        | Yes      | Returns the security token used when authenticating with Salesforce.                                                                                                              |
| 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 Salesforce. |
| boolean isComplete()                             | Yes      | Returns true when information provided by the user is enough to attempt a connection to Salesforce.                                                                               |
| 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 Salesforce 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.            |

## Adding the New Password Manager to CopyStorm

CopyStorm discovers all available Salesforce Password Managers by looking for a file named “CredentialsRegistry.xml” in the CopyStorm config directory.

The following CredentialsRegistry.xml file will load a new password manager named “Keyring”:

```
<Credentials>
   <CredentialType family="Salesforce" name="Keyring" 
      class="com.mycompany.copystorm.credentials.KeyringSalesforceCredentials"
      />
</Credentials>
```

## Example Credential Manager: Keepass

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

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://learn.capstorm.com/frequently-asked-questions/usage/where-does-copystorm-store-passwords/how-to-add-a-new-password-manager.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
