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
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
Christian Krakau-Louis
e929930bae
Merge pull request #499 from christianlouis/copilot/add-subscription-management-features
...
Merge main → subscription-management-features; fix migration chain collision
2026-03-07 22:03:02 +01:00
Christian Krakau-Louis
a18245cd1d
Merge pull request #501 from christianlouis/copilot/add-push-notifications-for-signup
...
feat(notifications): admin push notifications and webhooks for user signup, plan changes, and payment issues
2026-03-07 22:02:41 +01:00
Christian Krakau-Louis
f53574dc33
Merge pull request #503 from christianlouis/copilot/add-help-forum-and-blog
...
feat(help): embed MkDocs documentation site at /help/ with How-To guides
2026-03-07 21:58:16 +01:00
copilot-swe-agent[bot]
699a93e193
chore: merge main into branch, resolve conflict in models.py
...
Both sets of UserProfile columns are retained:
- is_complimentary (from main, migration 019_add_is_complimentary)
- subscription_change_pending_tier / subscription_change_pending_date
(our branch, renamed to migration 020_add_subscription_change_pending
with down_revision updated to chain after 019_add_is_complimentary)
2026-03-07 20:53:42 +00:00
copilot-swe-agent[bot]
f9b9fb081a
chore: merge main into notifications branch
...
Resolve conflicts in app/auth.py and app/api/admin_users.py:
- auth.py: combine admin-aware profile creation (from main, adding
is_complimentary/highest-tier defaults for admins) with signup
notification/webhook (from our branch). Admin users skip the
signup notification since they are the ones being notified.
- admin_users.py: combine is_complimentary assignment (from main)
with tier_changed/new_tier tracking variables (from our branch)
to fire plan-change notifications when an admin updates a user.
2026-03-07 20:52:44 +00:00
Christian Krakau-Louis
93b4dcf641
Merge pull request #500 from christianlouis/copilot/auto-user-creation-for-admins
...
feat(auth): auto-provision admin user profiles with highest tier and complimentary flag
2026-03-07 21:45:21 +01:00
Christian Krakau-Louis
a27a0d6f01
Merge pull request #502 from christianlouis/copilot/update-plan-descriptions
...
fix(ui): rename "Business" → "Power" and rewrite plan copy for per-user pricing
2026-03-07 21:44:40 +01:00
copilot-swe-agent[bot]
46b2f17acc
feat(docs): add built-in help section with How-To guides embedded in app
...
- Add MkDocs Material docs build stage to Dockerfile and Dockerfile.local
- Mount pre-built docs as static files at /help/ in FastAPI (app/main.py)
- Add app/views/help.py with /help → /help/ permanent redirect route
- Register help router in app/views/__init__.py
- Add Help nav link to base.html (public + app nav, desktop + mobile)
- Create how-to guides: HP printer, ScanSnap, watched folder, email ingestion, mobile scanning
- Update mkdocs.yml with How-To Guides section and Material theme palette
- Add optional docs service (squidfunk/mkdocs-material) to docker-compose.yaml with docs profile
- Add mkdocs-material to requirements-dev.txt
- Add /docs_build to .gitignore
- Add tests for help view (8 tests, 100% coverage on help.py)
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 20:33:10 +00:00
copilot-swe-agent[bot]
064ba72d36
fix(ui): address code review feedback on complimentary badge and aria attributes
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 20:17:07 +00:00
copilot-swe-agent[bot]
fdc48c7fe9
feat(notifications): admin push notifications and webhooks for user signup, plan changes, and payment issues
...
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com >
2026-03-07 20:15:39 +00:00