Use clientip.Extract for esign and session IP capture

Several HTTP entry points still parsed RemoteAddr directly, so behind
a layer-7 proxy they recorded the load balancer IP instead of the
signer's. Route NDA acceptance, signing events, document sign/approve,
and session updates through clientip.Extract, which honors Forwarded
and X-Forwarded-For when trustedproxy allows them.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
This commit is contained in:
Ludovic Vielle
2026-07-06 11:43:39 +02:00
parent 119b20bfbc
commit 1116fc6bb4
5 changed files with 51 additions and 37 deletions

View File

@@ -10,7 +10,6 @@ import (
"encoding/base64"
"errors"
"fmt"
"net"
"github.com/vikstrous/dataloadgen"
"go.gearno.de/kit/log"
@@ -21,6 +20,7 @@ import (
"go.probo.inc/probo/pkg/probo"
"go.probo.inc/probo/pkg/resourcealias"
"go.probo.inc/probo/pkg/server/api/authn"
"go.probo.inc/probo/pkg/server/api/clientip"
"go.probo.inc/probo/pkg/server/api/console/v1/dataloader"
"go.probo.inc/probo/pkg/server/api/console/v1/schema"
"go.probo.inc/probo/pkg/server/api/console/v1/types"
@@ -1433,10 +1433,7 @@ func (r *mutationResolver) SignDocument(ctx context.Context, input types.SignDoc
identity := authn.IdentityFromContext(ctx)
httpReq := gqlutils.HTTPRequestFromContext(ctx)
signerIP, _, _ := net.SplitHostPort(httpReq.RemoteAddr)
if signerIP == "" {
signerIP = httpReq.RemoteAddr
}
signerIP := clientip.Extract(httpReq)
documentVersionSignature, err := r.probo.Documents.SignDocumentVersionByIdentity(
ctx,
@@ -1487,10 +1484,7 @@ func (r *mutationResolver) ApproveDocumentVersion(ctx context.Context, input typ
identity := authn.IdentityFromContext(ctx)
httpReq := gqlutils.HTTPRequestFromContext(ctx)
signerIP, _, _ := net.SplitHostPort(httpReq.RemoteAddr)
if signerIP == "" {
signerIP = httpReq.RemoteAddr
}
signerIP := clientip.Extract(httpReq)
decision, err := r.probo.DocumentApprovals.Approve(ctx, scope, probo.ApproveDocumentVersionRequest{
DocumentVersionID: input.DocumentVersionID,