Commit graph

155 commits

Author SHA1 Message Date
Chris Veleris
d3961ba32d release: v1.1.0-dev.4 2026-04-13 13:26:12 +03:00
Chris Veleris
a3369d2c74 release: v1.1.0-dev.3 2026-04-13 13:08:48 +03:00
Chris Veleris
caffea977c release: v1.1.0-dev.2 2026-04-13 12:31:21 +03:00
Chris Veleris
3f3e50f23e release: v1.1.0-dev.1 2026-04-13 12:18:32 +03:00
Chris
c2e9a1aa21
feat: Add OIDC/SSO authentication support (#1008)
* feat: add OIDC/SSO database schema and models (Phase 1)

Add database foundation for OpenID Connect authentication:

Database Migrations:
- Create oidc_identities table (links users to OIDC accounts)
- Create oidc_state_nonces table (OAuth state/nonce for CSRF protection)
- Create auth_audit_log table (security event logging)
- Make password_digest nullable in users table (allow OIDC-only users)

Models:
- OIDCIdentity: Links users to external OIDC providers
- OIDCStateNonce: Temporary OAuth state management
- AuthAuditLog: Authentication event audit trail

Changes:
- Updated User model to allow null password_digest
- Added model associations in models/index.js
- All migrations tested and verified

Related to #977

* feat: add OIDC core services (Phase 2)

- Install openid-client@^6.2.0 for OIDC protocol support
- Implement providerConfig.js for loading providers from .env
  - Support single provider or numbered providers (OIDC_PROVIDER_1_*, etc.)
  - Auto-provision and admin email domain configuration
  - Provider caching for performance
- Implement stateManager.js for OAuth state/nonce management
  - CSRF protection with 10-minute TTL
  - One-time use state consumption
  - Automatic cleanup of expired states
- Implement auditService.js for authentication event logging
  - Track login success/failure, logout, OIDC linking/unlinking
  - Store IP address, user agent, and metadata
  - Support for event queries and retention cleanup
- Add comprehensive unit tests (60 tests, all passing)
  - providerConfig: 36 tests for env parsing and validation
  - stateManager: 12 tests for state lifecycle and security
  - auditService: 12 tests for event logging and queries

Phase 2 completes the backend core services needed for OIDC authentication.

* feat: implement OIDC authentication flow (Phase 3)

Core OIDC Flow (service.js):
- Provider discovery with issuer caching
- Authorization URL generation with state/nonce
- OAuth callback handling and token exchange
- ID token validation using openid-client
- Token refresh functionality

JIT User Provisioning (provisioningService.js):
- Auto-create users from OIDC claims
- Link existing email accounts to OIDC identities
- Admin role assignment based on email domain rules
- Automatic username generation from email
- Transaction-safe identity creation

Identity Management (oidcIdentityService.js):
- List user's linked OIDC identities
- Link additional providers to existing accounts
- Unlink identities with safety checks
- Prevent unlinking last auth method
- Update identity claims on login

HTTP Layer (controller.js + routes.js):
- GET /api/oidc/providers - List configured providers
- GET /api/oidc/auth/:slug - Initiate OIDC flow
- GET /api/oidc/callback/:slug - Handle OAuth callback
- POST /api/oidc/link/:slug - Link provider to current user
- DELETE /api/oidc/unlink/:id - Unlink identity
- GET /api/oidc/identities - Get user's identities

Integration:
- Register OIDC routes in Express app (public + authenticated)
- Update auth service to reject password login for OIDC-only users
- Audit logging for all OIDC operations
- Session creation on successful authentication

Security:
- State/nonce CSRF protection
- One-time use state consumption
- Transaction-safe user provisioning
- Foreign key constraints enforced

* feat: implement OIDC frontend login flow (Phase 4)

- Created OIDCProviderButtons component for SSO login options
- Created OIDCCallback component for OAuth callback handling
- Updated Login page to fetch and display OIDC providers
- Added /auth/callback/:provider route to App.tsx
- Added i18n translations for OIDC UI elements
- Downgraded openid-client to v5.7.0 (CommonJS compatibility)
- Fixed linting issues in backend OIDC modules

Phase 4 completes the frontend login flow for OIDC/SSO authentication.
Users can now see configured SSO providers on the login page.

* feat: implement OIDC account linking UI (Phase 5)

Add Connected Accounts section to Profile Security tab allowing users to:
- View linked OIDC provider accounts
- Link new SSO providers to their account
- Unlink OIDC identities with validation
- Prevent unlinking last authentication method

Backend changes:
- Add has_password virtual field to User model
- Include has_password in profile API response
- Track whether user has password set for validation

Frontend changes:
- Create oidcService for OIDC API operations
- Create ConnectedAccounts component with link/unlink flows
- Add confirmation dialog before unlinking accounts
- Validate that users cannot unlink their last auth method
- Show warning if user has no password set
- Integrate Connected Accounts into SecurityTab

User experience:
- View all linked SSO provider accounts with email and link date
- Link additional providers via "Link Provider" buttons
- Unlink with two-step confirmation to prevent accidents
- Clear error messages when unlinking would leave no auth method
- Warning message suggesting password setup for OIDC-only users

Fixes #977

* feat: complete OIDC documentation and UI improvements (Phase 6)

This commit completes Phase 6 of the OIDC/SSO implementation with comprehensive
documentation, bug fixes, and UI reorganization.

Documentation:
- Add comprehensive user guide at docs/10-oidc-sso.md with:
  - Setup guides for 6 major providers (Google, Okta, Keycloak, Authentik, PocketID, Azure AD)
  - Configuration examples for single and multiple providers
  - User features documentation (login, account linking, management)
  - Advanced topics (auto-provisioning, admin role assignment, hybrid auth)
  - Comprehensive troubleshooting section
  - Security considerations and best practices
- Update README.md with OIDC/SSO section and quick setup examples

Internationalization:
- Add i18n support to OIDCProviderButtons component
- Add translation keys for all OIDC UI text
- Update English translations with "sign_in_with" key

Bug Fixes:
- Fix oidcService.ts to correctly unwrap API responses
  - Backend returns {providers: [...]} and {identities: [...]}
  - Frontend was expecting plain arrays, causing "map is not a function" error
- Fix initiateOIDCLink to properly handle POST response

UI Improvements:
- Move OIDC/SSO to dedicated tab in profile settings
  - Create new OIDCTab component with green LinkIcon
  - Remove ConnectedAccounts from SecurityTab
  - Add OIDC tab between Security and API Keys tabs
  - Update ProfileSettings with new tab configuration
- Security tab now focuses solely on password management

Testing:
- All linting passes
- All tests pass (82 suites, 1223 tests)

Related to #977

* feat: add OIDC/SSO translations for all 24 languages

Add i18n support for OIDC/SSO features across all supported languages:
- "Sign in with {{provider}}" button text
- "OIDC/SSO" tab label in profile settings
- OIDC authentication flow messages

Translations added for: Arabic, Bulgarian, Danish, German, Greek, Spanish,
Finnish, French, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian,
Polish, Portuguese, Romanian, Russian, Slovenian, Swedish, Turkish,
Ukrainian, Vietnamese, and Chinese.

* fix: resolve 13 CodeQL security alerts

This commit addresses critical security vulnerabilities identified by CodeQL scanning:

**Security Configuration (2 fixes)**
- Fix insecure Helmet configuration - enable CSP and HSTS in production
- Fix clear text cookie transmission - enable secure cookies in production

**Path Injection (3 fixes)**
- Add path validation in users/controller.js to prevent arbitrary file deletion
- Add path validation in users/service.js for avatar operations
- Add path sanitization in attachment-utils.js deleteFileFromDisk function

**Cross-Site Scripting (1 fix)**
- Fix XSS vulnerability in GeneralTab.tsx avatar URL handling
- Add URL sanitization to prevent javascript: protocol attacks

**URL Security (2 fixes)**
- Fix double escaping in url/service.js HTML entity decoding
- Fix incomplete URL sanitization for YouTube domain validation

**Denial of Service (1 fix)**
- Add loop bound protection in inboxProcessingService.js (10k char limit)

**Rate Limiting (3 fixes)**
- Add rate limiting to auth routes (register, verify-email)
- Add rate limiting to task attachment upload/delete endpoints
- Add rate limiting to user avatar upload/delete endpoints

**GitHub Actions Security (1 fix)**
- Add explicit read-only permissions to CI workflow

Note: CSRF middleware (#10) requires frontend changes and is tracked separately.

Relates to PR #1008

* fix: allow test files in path validation for tests

* fix: format long condition in attachment-utils for Prettier compliance

Break the path validation condition across multiple lines to meet Prettier formatting requirements and fix CI linting failure.

* fix: resolve CodeQL security alerts

- Add rate limiting to OIDC authentication routes using authLimiter and authenticatedApiLimiter
- Implement CSRF protection middleware using csrf-sync (skips for API tokens and test environment)
- Add CSRF token endpoint at /api/csrf-token
- Fix incomplete URL scheme validation in GeneralTab to block all dangerous schemes (javascript:, data:, vbscript:, file:)

This addresses 5 high-severity CodeQL security vulnerabilities:
- Missing rate limiting on OIDC auth routes
- Missing CSRF middleware protection
- Incomplete URL sanitization in avatar handling

All 1223 tests passing.

* fix: implement CSRF protection with lusca for CodeQL compliance

Add CSRF protection using lusca.csrf (CodeQL's recommended library) to
protect session-based authentication while supporting hybrid auth patterns.

Implementation:
- Pre-check middleware marks exempt requests (test env, Bearer tokens)
- Lusca CSRF middleware applied with exemption flag check
- Session-based requests require valid x-csrf-token header
- Bearer token requests exempt (don't use cookies)
- Test environment exempt for test execution

This addresses CodeQL security alert js/missing-token-validation while
maintaining support for both cookie-based and token-based authentication.

Related: #977 (OIDC/SSO authentication feature)
2026-04-13 12:17:35 +03:00
dependabot[bot]
86f1bdcf1f
Bump nodemailer in the npm_and_yarn group across 1 directory (#1009)
Bumps the npm_and_yarn group with 1 update in the / directory: [nodemailer](https://github.com/nodemailer/nodemailer).


Updates `nodemailer` from 8.0.4 to 8.0.5
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v8.0.4...v8.0.5)

---
updated-dependencies:
- dependency-name: nodemailer
  dependency-version: 8.0.5
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-12 17:55:07 +03:00
dependabot[bot]
3956f2c1ca
Bump lodash in the npm_and_yarn group across 1 directory (#1010)
Bumps the npm_and_yarn group with 1 update in the / directory: [lodash](https://github.com/lodash/lodash).


Updates `lodash` from 4.17.23 to 4.18.1
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-12 17:54:53 +03:00
Chris
50eb12d7ec
fix: add missing i18next dependency to package.json (#1006)
* fix: add missing i18next dependency to package.json

The i18next package was being imported throughout the frontend code but was not explicitly declared in devDependencies. It was only installed indirectly as a peer dependency of react-i18next, which can cause issues with strict package managers like pnpm.

This fix explicitly adds i18next ^24.2.3 to devDependencies to ensure it's always installed.

Fixes #987

* chore: update package-lock.json after adding i18next dependency
2026-04-12 09:01:52 +03:00
Chris
11c3fe5e43
Fix: Resolve 20 security vulnerabilities in dependencies (#983)
* Fix critical bug causing subtasks to disappear when updating parent task

This fixes a serious bug where updating tags, priority, status, or due_date
on a parent task would inadvertently delete all its subtasks.

Root Cause:
1. Backend serializer returns `subtasks: []` when Subtasks association is not loaded
2. Frontend was spreading entire task object when updating, sending `subtasks: []`
3. Backend updateSubtasks() interpreted empty array as "delete all subtasks"

Solution:
Remove object spreading from updateTask calls. Only send the specific fields
being updated, not the entire task object.

Fixes the issue reported where assigning tags to a task caused subtasks to vanish.

Related: #TBD (GitHub issue to be created)

* fix: upgrade dependencies to resolve security vulnerabilities

- jest-environment-jsdom: 29.0.0 → 30.3.0
- nodemailer: 7.0.10 → 8.0.4
- sqlite3: 5.1.7 → 6.0.1

All npm audit vulnerabilities resolved (20 high/critical → 0).
Tests passing (1157 pass, 1 pre-existing failure unrelated to upgrades).
2026-03-28 23:37:23 +02:00
Chris Veleris
a5cfa0c6cb release: v1.0.0 2026-03-27 16:43:33 +02:00
Chris Veleris
0db21b9b7c release: v1.0.0-rc.3 2026-03-26 17:20:49 +02:00
Chris Veleris
8128180075 release: v1.0.0-rc.2 2026-03-24 18:16:06 +02:00
Chris Veleris
35aa94ae9d release: v1.0.0-rc.1 2026-03-21 19:27:37 +02:00
Chris Veleris
84d30b5230 release: v1.0.0-dev.3 2026-03-20 16:56:15 +02:00
Chris
b63f684190
feat: Add MCP Integration with client-agnostic instructions (#953) 2026-03-20 16:55:49 +02:00
Chris Veleris
2d2bc15750 release: v1.0.0-dev.2 2026-03-19 20:26:41 +02:00
Chris Veleris
471d29e495 release: v1.0.0-dev.1 2026-03-18 18:01:32 +02:00
Chris Veleris
25b11086e2 release: v0.89.0 2026-03-12 11:32:05 +02:00
Chris Veleris
6c6f2851f1 release: v0.89.0-rc.3 2026-03-10 18:44:43 +02:00
Chris Veleris
ad0f083886 release: v0.89.0-rc.2 2026-03-04 22:25:09 +02:00
Chris Veleris
47d270b242 release: v0.89.0-rc.1 2026-03-03 18:07:50 +02:00
Chris
82f7427348
Fix security vulns (#895) 2026-03-03 18:07:36 +02:00
Chris Veleris
29aad09591 release: v0.89.0-dev.1 2026-03-02 17:47:24 +02:00
Chris Veleris
ca5bd127b8 release: v0.88.5 2026-02-13 15:43:35 +02:00
Chris Veleris
457040fc65 release: v0.88.5-rc.1 2026-02-12 12:20:25 +02:00
Chris Veleris
e8fa873f73 release: v0.88.5-dev.3 2026-01-23 23:54:41 +02:00
Chris Veleris
0b11377848 release: v0.88.5-dev.2 2026-01-23 23:18:06 +02:00
Chris Veleris
f36dd1cb91 release: v0.88.5-dev.1 2026-01-22 17:18:30 +02:00
Chris Veleris
a11ec80e26 release: v0.88.4 2026-01-20 18:02:04 +02:00
Chris Veleris
015988fb5a release: v0.88.4-rc.1 2026-01-18 11:53:57 +02:00
Chris Veleris
71d53484aa release: v0.88.3 2026-01-17 08:02:47 +02:00
Chris Veleris
828f1923f8 release: v0.88.3-rc.1 2026-01-15 16:02:20 +02:00
Chris Veleris
2ae0b4a7e1 release: v0.88.3-beta.1 2026-01-14 17:43:00 +02:00
Chris Veleris
9f4d028910 release: v0.88.3-dev.5 2026-01-08 12:07:53 +02:00
Chris Veleris
9540e55753 release: v0.88.3-dev.4 2026-01-08 10:21:14 +02:00
Chris Veleris
5b806a50e4 release: v0.88.3-dev.3 2026-01-08 09:58:07 +02:00
Chris Veleris
e2c2b86281 release: v0.88.3-dev.2 2026-01-08 00:42:44 +02:00
Chris Veleris
373147b5d6 release: v0.88.3-dev.1 2026-01-07 19:09:09 +02:00
Chris Veleris
b443f73129 release: v0.88.2 2025-12-22 16:32:58 +02:00
Chris Veleris
c906c3e9b1 release: v0.88.2-dev.2 2025-12-19 11:13:50 +02:00
Chris Veleris
1e51cff18c release: v0.88.2-dev.1 2025-12-18 16:19:07 +02:00
Chris Veleris
049333148a release: v0.88.1 2025-12-17 16:05:32 +02:00
Chris Veleris
0f01773beb release: v0.88.1-rc.2 2025-12-15 14:00:02 +02:00
Chris Veleris
0295669050 release: v0.88.1-rc.1 2025-12-14 12:29:22 +02:00
Chris Veleris
826215ca01 release: v0.88.1-rc.1 2025-12-14 12:28:47 +02:00
Chris Veleris
4f4f7c9c04 release: v0.88.0 2025-12-12 19:47:57 +02:00
Chris Veleris
bd7582a59b release: v0.88.0-rc.1 2025-12-11 17:05:49 +02:00
Chris Veleris
4695ff1243 release: v0.88.0-beta.1 2025-12-10 11:43:31 +02:00
Chris Veleris
b5736abfb0 release: v0.88.0-dev.2 2025-12-09 20:28:22 +02:00
Chris Veleris
e1b3b09f72 release: v0.88.0-dev.1 2025-12-08 17:50:17 +02:00