# Working with PAM in Java SDK

PAM (Privileged Access Manager) records contain connection settings that define how to connect to privileged resources. The Java SDK provides three specialized classes to access these settings:

* **PamRbiConnection** - RBI (Remote Browser Isolation) connection settings including audio and clipboard controls
* **PamSettingsConnection** - Protocol-specific connection settings (RDP, SSH, VNC, Kubernetes)
* **PamSettingsPortForward** - Port forwarding configuration including local port settings

## Access PAM Connection Settings

{% code title="Example.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

// Assume storage is already initialized
SecretsManagerOptions options = new SecretsManagerOptions(storage);
KeeperSecrets secrets = SecretsManager.getSecrets(options);

KeeperRecord pamRecord = secrets.getRecords().get(0);
KeeperRecordData data = pamRecord.getData();

// Access PAM settings field
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    // Access connection settings
    if (setting.getConnection() != null) {
        PamSettingsConnection conn = setting.getConnection();

        System.out.println("Protocol: " + conn.getProtocol());
        System.out.println("Port: " + conn.getPort());

        // Access protocol-specific settings
        if ("rdp".equals(conn.getProtocol())) {
            System.out.println("Screen Width: " + conn.getWidth());
            System.out.println("Screen Height: " + conn.getHeight());
            System.out.println("Color Depth: " + conn.getColorDepth());
        }
    }
}
```

{% endcode %}

## RDP Connection Settings

Access RDP-specific settings for Windows Remote Desktop connections:

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "rdp".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // Display settings
        System.out.println("Width: " + conn.getWidth());
        System.out.println("Height: " + conn.getHeight());
        System.out.println("DPI: " + conn.getDpi());
        System.out.println("Color Depth: " + conn.getColorDepth());

        // Remote application settings
        System.out.println("Initial Program: " + conn.getInitialProgram());
        System.out.println("Remote App: " + conn.getRemoteApp());
        System.out.println("Remote App Directory: " + conn.getRemoteAppDir());
        System.out.println("Remote App Arguments: " + conn.getRemoteAppArgs());

        // Audio settings
        System.out.println("Console Audio: " + conn.getConsoleAudio());
        System.out.println("Enable Audio Input: " + conn.getEnableAudioInput());

        // Client settings
        System.out.println("Client Name: " + conn.getClientName());
        System.out.println("Server Layout: " + conn.getServerLayout());

        // Feature toggles
        System.out.println("Enable Touch: " + conn.getEnableTouch());
        System.out.println("Enable Printing: " + conn.getEnablePrinting());
        System.out.println("Enable Theming: " + conn.getEnableTheming());
        System.out.println("Enable Font Smoothing: " + conn.getEnableFontSmoothing());

        // Caching settings
        System.out.println("Disable Bitmap Caching: " + conn.getDisableBitmapCaching());
        System.out.println("Disable Offscreen Caching: " + conn.getDisableOffscreenCaching());
        System.out.println("Disable Glyph Caching: " + conn.getDisableGlyphCaching());

        // Other settings
        System.out.println("Normalize Clipboard: " + conn.getNormalizeClipboard());
        System.out.println("Console Mode: " + conn.getConsole());
        System.out.println("Read Only: " + conn.getReadOnly());
    }
}
```

{% endcode %}

## SSH/Terminal Connection Settings

Access SSH and terminal-specific settings:

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "ssh".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // Terminal display settings
        System.out.println("Font Name: " + conn.getFontName());
        System.out.println("Scrollback Buffer: " + conn.getScrollback());
        System.out.println("Terminal Type: " + conn.getTerminalType());

        // Input settings
        System.out.println("Backspace Key: " + conn.getBackspace());

        // Localization settings
        System.out.println("Clipboard Encoding: " + conn.getClipboardEncoding());
        System.out.println("Locale: " + conn.getLocale());
        System.out.println("Timezone: " + conn.getTimezone());

        // Connection settings
        System.out.println("Server Alive Interval: " + conn.getServerAliveInterval());
    }
}
```

{% endcode %}

## VNC Connection Settings

Access VNC-specific settings for remote desktop control:

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "vnc".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // Audio settings
        System.out.println("Enable Audio: " + conn.getEnableAudio());
        System.out.println("Audio Server: " + conn.getAudioServername());

        // Display settings
        System.out.println("Swap Red/Blue: " + conn.getSwapRedBlue());
        System.out.println("Cursor Mode: " + conn.getCursor());
        System.out.println("Force Lossless: " + conn.getForceLossless());
    }
}
```

{% endcode %}

## Kubernetes Connection Settings

Access Kubernetes-specific settings:

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "k8s".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // Connection settings
        System.out.println("Use SSL: " + conn.getUseSSL());
        System.out.println("Namespace: " + conn.getNamespace());
        System.out.println("Pod: " + conn.getPod());
        System.out.println("Container: " + conn.getContainer());

        // Certificate settings
        System.out.println("CA Certificate: " + conn.getCaCert());
        System.out.println("Client Certificate: " + conn.getClientCert());
        System.out.println("Client Key: " + conn.getClientKey());
    }
}
```

{% endcode %}

## RBI Audio and Clipboard Controls

Access RBI (Remote Browser Isolation) settings for audio and clipboard management:

{% code title="Example.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

PamRemoteBrowserSettings rbiSettings = data.getField(PamRemoteBrowserSettings.class);
if (rbiSettings != null && !rbiSettings.getValue().isEmpty()) {
    PamRemoteBrowserSetting setting = rbiSettings.getValue().get(0);

    if (setting.getConnection() != null) {
        PamRbiConnection rbi = setting.getConnection();

        // Audio controls
        System.out.println("Disable Audio: " + rbi.getDisableAudio());
        System.out.println("Audio Channels: " + rbi.getAudioChannels());
        System.out.println("Audio BPS: " + rbi.getAudioBps());
        System.out.println("Audio Sample Rate: " + rbi.getAudioSampleRate());

        // Clipboard controls
        System.out.println("Disable Copy: " + rbi.getDisableCopy());
        System.out.println("Disable Paste: " + rbi.getDisablePaste());
    }
}
```

