From 63dffe801efab497af77f895d594be8e817b6a57 Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Tue, 21 Jul 2026 15:39:28 +0200 Subject: [PATCH] Store full portal titles as home headings The UI composed "Compliance at {{name}}." via i18n while the DB only held the org name. Persist the full heading, backfill existing rows, and drop the unused heroTitle locale keys. Also use clientip.Extract for NDA signing events and default the portal base domain to probopage.localhost for local runs. Signed-off-by: Bryan Frimin --- .../compliance-portal/src/_locales/de-DE.json | 1 - .../compliance-portal/src/_locales/en-US.json | 1 - .../compliance-portal/src/_locales/es-ES.json | 1 - .../compliance-portal/src/_locales/fr-FR.json | 1 - .../compliance-portal/src/_locales/id-ID.json | 1 - .../compliance-portal/src/_locales/it-IT.json | 1 - .../compliance-portal/src/_locales/ja-JP.json | 1 - .../compliance-portal/src/_locales/ko-KR.json | 1 - .../compliance-portal/src/_locales/pl-PL.json | 1 - .../compliance-portal/src/_locales/pt-PT.json | 1 - .../compliance-portal/src/_locales/tr-TR.json | 1 - .../compliance-portal/src/_locales/uk-UA.json | 1 - .../compliance-portal/src/_locales/zh-CN.json | 1 - apps/compliance-portal/src/pages/HomePage.tsx | 2 +- .../CompliancePageProfileSection.tsx | 2 +- .../management/portal_service.go | 2 +- pkg/coredata/migrations/20260721T133736Z.sql | 23 +++++++++++++++++++ pkg/iam/organization_service.go | 2 +- pkg/probod/probod.go | 2 +- .../api/complianceportal/v1/nda_resolvers.go | 12 +++------- 20 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 pkg/coredata/migrations/20260721T133736Z.sql diff --git a/apps/compliance-portal/src/_locales/de-DE.json b/apps/compliance-portal/src/_locales/de-DE.json index 0a9b2b78d..954a33285 100644 --- a/apps/compliance-portal/src/_locales/de-DE.json +++ b/apps/compliance-portal/src/_locales/de-DE.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Vertrauen bei {{name}}.", "heroDescription": "Willkommen auf unserem Compliance-Portal. Hier finden Sie unsere Sicherheitsdokumentation und Zertifizierungen.", "sections": { "compliance": "Compliance", diff --git a/apps/compliance-portal/src/_locales/en-US.json b/apps/compliance-portal/src/_locales/en-US.json index 45d0c49e8..df019b29e 100644 --- a/apps/compliance-portal/src/_locales/en-US.json +++ b/apps/compliance-portal/src/_locales/en-US.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Compliance at {{name}}.", "heroDescription": "Welcome to our Compliance Portal. Find our security documentation and certifications here.", "sections": { "compliance": "Compliance", diff --git a/apps/compliance-portal/src/_locales/es-ES.json b/apps/compliance-portal/src/_locales/es-ES.json index d705f6d50..3c095d1bf 100644 --- a/apps/compliance-portal/src/_locales/es-ES.json +++ b/apps/compliance-portal/src/_locales/es-ES.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Confianza en {{name}}.", "heroDescription": "Bienvenido a nuestro Portal de cumplimiento. Aquí encontrará nuestra documentación de seguridad y nuestras certificaciones.", "sections": { "compliance": "Cumplimiento", diff --git a/apps/compliance-portal/src/_locales/fr-FR.json b/apps/compliance-portal/src/_locales/fr-FR.json index a97146490..d1aa365ae 100644 --- a/apps/compliance-portal/src/_locales/fr-FR.json +++ b/apps/compliance-portal/src/_locales/fr-FR.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "La confiance chez {{name}}.", "heroDescription": "Bienvenue dans notre Portail de conformité. Retrouvez ici notre documentation et nos certifications de sécurité.", "sections": { "compliance": "Conformité", diff --git a/apps/compliance-portal/src/_locales/id-ID.json b/apps/compliance-portal/src/_locales/id-ID.json index 1b5e90e17..cedeb33cc 100644 --- a/apps/compliance-portal/src/_locales/id-ID.json +++ b/apps/compliance-portal/src/_locales/id-ID.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Kepercayaan di {{name}}.", "heroDescription": "Selamat datang di Portal Kepatuhan kami. Temukan dokumentasi keamanan dan sertifikasi kami di sini.", "sections": { "compliance": "Kepatuhan", diff --git a/apps/compliance-portal/src/_locales/it-IT.json b/apps/compliance-portal/src/_locales/it-IT.json index 6606b90ba..02098a62e 100644 --- a/apps/compliance-portal/src/_locales/it-IT.json +++ b/apps/compliance-portal/src/_locales/it-IT.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "La fiducia in {{name}}.", "heroDescription": "Benvenuti nel nostro Portale di conformità. Qui potete trovare la nostra documentazione di sicurezza e le nostre certificazioni.", "sections": { "compliance": "Conformità", diff --git a/apps/compliance-portal/src/_locales/ja-JP.json b/apps/compliance-portal/src/_locales/ja-JP.json index b74152a4b..b37eb19f3 100644 --- a/apps/compliance-portal/src/_locales/ja-JP.json +++ b/apps/compliance-portal/src/_locales/ja-JP.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "{{name}}における信頼。", "heroDescription": "コンプライアンスポータルへようこそ。セキュリティに関する文書や認証はこちらからご確認いただけます。", "sections": { "compliance": "コンプライアンス", diff --git a/apps/compliance-portal/src/_locales/ko-KR.json b/apps/compliance-portal/src/_locales/ko-KR.json index ee2f33f92..d9082e48f 100644 --- a/apps/compliance-portal/src/_locales/ko-KR.json +++ b/apps/compliance-portal/src/_locales/ko-KR.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "{{name}}의 신뢰.", "heroDescription": "컴플라이언스 포털에 오신 것을 환영합니다. 이곳에서 보안 문서와 인증 정보를 확인하실 수 있습니다.", "sections": { "compliance": "컴플라이언스", diff --git a/apps/compliance-portal/src/_locales/pl-PL.json b/apps/compliance-portal/src/_locales/pl-PL.json index 9a6124ced..dfd9f57c8 100644 --- a/apps/compliance-portal/src/_locales/pl-PL.json +++ b/apps/compliance-portal/src/_locales/pl-PL.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Zaufanie w {{name}}.", "heroDescription": "Witamy w naszym Portalu Zgodności. Znajdziesz tu naszą dokumentację bezpieczeństwa i certyfikaty.", "sections": { "compliance": "Zgodność", diff --git a/apps/compliance-portal/src/_locales/pt-PT.json b/apps/compliance-portal/src/_locales/pt-PT.json index b704c63ad..20a4cf0e6 100644 --- a/apps/compliance-portal/src/_locales/pt-PT.json +++ b/apps/compliance-portal/src/_locales/pt-PT.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "A confiança na {{name}}.", "heroDescription": "Bem-vindo ao nosso Portal de Conformidade. Encontre aqui a nossa documentação de segurança e certificações.", "sections": { "compliance": "Conformidade", diff --git a/apps/compliance-portal/src/_locales/tr-TR.json b/apps/compliance-portal/src/_locales/tr-TR.json index 5e1a20fe0..40fa648a1 100644 --- a/apps/compliance-portal/src/_locales/tr-TR.json +++ b/apps/compliance-portal/src/_locales/tr-TR.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "{{name}}'de Güven.", "heroDescription": "Uyumluluk Portalımıza hoş geldiniz. Güvenlik belgelerimizi ve sertifikalarımızı burada bulabilirsiniz.", "sections": { "compliance": "Uyumluluk", diff --git a/apps/compliance-portal/src/_locales/uk-UA.json b/apps/compliance-portal/src/_locales/uk-UA.json index afe1fa698..fa23294e8 100644 --- a/apps/compliance-portal/src/_locales/uk-UA.json +++ b/apps/compliance-portal/src/_locales/uk-UA.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "Довіра в {{name}}.", "heroDescription": "Вітаємо у нашому Порталі відповідності. Тут ви знайдете нашу документацію з безпеки та сертифікати.", "sections": { "compliance": "Відповідність", diff --git a/apps/compliance-portal/src/_locales/zh-CN.json b/apps/compliance-portal/src/_locales/zh-CN.json index 34a4da277..b396b02f2 100644 --- a/apps/compliance-portal/src/_locales/zh-CN.json +++ b/apps/compliance-portal/src/_locales/zh-CN.json @@ -45,7 +45,6 @@ } }, "home": { - "heroTitle": "信赖 {{name}}。", "heroDescription": "欢迎访问我们的合规门户。您可以在此查看我们的安全文档和认证。", "sections": { "compliance": "合规", diff --git a/apps/compliance-portal/src/pages/HomePage.tsx b/apps/compliance-portal/src/pages/HomePage.tsx index 9e683a7e9..940fac1d2 100644 --- a/apps/compliance-portal/src/pages/HomePage.tsx +++ b/apps/compliance-portal/src/pages/HomePage.tsx @@ -57,7 +57,7 @@ export function HomePage({ queryRef }: HomePageProps) { return ( <> diff --git a/apps/console/src/pages/organizations/compliance-page/brand/_components/CompliancePageProfileSection.tsx b/apps/console/src/pages/organizations/compliance-page/brand/_components/CompliancePageProfileSection.tsx index b4336256e..6df95f83b 100644 --- a/apps/console/src/pages/organizations/compliance-page/brand/_components/CompliancePageProfileSection.tsx +++ b/apps/console/src/pages/organizations/compliance-page/brand/_components/CompliancePageProfileSection.tsx @@ -100,7 +100,7 @@ export function CompliancePageProfileSection(props: { readOnly={readOnly} name="title" label={__("Title")} - placeholder={__("Your company or product name")} + placeholder={__("Compliance at Acme.")} />
diff --git a/pkg/complianceportal/management/portal_service.go b/pkg/complianceportal/management/portal_service.go index 4828ac068..73133bb01 100644 --- a/pkg/complianceportal/management/portal_service.go +++ b/pkg/complianceportal/management/portal_service.go @@ -76,7 +76,7 @@ func (utcr *UpdateRequest) Validate() error { v.Check(utcr.NonDisclosureAgreementFileID, "non_disclosure_agreement_file_id", validator.GID(coredata.FileEntityType)) if utcr.Title != nil { - v.Check(*utcr.Title, "title", validator.Required(), validator.SafeTextNoNewLine(NameMaxLength)) + v.Check(*utcr.Title, "title", validator.Required(), validator.SafeTextNoNewLine(TitleMaxLength)) } if utcr.Description != nil { diff --git a/pkg/coredata/migrations/20260721T133736Z.sql b/pkg/coredata/migrations/20260721T133736Z.sql new file mode 100644 index 000000000..02a0812fb --- /dev/null +++ b/pkg/coredata/migrations/20260721T133736Z.sql @@ -0,0 +1,23 @@ +-- Copyright (c) 2026 Probo Inc . +-- +-- Permission to use, copy, modify, and/or distribute this software for any +-- purpose with or without fee is hereby granted, provided that the above +-- copyright notice and this permission notice appear in all copies. +-- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +-- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +-- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +-- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +-- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +-- PERFORMANCE OF THIS SOFTWARE. + +-- title is the full home page heading. Rows that still store the org name as a +-- fragment (the pre-migration default) are backfilled to the English hero copy +-- the UI previously rendered via i18n ("Compliance at {{name}}."). +UPDATE trust_centers tc +SET title = 'Compliance at ' || o.name || '.', + updated_at = NOW() +FROM organizations o +WHERE tc.organization_id = o.id + AND tc.title = o.name; diff --git a/pkg/iam/organization_service.go b/pkg/iam/organization_service.go index 22e9644cf..ee18d7262 100644 --- a/pkg/iam/organization_service.go +++ b/pkg/iam/organization_service.go @@ -614,7 +614,7 @@ func (s *OrganizationService) CreateOrganization( TenantID: organization.TenantID, Active: false, Slug: slug.MakeWithEntropy(organization.Name), - Title: organization.Name, + Title: "Compliance at " + organization.Name + ".", SearchEngineIndexing: coredata.SearchEngineIndexingNotIndexable, MailingListID: &mailingList.ID, CreatedAt: now, diff --git a/pkg/probod/probod.go b/pkg/probod/probod.go index 09b58df47..52d5eb728 100644 --- a/pkg/probod/probod.go +++ b/pkg/probod/probod.go @@ -148,7 +148,7 @@ func New() *Implm { CompliancePortal: CompliancePortalConfig{ HTTPAddr: ":80", HTTPSAddr: ":443", - BaseDomain: "probopage.com", + BaseDomain: "probopage.localhost", }, AWS: AWSConfig{ Region: "us-east-1", diff --git a/pkg/server/api/complianceportal/v1/nda_resolvers.go b/pkg/server/api/complianceportal/v1/nda_resolvers.go index d36405b9f..2fba8c8dd 100644 --- a/pkg/server/api/complianceportal/v1/nda_resolvers.go +++ b/pkg/server/api/complianceportal/v1/nda_resolvers.go @@ -7,13 +7,13 @@ package complianceportal_v1 import ( "context" - "net" "time" "go.gearno.de/kit/log" "go.probo.inc/probo/pkg/coredata" "go.probo.inc/probo/pkg/esign" "go.probo.inc/probo/pkg/server/api/authn" + "go.probo.inc/probo/pkg/server/api/clientip" "go.probo.inc/probo/pkg/server/api/complianceportal" "go.probo.inc/probo/pkg/server/api/complianceportal/v1/schema" "go.probo.inc/probo/pkg/server/api/complianceportal/v1/types" @@ -28,10 +28,7 @@ func (r *mutationResolver) AcceptElectronicSignature(ctx context.Context, input compliancePortal = complianceportal.CompliancePortalFromContext(ctx) ) - signerIP, _, _ := net.SplitHostPort(httpReq.RemoteAddr) - if signerIP == "" { - signerIP = httpReq.RemoteAddr - } + signerIP := clientip.Extract(httpReq) scope := coredata.NewScopeFromObjectID(compliancePortal.ID) @@ -64,10 +61,7 @@ func (r *mutationResolver) RecordSigningEvent(ctx context.Context, input types.R compliancePortal = complianceportal.CompliancePortalFromContext(ctx) ) - actorIP, _, _ := net.SplitHostPort(httpReq.RemoteAddr) - if actorIP == "" { - actorIP = httpReq.RemoteAddr - } + actorIP := clientip.Extract(httpReq) scope := coredata.NewScopeFromObjectID(compliancePortal.ID)