c7d3ec57c3
Commitd2217531(google-labs-jules SSRF fix) catastrophically deleted 11,500+ lines across 100+ files while fixing an unrelated IMAP issue. Restored from d2217531^ (pre-bad-commit state): Deleted files (fully restored): - app/api/{automation,classification_rules,comments,sharing}.py - app/middleware/upload_rate_limit.py - app/tasks/{automation_tasks,classify_document}.py - app/utils/{automation_hooks,classification_rules}.py - docs/AppleAppStoreCompliance.md - frontend/input.css, package.json, package-lock.json, tailwind.config.js - frontend/static/js/{annotations,claim,comments,sharing}.js - frontend/templates/{admin_connections,file_annotations,file_summary}.html - tests/{test_api_files_comprehensive,test_auth_extended,test_sharing, test_comments,test_connections,test_imap_profiles,test_api_sessions, test_automation,test_classification_rules,test_api_advanced_filters, test_api_classification_rules,test_upload_rate_limit,test_api_dropbox, test_classify_document,test_comments_ui,test_upload_to_icloud, test_api_onedrive_comprehensive,test_frontend_build,test_sentry, test_diagnostic,test_database,test_views_dropbox,test_local_auth}.py Truncated files (content restored): - app/{auth,config,main,models,celery_worker,database}.py - app/api/{__init__,api_tokens,diagnostic,dropbox,files,google_drive, integrations,local_auth,mobile,onedrive,pipelines,qr_auth, settings,url_upload}.py - app/middleware/upload_rate_limit.py - app/tasks/upload_to_nextcloud.py - app/utils/{allowed_types,settings_service,settings_sync,user_scope,webhook}.py - app/views/{base,dropbox,files,google_drive,onedrive,settings}.py - docs/{API,AuthenticationSetup,ConfigurationGuide,DatabaseConfiguration, DeploymentGuide,DropboxSetup,GoogleDriveSetup,KubernetesDeployment, MobileApp,OneDriveSetup,ProductionReadiness,SentrySetup, SocialLoginSetup,UserGuide}.md - frontend/static/{js/upload.js,styles.css} - frontend/templates/{api_tokens,base,devices,dropbox,dropbox_callback, file_view,files,google_drive,onedrive,onedrive_callback, signup}.html - frontend/translations/en.json - migrations/env.py - tests/{conftest,test_api_integrations,test_api_mobile,test_api_settings, test_api_tokens,test_audit_logs,test_duplicates,test_imap_tasks, test_setup_wizard,test_views_files_comprehensive}.py Security fixes kept from post-d2217531 commits: - app/utils/network.py: DNS SSRF fail-secure fix (06b0fced) - app/utils/file_operations.py: path traversal fix (1018ea17) - tests/test_imap_tasks.py: re-applied 4 is_private_ip mock patches Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> Agent-Logs-Url: https://github.com/christianlouis/DocuElevate/sessions/51133dd8-9bec-41ab-aa10-3de753634187
131 lines
3.7 KiB
Python
131 lines
3.7 KiB
Python
"""Alembic environment configuration for DocuElevate.
|
||
|
||
This module configures Alembic to use the application's database URL
|
||
from ``app.config.settings`` and the SQLAlchemy ``Base.metadata`` so
|
||
that autogenerate can detect model changes.
|
||
|
||
It also supports receiving an existing connection via
|
||
``config.attributes["connection"]`` for programmatic invocation from
|
||
``app.database.init_db()``, which is essential for in-memory SQLite
|
||
databases used in testing.
|
||
"""
|
||
|
||
from logging.config import fileConfig
|
||
|
||
from alembic import context
|
||
from sqlalchemy import engine_from_config, pool
|
||
|
||
# Import application Base and models so target_metadata reflects the full schema.
|
||
from app.database import Base
|
||
|
||
# Ensure all models are imported so Base.metadata is populated.
|
||
from app.models import ( # noqa: F401
|
||
ApiToken,
|
||
ApplicationSettings,
|
||
AuditLog,
|
||
BackupRecord,
|
||
ClassificationRuleModel,
|
||
ComplianceTemplate,
|
||
DocumentAnnotation,
|
||
DocumentComment,
|
||
DocumentMetadata,
|
||
FileProcessingStep,
|
||
FileRecord,
|
||
ImapIngestionProfile,
|
||
InAppNotification,
|
||
LocalUser,
|
||
MobileDevice,
|
||
Pipeline,
|
||
PipelineRoutingRule,
|
||
PipelineStep,
|
||
ProcessingLog,
|
||
SavedSearch,
|
||
ScheduledJob,
|
||
SettingsAuditLog,
|
||
SharedLink,
|
||
SubscriptionPlan,
|
||
UserImapAccount,
|
||
UserIntegration,
|
||
UserNotificationPreference,
|
||
UserNotificationTarget,
|
||
UserProfile,
|
||
WebhookConfig,
|
||
)
|
||
|
||
# Alembic Config object – provides access to values in alembic.ini.
|
||
config = context.config
|
||
|
||
# Set up Python logging from the config file (if present).
|
||
if config.config_file_name is not None:
|
||
fileConfig(config.config_file_name)
|
||
|
||
# MetaData object for autogenerate support.
|
||
target_metadata = Base.metadata
|
||
|
||
|
||
def _get_url() -> str:
|
||
"""Return the database URL, preferring the application config."""
|
||
url = config.get_main_option("sqlalchemy.url")
|
||
if url:
|
||
return url
|
||
# Fall back to application settings
|
||
from app.config import settings
|
||
|
||
return settings.database_url
|
||
|
||
|
||
def run_migrations_offline() -> None:
|
||
"""Run migrations in 'offline' mode.
|
||
|
||
Configures the context with just a URL and not an Engine.
|
||
Calls to ``context.execute()`` emit the given string to the script output.
|
||
"""
|
||
url = _get_url()
|
||
context.configure(
|
||
url=url,
|
||
target_metadata=target_metadata,
|
||
literal_binds=True,
|
||
dialect_opts={"paramstyle": "named"},
|
||
)
|
||
|
||
with context.begin_transaction():
|
||
context.run_migrations()
|
||
|
||
|
||
def run_migrations_online() -> None:
|
||
"""Run migrations in 'online' mode.
|
||
|
||
Creates an Engine (or reuses a connection passed via
|
||
``config.attributes["connection"]``) and associates it with the context.
|
||
"""
|
||
# If a connection was passed programmatically, reuse it.
|
||
connectable = config.attributes.get("connection", None)
|
||
|
||
if connectable is not None:
|
||
# Already have a connection — run migrations directly.
|
||
context.configure(connection=connectable, target_metadata=target_metadata)
|
||
with context.begin_transaction():
|
||
context.run_migrations()
|
||
else:
|
||
# Create a new engine from configuration.
|
||
configuration = config.get_section(config.config_ini_section, {})
|
||
url = _get_url()
|
||
if url:
|
||
configuration["sqlalchemy.url"] = url
|
||
connectable = engine_from_config(
|
||
configuration,
|
||
prefix="sqlalchemy.",
|
||
poolclass=pool.NullPool,
|
||
)
|
||
|
||
with connectable.connect() as connection:
|
||
context.configure(connection=connection, target_metadata=target_metadata)
|
||
with context.begin_transaction():
|
||
context.run_migrations()
|
||
|
||
|
||
if context.is_offline_mode():
|
||
run_migrations_offline()
|
||
else:
|
||
run_migrations_online()
|