Galaxy: send operator credential in AcknowledgeAlarmRequest (mxaccessgw AckMsg-as-operator) #749
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
mxaccessgw main
488649c(PR #162, 2026-10-20) changed native alarm acknowledge: the gateway now acknowledges by writing the comment to<alarm>.AckMsgafterAuthenticateUseras the operator, so the Historian records the real operator.AcknowledgeAlarmRequestgainedoperator_password/operator_domain.OtOpcUa pins
ZB.MOM.WW.MxGateway.Client/Contracts0.2.1 and nothing undersrc/setsOperatorPassword(grep 2026-11-06), soGatewayGalaxyAlarmAcknowledger(src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Galaxy/Runtime/GatewayGalaxyAlarmAcknowledger.cs) sends no credential. Galaxy acks will not authenticate once a gateway at or after488649cis deployed.Work:
${secret:}/Secrets, but that needs a decision.This blocks mxaccessgw#170 (deploying the operator-authenticated ack to DEV/QA).
Source: scadaproj
CLAUDE.md(MxAccessGateway row); mxaccessgwclients/rust/protos/mxaccess_gateway.proto(AcknowledgeAlarmCommand.operator_password). Related: #614 (H6 ack reaches AVEVA event history).Blocked on two things (2026-11-06 investigation, no code changed):
OperatorPassword); mxgw main still declares 0.2.1. Tracked as mxaccessgw#214.${secret:}); (2) per-API-key Galaxy ack identity in AdminUI, with (1) as fallback or fail-closed (recommended); (3) operator Galaxy login over OPC UA (not recommended). Also: the new gateway rejects emptyoperator_user, andGalaxyDriver.cs:1935sendsstring.Emptywhen no principal resolves, so anonymous acks will fail against 488649c+.Decision (user, 2026-11-06): use a per-API-key Galaxy ack identity, mapped in AdminUI
/api-keyswith the password held in Secrets. Unmapped keys and anonymous sessions fall back to one configured ack account per Galaxy driver, also via${secret:}. Never send an emptyoperator_user. Implementation waits for mxaccessgw#214 (Contracts/Client 0.3.0) to be published.Landed on
masterasdc0a24f2(fast-forward; the commit'sCloses #749closed this).Design (option 2 + fallback, per the 2026-11-06 decision). For each ack the Galaxy driver resolves:
/apikeys→ "Ack identity" and held only in the encrypted Secrets store, asotopcua/apikeys/<keyId>/galaxy-ack-user(DOMAIN\user) andotopcua/apikeys/<keyId>/galaxy-ack-password. A key that has a user but no password secret is refused, not downgraded to the fallback.AlarmAckfallback account (FallbackUser/FallbackDomain/FallbackPasswordSecretRef). The password ref must besecret:/${secret:}/env:/file:/dev:; a literal is refused.DriverOperationRefusedException. Nothing is sent, andoperator_useris never sent empty. Refusals don't count toward retry or the circuit breaker.Other changes:
[OPC UA: <principal>, key <id>]) and logged.GalaxyAckCredential.ToStringomits it, the acknowledger scrubs it from gateway echoes, and audit rows carry only the key id. Only the key id travels through the actor messages; the password is resolved inside the driver.nuget-packages/.Tests (all green):
The new tests cover:
Not done:
:5130dashboard doesn't show its build without a login, so I couldn't confirm it is at or after mxaccessgw 488649c.Deploy-time config: give each Galaxy driver an
AlarmAckfallback (e.g.FallbackPasswordSecretRef: secret:otopcua/galaxy/ack-fallback-password) and create that secret, and/or map identities per key on/apikeys. Secrets are node-local, so on a split admin/driver topology they must also exist on the driver nodes. With neither in place, every Galaxy ack is refused.