Commit Graph
338 Commits
Author SHA1 Message Date
Artyom SavchenkoandGitHub f78df72be5 Rename owners to members in workspace settings (#10729)
* Renamw owners to members in workspace settings

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Try to fix tests

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix formatting

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-09 14:14:19 +07:00
Artyom SavchenkoandGitHub 051d5b370c Update guests icon (#10733)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-07 13:22:55 +07:00
Artyom SavchenkoandGitHub d0b27dce72 feat: Anonymous guest permissions (#10726)
* Anonymous guest permissions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix channels dropdown

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update guest layout

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-06 23:29:11 +07:00
Denis BykhovandGitHub 2bc968295d Add automationOnly flag to associations and restrict manual management in UI (#10730)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-04-06 21:32:07 +07:00
Artyom SavchenkoandGitHub ea254970c0 feat: Add ability to configure guest permissions (#10708)
* Configure guest permissions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix permission domain

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix permission declaration

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix lock file

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Guest permissions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Allow guests to update their own documents

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add modules order

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix translations, icons

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix disabled apps and update translations

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-04-05 14:36:59 +07:00
Artyom SavchenkoandGitHub efe3d7200a Update employee role on account role change (#10709)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-31 20:21:27 +07:00
Denis BykhovandGitHub 4ef554b9d2 Two-Factor Authentication (2FA) (#10658)
* Two-Factor Authentication (2FA)

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix test

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix test

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix tests

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* More test fixes

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

* Fix tests

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>

---------

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-03-21 14:36:32 +07: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 195d7dbff2 Reuse default invite settings in link generation (#10651)
* Reuse default invite settings in link generation

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Clean up

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Capability check

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix warning

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-19 14:35:06 +07:00
Denis BykhovandGitHub 662fe5265a Reset id (#10643)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-03-16 21:31:08 +07:00
Artyom SavchenkoandGitHub f94d564ec6 Support default invite setting in branding (#10591)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-03-05 15:19:43 +07:00
Artyom SavchenkoandGitHub d7a0fa8309 Do not allow kick last owner (#10559)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-26 14:55:17 +05:00
Artyom SavchenkoandGitHub 48a28a0b81 Configure who should be able to send invitation link (#10555)
* Configure who should be able to send invitation link

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add user role select

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Limit default user roles

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-02-25 19:42:11 +07:00
Artyom SavchenkoandGitHub d66209626c Fix social id search (#10379)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2026-01-09 12:54:43 +07:00
Denis BykhovandGitHub c75c077e95 show boolean attributes in card title (#10354)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-01-04 22:19:18 +05:00
Denis BykhovandGitHub 6b9e2b1e81 331 minor fixes (#10351)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-01-03 17:44:27 +05:00
Denis BykhovandGitHub c91a19cae8 Improve custom employee ref (#10349)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-01-03 01:08:01 +05:00
Denis BykhovandGitHub 4eec6ea2d2 Show version as column (#10344)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2026-01-02 03:05:16 +05:00
Denis BykhovandGitHub 9bb0d35de5 Card versioning (#10336)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-29 19:04:38 +05:00
Denis BykhovandGitHub 33bb180505 Ability to show ids in title (#10318)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-19 20:26:53 +05:00
Denis BykhovandGitHub b49722b6bf RBAC per class (#10314)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-18 21:10:29 +05:00
a5af7fdd6a Configure permissions to import documents (#10310)
* fix: redesign and compact

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: comments

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: correctly dropping connections in timeout

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* feature: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix: loglevel in config

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* features lopt: direct personal messages between websockets by username

Signed-off-by: Leonid Kaganov <lleo@lleo.me>

* fix collaborator security query

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>

* Fix svelte warnings

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Change log

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add export permissions

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add workspace permissions enum

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Add changelog

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update account enum

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Leonid Kaganov <lleo@lleo.me>
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Co-authored-by: Leonid Kaganov <lleo@lleo.me>
Co-authored-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-12-18 22:22:58 +07:00
Artyom SavchenkoandGitHub c59a122649 Add default settings for meeting rooms (#10293)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-12-12 12:00:12 +05:00
Artyom SavchenkoandGitHub 479b6972bb QFIX: Hide huly-mail integration (#10291)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-12-11 16:49:56 +07:00
Denis BykhovandGitHub a4055d8a0e Password aging fix (#10287)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-10 19:03:45 +05:00
Denis BykhovandGitHub 020bfc3855 Improve attribute permissions presenter (#10272)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-12-03 22:03:08 +07:00
Denis BykhovandGitHub 2c2a217b1e Improve cards permissions (#10260)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-11-29 13:19:46 +07:00
Andrey SobolevandGitHub fb49e27c22 Allow to ignore features for an installation (#10234)
* Feat: Allow to disable any plugin and few extra stuff

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>

* Remove redundant logging

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>

* Update desktop to also filter features

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>

---------

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2025-11-28 12:26:10 +07:00
Denis Bykhov 210d70cf55 Fix formatting
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-11-27 00:50:38 +05:00
Denis Bykhov d5d5b4028f Add password aging
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-11-27 00:01:53 +05:00
Denis BykhovandGitHub d06b92ebdd card RBAC (#10197)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-11-10 14:41:05 +07:00
Artyom SavchenkoandGitHub 9476b22c33 Fix double submenu in settings (#10196)
Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-11-07 14:28:57 +07:00
Andrey SobolevandGitHub 5862026002 Fix imports (#10194)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2025-11-07 12:22:33 +07:00
Denis BykhovandGitHub b18812bcc4 Custom field order (#10158) 2025-10-28 08:20:33 +07:00
Andrey SobolevandGitHub ffd8d90378 Support for rating system (#10124)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2025-10-24 10:10:01 +07:00
Denis BykhovandGitHub 521bfc585a Number and boolean default values (#10131) 2025-10-23 09:02:59 +07:00
Denis BykhovandGitHub 7f130e3987 ID type (#10126)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-10-22 22:44:21 +05:00
Alexander OnnikovandGitHub 092f5965fc fix: restructure workspace general settings (#10120)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-10-21 20:49:53 +07:00
Artyom SavchenkoandGitHub 5182f6b310 Support telegram reconnect (#10039)
* Support telegram reconnect

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix integration enable

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix refresh

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Update lock

Signed-off-by: Artem Savchenko <armisav@gmail.com>

* Fix version mismatch

Signed-off-by: Artem Savchenko <armisav@gmail.com>

---------

Signed-off-by: Artem Savchenko <armisav@gmail.com>
2025-10-13 15:24:14 +07:00
Andrey SobolevandGitHub aa7829bb93 Update deps oct 11 (#10069)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2025-10-12 08:55:50 +07:00
Alexander OnnikovandGitHub a58a6dd3f6 qfix: log window reload reason (#10033)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-10-06 22:41:13 +07:00
Alexander OnnikovandGitHub bb8dfc8130 qfix: do not allow to disable contacts plugin (#10025)
Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
2025-10-06 03:11:59 +05:00
Alexey ZinovievandGitHub edc2378845 UBERF-13844,13845: Edit card type UI improvements (#10009)
Signed-off-by: Alexey Zinoviev <alexey.zinoviev@xored.com>
2025-10-02 23:03:31 +04:00
Andrey SobolevandGitHub 2b39a954a0 Use our analytics service properly (#9985)
Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
2025-10-01 12:30:23 +07:00
Anton AlexeyevandGitHub 764d963885 Backport plugin permissions in the workspace (#9966)
* Apply patch

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>

* Fix merge errors

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>

* Fix drive header

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>

* Fix formatting

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>

* Fix tests

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>

---------

Signed-off-by: Anton Alexeyev <alexeyev.anton@gmail.com>
2025-09-30 09:55:39 +07:00
Denis BykhovandGitHub 1a0496c743 Add min and max value support for number inputs (#9916) 2025-09-23 14:44:20 +07:00
Denis BykhovandGitHub 59d262d24d Automatically select enum after creation (#9915) 2025-09-23 08:12:19 +07:00
Alexey ZinovievandGitHub 550f1a59a5 UBERF-13692: Adjut merge contacts to global accounts (#9911) 2025-09-22 22:25:09 +07:00
Denis BykhovandGitHub 601d4a3102 Disable email mask (#9862)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-09-15 21:05:58 +05:00
Denis BykhovandGitHub 65396e9de6 Fix role selection logic in Owners component (#9850)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
2025-09-15 11:43:24 +05:00