Date: Wed, 3 Jun 2026 11:31:16 -0700
Subject: [PATCH 5/8] add text for HEC setup
---
ui/src/app/app.component.html | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html
index aaaf4df..546e1c5 100644
--- a/ui/src/app/app.component.html
+++ b/ui/src/app/app.component.html
@@ -33,7 +33,7 @@ Event Delivery Mode
id="poll"
value="poll"
/>
- Poll
+ REST API
@@ -44,10 +44,23 @@ Event Delivery Mode
id="push"
value="push"
/>
- Push
+ HEC Event Collector
- @if (!isPushEventDelivery()) {
+ @if (isPushEventDelivery()) {
+
+ To complete setup for receiving event logs with the HEC Event
+ Collector, follow the instructions in the
+
+ Bitwarden Splunk documentation .
+
+ } @else {
Bitwarden API Key
Your
From e5855424d330721a7a5314ebfdcfeebb112513e0 Mon Sep 17 00:00:00 2001
From: Brad Deibert
Date: Wed, 3 Jun 2026 16:27:10 -0700
Subject: [PATCH 6/8] remove validators for poll fields when push selected
---
ui/src/app/app.component.ts | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts
index 650fd98..5c87587 100644
--- a/ui/src/app/app.component.ts
+++ b/ui/src/app/app.component.ts
@@ -114,7 +114,26 @@ export class AppComponent {
takeUntilDestroyed(),
)
.subscribe((eventDeliveryMode) => {
- this.isPushEventDelivery.set(eventDeliveryMode === "push");
+ const isPush = eventDeliveryMode === "push";
+ this.isPushEventDelivery.set(isPush);
+
+ // disable form validators when push is selected, reapply when polling is selected
+ if (isPush) {
+ this.setupForm.controls.clientId.clearValidators();
+ this.setupForm.controls.clientSecret.clearValidators();
+ this.setupForm.controls.serverUrl.clearValidators();
+ this.setupForm.setValidators(null);
+ this.setupForm.controls.clientId.updateValueAndValidity();
+ this.setupForm.controls.clientSecret.updateValueAndValidity();
+ this.setupForm.controls.serverUrl.updateValueAndValidity();
+ this.setupForm.updateValueAndValidity();
+ } else {
+ this.setupForm.controls.clientId.setValidators(Validators.required);
+ this.setupForm.controls.clientSecret.setValidators(
+ Validators.required,
+ );
+ this.setupForm.setValidators(indexRequiredValidator());
+ }
});
// Load indexes
From e62e0df1872aae47b2ca04fdce580bb2bb0af08f Mon Sep 17 00:00:00 2001
From: Brad Deibert
Date: Wed, 3 Jun 2026 16:39:35 -0700
Subject: [PATCH 7/8] update setup form logic to save push configuration
---
ui/src/app/app.component.ts | 106 +++++++++++++++++-------------
ui/src/models/bitwarden-splunk.ts | 5 +-
ui/src/models/setup-form.ts | 1 +
3 files changed, 65 insertions(+), 47 deletions(-)
diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts
index 5c87587..66e1bb5 100644
--- a/ui/src/app/app.component.ts
+++ b/ui/src/app/app.component.ts
@@ -160,54 +160,12 @@ export class AppComponent {
const formValue = this.setupForm.value as SetupForm;
try {
- // Store secrets
- await this.bitwardenSplunkService.upsertApiKey(
- formValue.clientId,
- formValue.clientSecret,
- );
-
- // Update inputs.conf
- const index = formValue.indexOverride
- ? formValue.indexOverride
- : formValue.index;
- console.debug("Index", index);
- await this.bitwardenSplunkService.updateInputsConfigurationFile({
- index,
- });
-
- // Update script.conf
- let apiUrl: string;
- let identityUrl: string;
- if (this.isServerUrlBitwardenCloud(formValue.serverUrlType)) {
- const serverHost =
- formValue.serverUrlType === "bitwarden.com"
- ? "bitwarden.com"
- : "bitwarden.eu";
- apiUrl = `https://api.${serverHost}`;
- identityUrl = `https://identity.${serverHost}`;
+ if (formValue.eventDeliveryMode === "poll") {
+ await this.submitPollingConfiguration(formValue);
} else {
- const containsProtocol = /^https?:\/\//.test(formValue.serverUrl);
- const serverUrl = new URL(
- containsProtocol
- ? formValue.serverUrl
- : "https://" + formValue.serverUrl,
- );
-
- if (!serverUrl.pathname.endsWith("/")) {
- serverUrl.pathname = serverUrl.pathname + "/";
- }
-
- apiUrl = serverUrl.href + "api";
- identityUrl = serverUrl.href + "identity";
+ await this.submitPushConfiguration(formValue);
}
- console.debug("Bitwarden urls", apiUrl, identityUrl);
- await this.bitwardenSplunkService.updateScriptConfigurationFile({
- apiUrl,
- identityUrl,
- startDate: formValue.startDate,
- });
-
// Complete setup
await this.bitwardenSplunkService.updateAppConfigurationFile(true);
await this.bitwardenSplunkService.reloadApp();
@@ -226,6 +184,63 @@ export class AppComponent {
}
}
+ private async submitPollingConfiguration(formValue: SetupForm) {
+ // Store secrets
+ await this.bitwardenSplunkService.upsertApiKey(
+ formValue.clientId,
+ formValue.clientSecret,
+ );
+
+ // Update inputs.conf
+ const index = formValue.indexOverride
+ ? formValue.indexOverride
+ : formValue.index;
+ console.debug("Index", index);
+ await this.bitwardenSplunkService.updateInputsConfigurationFile({
+ index,
+ });
+
+ // Update script.conf
+ let apiUrl: string;
+ let identityUrl: string;
+ if (this.isServerUrlBitwardenCloud(formValue.serverUrlType)) {
+ const serverHost =
+ formValue.serverUrlType === "bitwarden.com"
+ ? "bitwarden.com"
+ : "bitwarden.eu";
+ apiUrl = `https://api.${serverHost}`;
+ identityUrl = `https://identity.${serverHost}`;
+ } else {
+ const containsProtocol = /^https?:\/\//.test(formValue.serverUrl);
+ const serverUrl = new URL(
+ containsProtocol
+ ? formValue.serverUrl
+ : "https://" + formValue.serverUrl,
+ );
+
+ if (!serverUrl.pathname.endsWith("/")) {
+ serverUrl.pathname = serverUrl.pathname + "/";
+ }
+
+ apiUrl = serverUrl.href + "api";
+ identityUrl = serverUrl.href + "identity";
+ }
+
+ console.debug("Bitwarden urls", apiUrl, identityUrl);
+ await this.bitwardenSplunkService.updateScriptConfigurationFile({
+ apiUrl,
+ identityUrl,
+ startDate: formValue.startDate,
+ eventDeliveryMode: formValue.eventDeliveryMode,
+ });
+ }
+
+ private async submitPushConfiguration(formValue: SetupForm) {
+ await this.bitwardenSplunkService.updateScriptConfigurationFile({
+ eventDeliveryMode: formValue.eventDeliveryMode,
+ });
+ }
+
private loadConfiguration(indexesObservable: Observable) {
combineLatest([
indexesObservable,
@@ -252,6 +267,7 @@ export class AppComponent {
if (
scriptConfiguration !== undefined &&
+ scriptConfiguration.apiUrl !== undefined &&
URL.canParse(scriptConfiguration.apiUrl)
) {
const apiUrl = new URL(scriptConfiguration.apiUrl);
diff --git a/ui/src/models/bitwarden-splunk.ts b/ui/src/models/bitwarden-splunk.ts
index dce269c..97d5731 100644
--- a/ui/src/models/bitwarden-splunk.ts
+++ b/ui/src/models/bitwarden-splunk.ts
@@ -3,7 +3,8 @@ export type InputsConfiguration = {
};
export type ScriptsConfiguration = {
- apiUrl: string;
- identityUrl: string;
+ apiUrl?: string;
+ identityUrl?: string;
startDate?: string;
+ eventDeliveryMode?: "poll" | "push";
};
diff --git a/ui/src/models/setup-form.ts b/ui/src/models/setup-form.ts
index ee8206b..170a334 100644
--- a/ui/src/models/setup-form.ts
+++ b/ui/src/models/setup-form.ts
@@ -8,4 +8,5 @@ export type SetupForm = {
startDate: string;
index: string;
indexOverride: string;
+ eventDeliveryMode: "poll" | "push";
};
From 9e88a49ee532ab595b305e00f0a733181ee6348a Mon Sep 17 00:00:00 2001
From: Brad Deibert
Date: Thu, 11 Jun 2026 15:52:24 -0700
Subject: [PATCH 8/8] expose HEC port on dev containers
---
dev/docker-compose.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml
index adfcc1b..ddbf352 100644
--- a/dev/docker-compose.yml
+++ b/dev/docker-compose.yml
@@ -8,6 +8,7 @@ services:
ports:
- "8001:8000"
- "8089:8089"
+ - "8088:8088"
environment:
SPLUNK_GENERAL_TERMS: "--accept-sgt-current-at-splunk-com"
SPLUNK_START_ARGS: "--accept-license"
@@ -19,6 +20,7 @@ services:
ports:
- "8001:8000"
- "8089:8089"
+ - "8088:8088"
environment:
SPLUNK_START_ARGS: "--accept-license"
SPLUNK_PASSWORD: password