18 Commits
Author SHA1 Message Date
Paweł KędziorandGitHub 78142ead31 feat: add Polish translation (#10907)
Adds Polish translation for app

Closes #9986

Signed-off-by: Paweł Kędzior <pawel.kedzior@o2.pl>
2026-06-16 12:31:11 +07:00
FVOCIandGitHub 2d73be14f8 feat: Korean (ko) translation (#10820)
Signed-off-by: FVOCI <150913557+fvoci@users.noreply.github.com>
2026-05-05 15:38:15 +05:00
f44d88e134 feat(password): email-confirmed password setup for SSO accounts (#10649)
* feat(password): add email-confirmed password setup for SSO accounts

SSO-only accounts (Google, GitHub, OIDC) now have a secure path to add
a password credential without requiring direct session trust.

**Problem:** Previously, password setup for SSO users either required an
existing password (blocking SSO-only users entirely) or would have needed
to trust the session token alone to create a persistent credential — a
security gap where a compromised session could silently add a password.

**Solution:** Email-confirmed flow that reuses the existing recovery
infrastructure:

1. `checkHasPassword` RPC — authenticates via session token, returns
   whether the account has a password hash set (drives UI branching).
2. `requestPasswordSetup` RPC — authenticates via session token, looks up
   the account's verified email social ID, generates a recovery token
   (`restoreEmail` claim), and sends a "Password recovery" email via the
   existing mail service. No DB schema changes.
3. `PasswordRestore.svelte` (unchanged) handles the link click → calls
   the existing `restorePassword` RPC → password is set.

**UI changes** (`Password.svelte`):
- `hasPassword === false` → "Set a password" panel with description and
  "Send setup link" button
- On success → "Check your email for a link to set your password."
- On `SocialIdNotFound` → "No email address is linked to your account."
  with guidance to add one via Account Settings → Manage Identities
- `hasPassword === true` → existing "Change password" form (unchanged)

**Account client:** Added `checkHasPassword()` and
`requestPasswordSetup()` methods to `AccountClientImpl`; both registered
as platform resource functions (`login.function.CheckHasPassword` /
`login.function.RequestPasswordSetup`).

Signed-off-by: Don Kendall <dkendall@ledoweb.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* test(password): add unit tests for SSO password setup RPCs

ssoPassword.test.ts — 12 tests covering:
- checkHasPassword: returns true/false for hash+salt presence, false for
  partial state (hash-only or salt-only), error for missing account
- changePassword: rejects empty old/new passwords, rejects wrong
  oldPassword (hash mismatch)
- requestPasswordSetup: sends email when email social ID exists, returns
  SocialIdNotFound when no email is linked, handles mail service failures
  gracefully (logs error, does not rethrow)

signupTokenGuard.test.ts — added edge-case for empty-string token to
document current guard behaviour (token != null passes empty string
through; noted as a future hardening opportunity).

Signed-off-by: Don Kendall <dkendall@ledoweb.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* chore(dev): add dev-local webpack proxy for local Docker compose stack

Adds a `dev-local` CLIENT_TYPE that proxies webpack dev server requests
to a local Docker compose stack (nginx at localhost:8088), following the
same pattern as the existing `dev-server`, `dev-huly`, etc. modes.

Useful for developing frontend changes against a fully running local
backend without needing `huly.local` DNS configuration.

Signed-off-by: Don Kendall <dkendall@ledoweb.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* feat(email): redesign transactional emails with proper HTML and dedicated password setup template

All account service email templates were bare <p> tags with no styling,
branding, or call-to-action buttons. Replaced with production-quality
HTML emails using email-safe table layout and inline CSS.

Design: Huly wordmark on dark (#18181B) header, white card body, dark
CTA button, subtle border, system font stack. Plain-text versions
updated to match for clients that prefer text.

Templates improved:
- RecoveryHTML/Text — password reset flow
- ConfirmationHTML/Text — email verification on signup
- InviteHTML/Text — workspace invitation
- ResendInviteHTML/Text — re-invitation
- OtpHTML/Text — sign-in code with large monospace code display

New dedicated template for SSO password setup (PasswordSetupHTML/Text/
Subject) so the setup email has copy distinct from forgot-password
recovery. requestPasswordSetup now uses these instead of RecoveryHTML.
Subject: "Set a password for your Huly account".

Other language files updated with the new PasswordSetup* keys
(English copy as fallback — translations can follow separately).

Signed-off-by: Don Kendall <dkendall@ledoweb.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix(password): guard requestPasswordSetup against accounts with existing password

Add server-side check that rejects requestPasswordSetup calls from accounts
that already have a password hash+salt. The setup flow bypasses the
old-password requirement in changePassword, so it must be restricted to
SSO-only accounts. The UI already guards this branch but defence-in-depth
requires the server to enforce it independently.

Also adds JSDoc to requestPasswordSetup and extends unit test coverage:
- TokenError path for checkHasPassword (invalid/expired token)
- BadRequest guard for requestPasswordSetup on password-bearing accounts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: add missing locale keys and fix eslint/formatting for CI

- Add 5 missing SSO password translation keys to all non-en locale files
  (SetPassword, SSOPasswordDescription, SendSetupLink, SSOPasswordEmailSent,
  SSONoEmailLinked) to fix locale parity test
- Replace non-null assertions with type casts in ssoPassword.test.ts
  to fix @typescript-eslint/no-non-null-assertion errors
- Revert unrelated tracker/github cosmetic changes that triggered
  pre-existing eslint errors in those packages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: address review — remove dev/prod changes, translate PasswordSetup strings

- Revert dev/prod/webpack.config.js and package.json (per BykhovDenis)
- Translate PasswordSetupText and PasswordSetupSubject for all 10 locales
  (cs, de, es, fr, it, pt-br, pt, ru, tr, zh)
- PasswordSetupHTML stays in English (reviewer approved)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>

---------

Signed-off-by: Don Kendall <dkendall@ledoweb.com>
Signed-off-by: Don Kendall <kendall@donkendall.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 03:53:18 +05:00
Artyom SavchenkoandGitHub 38ce824a00 Fix Brazilian Portuguese translation (#10522)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-18 21:26:13 +07:00
Artyom SavchenkoandGitHub 40fda7b337 feat: Brazilian Portuguese translation (#10478)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-07 17:33:11 +05:00
Üzeyir İsmail BahtiyarandGitHub fe6d015eb2 feat: Add complete Turkish (tr) language support to Huly Platform (#9975)
Signed-off-by: Uzeyir Ismail Bahtiyar <uzeyirismailbahtiyar@gmail.com>
2025-09-30 11:52:44 +07:00
GiorgioandGitHub 01677b2039 German Translation (#7634) 2025-01-11 01:29:47 +07:00
Dakshesh JainandGitHub 6c9cb78493 feat: resend invitation to kicked employee (#7472)
Signed-off-by: Dakshesh Jain <dakshesh.jain14@gmail.com>
2024-12-20 16:39:02 +07:00
13e1d03b9c Czech localization (#7204)
Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
Signed-off-by: Sekyra <sekyra@flexcon.cz>
Co-authored-by: Kristina <kristin.fefelova@gmail.com>
2024-11-21 12:35:16 +07:00
lona91andGitHub 70af2321f7 Italian translation (#7085)
Signed-off-by: lona91 <lona2303@gmail.com>
2024-11-04 15:39:54 +05:00
KristinaandGitHub 8ec7c0ba89 Add login and signup by code (#6097)
Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
2024-07-30 14:12:18 +07:00
ahmedsabieandGitHub 6295b1fb42 Fix English wording in account page (#5907)
Signed-off-by: ahmedsabie <ahmed13579@gmail.com>
2024-06-25 13:11:35 +07:00
Julien LELANDAISandGitHub bb70f5123b Add French Language (#5870)
Signed-off-by: cryptulien <julien.lelandais@aloe-corp.com>
2024-06-20 18:43:24 +04:00
ec655fd28a Add Support for Chinese Language (#5859)
Signed-off-by: dingdayu <dingxiaoyu.ddy@gmail.com>
Co-authored-by: dingdayu <dingxiaoyu.ddy@gmail.com>
2024-06-19 18:01:49 +07:00
Denis BykhovandGitHub 7eb795f9b8 Fix guest settings (#5597)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2024-05-14 23:06:57 +07:00
Andrey SobolevandGitHub 1967e8e5dc Enable and fix pt and es languages (#4792)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2024-02-27 22:53:16 +06:00
Tiago CruzandGitHub 336732948d Translations to Spanish & Portuguese (#4788)
Signed-off-by: Tiago Cruz <tcruz@netic.io>
2024-02-27 22:37:02 +07:00
Denis BykhovandGitHub b9ca358051 UBERF-4845 (#4309)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2024-01-06 23:43:57 +07:00