{% endcode %}

## Port Forwarding Configuration

Access port forwarding settings with local port customization:

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getPortForward() != null) {
        PamSettingsPortForward portForward = setting.getPortForward();

        // Basic port forwarding
        System.out.println("Port: " + portForward.getPort());

        // Local port configuration
        System.out.println("Use Specified Local Port: " + portForward.getUseSpecifiedLocalPort());
        if (Boolean.TRUE.equals(portForward.getUseSpecifiedLocalPort())) {
            System.out.println("Local Port: " + portForward.getLocalPort());
        }
    }
}
```

{% endcode %}

## Complete PAM Connection Example

{% code title="PAMConnectionExample.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

public class PAMConnectionExample {
    public static void main(String[] args) throws Exception {
        // Assume storage is already initialized
        SecretsManagerOptions options = new SecretsManagerOptions(storage);
        KeeperSecrets secrets = SecretsManager.getSecrets(options);

        for (KeeperRecord record : secrets.getRecords()) {
            KeeperRecordData data = record.getData();

            // Check if this is a PAM record with connection settings
            PamSettings pamSettings = data.getField(PamSettings.class);
            if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
                PamSetting setting = pamSettings.getValue().get(0);

                // Access connection settings
                if (setting.getConnection() != null) {
                    PamSettingsConnection conn = setting.getConnection();
                    String protocol = conn.getProtocol();

                    System.out.println("\n=== PAM Connection: " + data.getTitle() + " ===");
                    System.out.println("Type: " + protocol);
                    System.out.println("Port: " + conn.getPort());

                    // Handle protocol-specific settings
                    switch (protocol != null ? protocol : "") {
                        case "rdp":
                            System.out.println("RDP Display: " + conn.getWidth() + "x" + conn.getHeight());
                            System.out.println("Color Depth: " + conn.getColorDepth() + " bit");
                            System.out.println("Audio Input Enabled: " + conn.getEnableAudioInput());
                            break;

                        case "ssh":
                            System.out.println("Terminal Type: " + conn.getTerminalType());
                            System.out.println("Font: " + conn.getFontName());
                            System.out.println("Locale: " + conn.getLocale());
                            break;

                        case "vnc":
                            System.out.println("Audio Enabled: " + conn.getEnableAudio());
                            System.out.println("Cursor Mode: " + conn.getCursor());
                            break;

                        case "k8s":
                            System.out.println("Namespace: " + conn.getNamespace());
                            System.out.println("Pod: " + conn.getPod());
                            System.out.println("Container: " + conn.getContainer());
                            break;
                    }
                }

                // Check for RBI settings
                PamRemoteBrowserSettings rbiSettings = data.getField(PamRemoteBrowserSettings.class);
                if (rbiSettings != null && !rbiSettings.getValue().isEmpty()) {
                    PamRemoteBrowserSetting rbiSetting = rbiSettings.getValue().get(0);
                    if (rbiSetting.getConnection() != null) {
                        PamRbiConnection rbi = rbiSetting.getConnection();
                        System.out.println("RBI Audio Disabled: " + rbi.getDisableAudio());
                        System.out.println("RBI Clipboard Copy Disabled: " + rbi.getDisableCopy());
                        System.out.println("RBI Clipboard Paste Disabled: " + rbi.getDisablePaste());
                    }
                }

                // Check for port forwarding
                if (setting.getPortForward() != null) {
                    PamSettingsPortForward pf = setting.getPortForward();
                    if (Boolean.TRUE.equals(pf.getUseSpecifiedLocalPort())) {
                        System.out.println("Local Port: " + pf.getLocalPort());
                    }
                }
            }
        }
    }
}
```

{% endcode %}

{% hint style="warning" %}
**Protocol-Specific Field Availability**

The `PamSettingsConnection` class contains fields for multiple protocols (RDP, SSH, VNC, Kubernetes). Only fields relevant to the record's `connectionType` will be populated.

**Example:**

* RDP records: `width`, `height`, `colorDepth` will have values
* SSH records: `fontName`, `terminalType`, `locale` will have values
* VNC records: `enableAudio`, `cursor`, `swapRedBlue` will have values
* K8s records: `namespace`, `pod`, `container` will have values

**Always check for null** before accessing protocol-specific fields:

```java
if ("rdp".equals(conn.getProtocol())) {
    Integer width = conn.getWidth(); // Safe: RDP-specific field
}
```

Accessing SSH fields on an RDP record will return `null`.
{% endhint %}


---

# Agent Instructions: 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:

```
GET https://docs.keeper.io/keeperpam/secrets-manager/developer-sdk-library/java-sdk/working-with-pam-in-java-sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
