copilot-swe-agent[bot]
cfc52fd355
feat(auth): make OAuth credentials user-specific via UserIntegration records
...
Setup pages now accept an integration_id query param to save OAuth
credentials to the user's personal UserIntegration record instead
of global settings. The integrations dashboard shows an "Authorize"
button for OAuth types (Dropbox, Google Drive, OneDrive) that need
credentials.
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 18:48:11 +00:00
copilot-swe-agent[bot]
ba387b8e8b
fix(ui): correct OAuth setup page links in integrations dashboard
...
The oauthLink() function in integrations_dashboard.html returned
/dropbox, /google-drive, /onedrive which are not valid routes
(404). The actual view routes are /dropbox-setup,
/google-drive-setup, /onedrive-setup.
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 18:21:52 +00:00
Christian Krakau-Louis
f714a9ed31
Merge pull request #556 from christianlouis/copilot/feature-universal-dashboard
...
feat(ui): Universal Sources & Destinations integrations dashboard
2026-03-08 19:08:11 +01:00
Christian Krakau-Louis
58733d6450
Merge pull request #555 from christianlouis/copilot/restructure-help-page
...
feat(help): replace MkDocs redirect with user-facing Help Center + Zammad integration
2026-03-08 18:58:02 +01:00
copilot-swe-agent[bot]
351d6f3f4f
fix: update docs endpoint test and add Zammad settings metadata
...
- Update test_docs_endpoint to use new /admin/api-docs path
- Add SETTING_METADATA entries for zammad_url, zammad_chat_enabled,
zammad_chat_id, zammad_form_enabled, support_email
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 17:37:29 +00:00
copilot-swe-agent[bot]
2c652dcc3e
feat(ui): add unified Sources & Destinations integrations dashboard
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 17:34:22 +00:00
copilot-swe-agent[bot]
af3eed4040
feat(help): restructure /help as user-facing Help Center with Zammad integration
...
- Replace MkDocs redirect with a branded, SEO-optimised Help Center template
- Add sections: Quick Start, Sources, Destinations, Workflows, FAQ, Support
- Integrate optional Zammad live-chat widget and ticket form
- Add config settings: ZAMMAD_URL, ZAMMAD_CHAT_ENABLED, ZAMMAD_CHAT_ID,
ZAMMAD_FORM_ENABLED, SUPPORT_EMAIL
- Move MkDocs developer docs from /help to /developer-docs
- Move interactive API docs (Swagger/ReDoc) to /admin/api-docs and /admin/api-redoc
- Add API Docs and Developer Docs links to Admin menu (desktop + mobile)
- Update navigation Help link from /help/ to /help
- Update .env.demo with Zammad configuration examples
- Document new settings in docs/ConfigurationGuide.md
- Rewrite tests to cover new Help Center behaviour
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 17:25:34 +00:00
Christian Krakau-Louis
a7a807bb11
Merge pull request #551 from christianlouis/copilot/verify-stripe-billing-implementation
...
fix(billing): cast SQLAlchemy Column[str] to str to resolve mypy typeddict-item error
2026-03-08 18:11:58 +01:00
copilot-swe-agent[bot]
c4b4643f6e
fix(integrations): sanitize error messages and add SSRF protection for WebDAV test
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:57:27 +00:00
copilot-swe-agent[bot]
35abdb0e69
feat(integrations): add quota enforcement, connection test, and quota endpoint
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:45:41 +00:00
copilot-swe-agent[bot]
002cdf312b
fix(billing): address code review - remove duplicate mode logic, accessibility improvements, robust test assertions
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:18:53 +00:00
copilot-swe-agent[bot]
223539bebb
feat(billing): expose Stripe price IDs in plan API, add Stripe Setup Wizard and sync endpoints
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:14:42 +00:00
Christian Krakau-Louis
89378b2270
Merge pull request #553 from christianlouis/copilot/restrict-status-page-access
...
feat(status): restrict status page to admin-only, move to admin menu
2026-03-08 16:14:26 +01:00
copilot-swe-agent[bot]
feea051c4f
feat(status): restrict status page to admin-only and move to admin menu
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:10:46 +00:00
copilot-swe-agent[bot]
743627ecc2
feat(models): add UserIntegration model, encrypt IMAP passwords, add integrations API
...
- Add IntegrationDirection/IntegrationType constants and UserIntegration SQLAlchemy model
with owner_id, direction, integration_type, name, config (JSON), credentials (encrypted),
is_active, last_used_at, last_error, created_at, updated_at fields
- Fix UserImapAccount password encryption: encrypt_value() on create/update,
decrypt_value() in IMAP tasks and test-connection endpoint (backward compatible)
- Add Alembic migration 023_add_user_integrations
- Add app/api/integrations.py: CRUD + credentials endpoint with owner-scoped access
- Register integrations router in app/api/__init__.py
- Add 39 tests in tests/test_api_integrations.py covering model, CRUD, encryption
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 15:02:38 +00:00
Christian Krakau-Louis
6175489ba0
Merge pull request #543 from christianlouis/copilot/add-per-user-imap-ingestion
...
feat(imap): per-user IMAP ingestion accounts with quota enforcement
2026-03-08 15:45:25 +01:00
copilot-swe-agent[bot]
087f3c10e9
fix(auth): cache request body in CSRF middleware to prevent login failures
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 13:48:17 +00:00
copilot-swe-agent[bot]
43bcfe5653
feat(imap): add per-user IMAP ingestion accounts with quota enforcement
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 13:01:14 +00:00
Christian Krakau-Louis
6497d35d84
Merge pull request #534 from christianlouis/copilot/increase-test-coverage-watch-folder-tasks
...
test: increase watch_folder_tasks.py coverage from 37% to 98%
2026-03-08 13:26:23 +01:00
Christian Krakau-Louis
c26ecfce08
Merge pull request #535 from christianlouis/copilot/increase-test-coverage-backup-view
...
Increase test coverage for app/views/backup.py to 100%
2026-03-08 13:23:29 +01:00
Christian Krakau-Louis
06eb6e636e
Merge pull request #533 from christianlouis/copilot/increase-test-coverage-backup-tasks
...
test: increase backup_tasks.py coverage from 66% to 99.79%
2026-03-08 13:20:50 +01:00
copilot-swe-agent[bot]
3ac5a97467
test: increase watch_folder_tasks coverage from 37% to 98%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 12:19:29 +00:00
copilot-swe-agent[bot]
19b4ea4f6b
test(backup): add comprehensive unit tests for app/views/backup.py
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 12:15:39 +00:00
Christian Krakau-Louis
640662e9b2
Merge pull request #540 from christianlouis/copilot/fix-local-user-login-issue
...
fix(auth): local user login fails after password reset
2026-03-08 13:15:14 +01:00
Christian Krakau-Louis
9e9a4f9b6a
Merge pull request #536 from christianlouis/copilot/increase-test-coverage-subscription-tasks
...
test: 100% coverage for app/tasks/subscription_tasks.py
2026-03-08 13:12:31 +01:00
copilot-swe-agent[bot]
9a95d5cfd5
test: increase backup_tasks.py coverage to 99.79%
...
Add comprehensive tests covering all previously untested code paths in
app/tasks/backup_tasks.py, raising coverage from 66.39% to 99.79%.
New test classes:
- TestDumpPostgresqlBranches / TestDumpMysqlBranches: URL branches
- TestRestoreSqliteBranches: error paths and rollback scenarios
- TestRestorePostgresqlBranches / TestRestoreMysqlBranches: URL branches
- TestApplyRetentionOSError: OSError on file removal + remote record keeping
- TestPruneRemoteBackups: full pruning lifecycle
- TestDeleteRemoteCopy: S3, Dropbox, known/unknown destinations
- TestUploadRemote: all destination branches (S3, Dropbox, email, Nextcloud, WebDAV)
- TestEmailBackup: recipient error, TLS, no-auth paths
- TestCreateBackupAdditional: dump failure, remote upload, PG/MySQL failures
- TestCleanupOldBackupsTask: validates all tiers are processed
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 12:11:07 +00:00
copilot-swe-agent[bot]
86f9f5f9b1
fix(auth): activate account on password reset and fix is_active check order
...
- reset_password sets is_active=True so users with unverified accounts
can log in after using the forgot-password flow
- admin set_password also sets is_active=True for the same reason
- auth() now checks is_active before verifying the password, ensuring
inactive users always see the email-verification prompt regardless of
password correctness (avoids leaking password validity)"
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 12:07:25 +00:00
Christian Krakau-Louis
a1dcc1d2b5
Merge pull request #538 from christianlouis/copilot/increase-test-coverage-subscriptions-again
...
test: increase coverage for app/views/subscriptions.py to 100%
2026-03-08 13:05:26 +01:00
copilot-swe-agent[bot]
a580527de4
test: increase coverage for app/tasks/subscription_tasks.py to 100%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 12:05:17 +00:00
Christian Krakau-Louis
b7df2ca74b
Merge pull request #532 from christianlouis/copilot/increase-test-coverage-subscriptions
...
test(subscriptions): increase app/api/subscriptions.py coverage from 49% to 100%
2026-03-08 13:03:23 +01:00
Christian Krakau-Louis
13e8d5098c
Merge pull request #537 from christianlouis/copilot/increase-test-coverage-url-upload
...
test: increase url_upload.py coverage from 91% to 100%
2026-03-08 12:59:53 +01:00
copilot-swe-agent[bot]
e96ddc7865
test: increase coverage for app/views/subscriptions.py to 100%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:57:37 +00:00
copilot-swe-agent[bot]
cd19ac661e
test(subscriptions): add comprehensive API tests reaching 100% coverage
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:54:56 +00:00
copilot-swe-agent[bot]
afe42270bb
test: increase url_upload.py test coverage to 100%
...
Add 10 new tests in TestURLUploadCoverageGaps to cover previously
uncovered lines and branches in app/api/url_upload.py:
- Line 41: validate_url_scheme raises ValueError for non-http scheme
- Lines 65->61, 67: is_private_ip DNS path with public IP resolution
- Line 87: validate_url_safety with ftp:// scheme (direct call)
- Line 107: validate_url_safety blocks metadata.google.internal
- Line 130->135: validate_file_type with no file extension
- Line 177: sanitize_filename returning empty string defaults to 'download'
- Line 234->233: iter_content empty bytes chunks (if chunk: False branch)
- Line 285: OSError cleanup path removes existing partial file
- Line 291->293: unexpected exception before target_path assigned (stays None)
Coverage: 91.16% -> 100%
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:53:45 +00:00
Christian Krakau-Louis
660b18ee97
Merge pull request #529 from christianlouis/copilot/increase-test-coverage-pipelines
...
test: increase coverage for app/views/pipelines.py to 100%
2026-03-08 12:52:08 +01:00
Christian Krakau-Louis
1cb39ca027
Merge pull request #528 from christianlouis/copilot/increase-test-coverage-google-drive
...
test: increase app/api/google_drive.py coverage to 100%
2026-03-08 12:51:53 +01:00
Christian Krakau-Louis
8292704703
Merge pull request #531 from christianlouis/copilot/increase-test-coverage-local-auth
...
test(local_auth): increase coverage for app/utils/local_auth.py to 100%
2026-03-08 12:51:12 +01:00
copilot-swe-agent[bot]
14c9432640
test: increase app/api/google_drive.py coverage to 100%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:44:30 +00:00
copilot-swe-agent[bot]
25c31a63ff
test(local_auth): increase coverage for app/utils/local_auth.py to 100%
...
Add unit tests covering previously untested code paths:
- _smtp_send: happy path (no TLS/auth), TLS branch, login branch, DNS
resolution failure, missing email host, and sender fallback chain
- send_verification_email: verify URL and username in HTML/plain bodies
- send_password_reset_email: verify URL and username in HTML/plain bodies
- build_session_user: display_name=None fallback to username
Coverage: 55.41% -> 100%
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:41:38 +00:00
copilot-swe-agent[bot]
ade7c9a865
feat(tests): increase test coverage for app/views/onboarding.py to 100%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:41:33 +00:00
copilot-swe-agent[bot]
344d20e4e6
test: increase coverage for app/views/pipelines.py to 100%
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:41:18 +00:00
copilot-swe-agent[bot]
2d754d52ef
fix(merge): resolve conflicts with main v0.92.0 keeping path-param regression tests
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:19:22 +00:00
copilot-swe-agent[bot]
c31b72810e
fix(merge): resolve tests/test_auth.py conflict keeping all tests from both branches
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 11:11:21 +00:00
copilot-swe-agent[bot]
7db26f4a31
fix(auth): pass request as keyword arg in require_login to fix path-param endpoints
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-08 10:05:50 +00:00
Christian Krakau-Louis
bd9da65511
Merge pull request #504 from christianlouis/copilot/add-watch-folder-support
2026-03-08 10:05:10 +01:00
Christian Krakau-Louis
5e6f44e6bf
Merge pull request #507 from christianlouis/copilot/add-backup-and-restore-functionality
2026-03-08 10:04:18 +01:00
copilot-swe-agent[bot]
2dd1ca0197
feat(backup): add database backup/restore with scheduled retention and admin dashboard
...
- Add BackupRecord model for tracking backup archives
- Add migration 021_add_backup_records
- Add backup configuration settings (backup_enabled, backup_dir, backup_remote_destination, backup_remote_folder, backup_retain_hourly/daily/weekly)
- Add backup_tasks.py with create_backup, cleanup_old_backups, and helpers
- Register hourly/daily/weekly Celery beat schedules
- Add /api/admin/backup/* REST endpoints (list, create, download, restore, delete, cleanup)
- Add /admin/backup dashboard view and template
- Add backup link to admin dropdown navigation in base.html
- Add backup settings to SETTING_METADATA in settings_service.py
- Add comprehensive test suite (39 tests passing)
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 22:03:27 +00:00
copilot-swe-agent[bot]
b95f552ed2
fix(auth): prevent None==None admin credential bypass creating phantom admin user
...
When ADMIN_USERNAME/ADMIN_PASSWORD env vars are not configured, settings
values are None. Python's `None == None` evaluates to True, so any login
request omitting those form fields was authenticated as admin — creating a
phantom 'None@local.docuelevate ' profile with admin rights and business plan.
Guard the admin credential check to require both values to be truthy
(non-None, non-empty) before attempting the comparison.
Adds three regression tests covering: both None, both empty-string, and
only password None scenarios.
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 21:36:31 +00:00
copilot-swe-agent[bot]
9a9efae19e
feat(watch-folders): add cloud provider watch folders (Dropbox, Drive, OneDrive, Nextcloud, S3, WebDAV)
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 21:22:33 +00:00
copilot-swe-agent[bot]
bdb67de5cb
feat(watch-folders): add local/FTP/SFTP watch folder ingest with settings, tasks, tests, docs
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 21:06:42 +00:00