9cce0c8e5e
Replace the standalone /platform/system/* routes with a single
"系统设置" section inside the canonical Settings modal. The previous
SystemLayout.vue / SystemAdmins.vue surfaces are removed and their
functionality (system admin roster, global settings) is hosted directly
in SystemSettings.vue under the standard `.section-header` /
`.settings-group` skeleton. Legacy URLs redirect to the modal section
so external bookmarks don't 404.
Backend:
- SystemSettingService.Reset + repo.Delete: drop the DB override for a
key so the 3-tier resolver falls back to ENV / built-in default.
Idempotent (resetting a never-persisted key returns nil); emits an
audit row only on real deletions, invalidates the local cache, and
publishes to peers via the existing pubsub channel.
- TenantService.BulkSetStorageQuota: overwrite every tenant's
storage_quota in one statement. Powers POST /system/admin/tenants/
apply-default-storage-quota; bypasses the per-tenant whitelist on
PUT /tenants/:id which intentionally forbids storage_quota edits.
- AuditAction{SystemAdminPromoted,SystemAdminRevoked} constants and
emitAdminAudit() in SystemHandler — promote / revoke now leave an
audit trail with TenantID=0 and {target_email,target_username,
idempotent|changed} in details.
- SystemSetting.LastModifiedByName: derived per-request display label
(username, email fallback) so the UI shows "wizardchen" instead of
a UUID prefix without storing a denormalised column.
Frontend:
- SystemSettings.vue rewritten against the Settings modal skeleton with
auto-persisting controls (switch/select @change, input/inputnumber
@blur, tag-input + per-delta popconfirm for SSRF whitelist and admin
roster). auth.registration_mode change goes through an inline
popconfirm; cancel rolls back. Reset / bulk-apply also inline
popconfirms — no dialog modal for these per-row affordances.
- Priority hint panel surfaces the DB > ENV > default resolver order
so operators can reason about "I set the env but it doesn't show up".
- Router: /platform/system, /platform/system/settings, /platform/system/
admins are now compatibility redirects to /platform/settings?section=
system-global.
- Settings modal sized 900x700 → 1080x780 and content-wrapper 600 → 760
so the wider tables (members, system settings) breathe; <1100px
viewport still flexes to the screen.
- i18n: system.globalSettings.* keys for title / description / loading /
empty / badges / priority hint / per-key labels / reset / bulkApply /
admins (label, placeholder, save messages, popconfirm copy) across
zh-CN, en-US, ko-KR, ru-RU.
Misc:
- internal/utils/filesize.go doc: clarify MAX_FILE_SIZE_MB is a
deploy-time-only knob (nginx + docreader + frontend each cache the
env at startup); a SystemAdmin UI override would mislead operators
because nginx would still 413. Until all four layers can hot-reload
the limit in lockstep, this stays env-only.
- internal/utils/security.go: SSRF whitelist parser/runtime now drives
off SystemSettingService for live updates; ENV remains the fallback
for never-overridden deployments.
43 lines
1.5 KiB
Go
43 lines
1.5 KiB
Go
package utils
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// GetMaxFileSize returns the maximum file upload size in bytes.
|
|
// Default is 50MB, can be configured via MAX_FILE_SIZE_MB environment variable.
|
|
//
|
|
// MAX_FILE_SIZE_MB is intentionally a deploy-time-only knob (NOT a
|
|
// runtime system_setting). The effective upload limit is gated by
|
|
// three other layers that all read this env at startup and cache the
|
|
// value:
|
|
// - frontend nginx client_max_body_size (envsubst into nginx.conf)
|
|
// - docreader gRPC max_send/recv_message_length
|
|
// - frontend client-side check via window.__RUNTIME_CONFIG__
|
|
//
|
|
// Surfacing a SystemAdmin UI knob whose effect is silently capped by
|
|
// any of the above would mislead operators ("I raised it to 200MB but
|
|
// nginx still returns 413"). Until all four layers can be reconfigured
|
|
// in lockstep without container restarts, every call site must read
|
|
// the env directly via this helper.
|
|
func GetMaxFileSize() int64 {
|
|
if sizeStr := os.Getenv("MAX_FILE_SIZE_MB"); sizeStr != "" {
|
|
if size, err := strconv.ParseInt(sizeStr, 10, 64); err == nil && size > 0 {
|
|
return size * 1024 * 1024
|
|
}
|
|
}
|
|
return 50 * 1024 * 1024 // default 50MB
|
|
}
|
|
|
|
// GetMaxFileSizeMB returns the maximum file upload size in MB. Same
|
|
// caveat as GetMaxFileSize — handlers should prefer SystemSettingService.GetInt.
|
|
func GetMaxFileSizeMB() int64 {
|
|
if sizeStr := os.Getenv("MAX_FILE_SIZE_MB"); sizeStr != "" {
|
|
if size, err := strconv.ParseInt(sizeStr, 10, 64); err == nil && size > 0 {
|
|
return size
|
|
}
|
|
}
|
|
return 50 // default 50MB
|
|
}
|