diff --git a/backend/src/api/browser/index.js b/backend/src/api/browser/index.js index 6695aa6..3133b01 100644 --- a/backend/src/api/browser/index.js +++ b/backend/src/api/browser/index.js @@ -24,7 +24,17 @@ const browserValidation = { bucket: param('bucket') .trim() .notEmpty() - .matches(/^[a-z0-9][a-z0-9.-]*[a-z0-9]$/), + .custom((value) => { + // Reject "undefined" and "null" strings (common frontend bugs) + if (value === 'undefined' || value === 'null') { + throw new Error('Invalid bucket name'); + } + // Validate bucket name format + if (!/^[a-z0-9][a-z0-9.-]*[a-z0-9]$/.test(value)) { + throw new Error('Invalid bucket name format'); + } + return true; + }), prefix: query('prefix') .optional() diff --git a/backend/src/app.js b/backend/src/app.js index d5f0539..58cfb4d 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -159,14 +159,50 @@ app.use((req, res) => { // Error handling middleware (must be last) app.use(errorHandler); +// Initialize default MinIO alias from environment variables +async function initializeDefaultAlias() { + const { defaultAlias, endpoint, accessKey, secretKey } = config.minio; + + if (!endpoint || !accessKey || !secretKey) { + logger.info('Default MinIO connection not configured (MINIO_ENDPOINT, MINIO_ACCESS_KEY, MINIO_SECRET_KEY)'); + return; + } + + const MinIOService = require('./services/minio.service'); + const minioService = new MinIOService(); + + try { + // Check if alias already exists + const aliases = await minioService.listAliases(); + const existingAlias = aliases.find(a => a.alias === defaultAlias); + + if (existingAlias) { + logger.info(`Default alias "${defaultAlias}" already configured`); + // Test connection + const testResult = await minioService.testConnection(defaultAlias); + logger.info(`Default alias "${defaultAlias}" connection status: ${testResult.status}`); + } else { + // Create the alias + logger.info(`Creating default alias "${defaultAlias}" -> ${endpoint}`); + await minioService.addAlias(defaultAlias, endpoint, accessKey, secretKey); + logger.info(`Default alias "${defaultAlias}" created and connected successfully`); + } + } catch (error) { + logger.error(`Failed to initialize default alias: ${error.message}`); + } +} + // Start server if (require.main === module) { const PORT = config.app.port; - - app.listen(PORT, () => { + + app.listen(PORT, async () => { logger.info(`MinIO WebUI Backend running on port ${PORT}`); logger.info(`Environment: ${config.app.env}`); logger.info(`IP Restriction: ${config.security.enableIpRestriction ? 'Enabled' : 'Disabled'}`); + + // Initialize default alias after server starts + await initializeDefaultAlias(); }); } diff --git a/frontend/src/components/Policies/Policies.tsx b/frontend/src/components/Policies/Policies.tsx index 249deb8..c62450f 100644 --- a/frontend/src/components/Policies/Policies.tsx +++ b/frontend/src/components/Policies/Policies.tsx @@ -123,7 +123,7 @@ const Policies: React.FC = () => { }; const filteredPolicies = policies.filter((policy) => - policy.name.toLowerCase().includes(searchTerm.toLowerCase()) + policy?.name?.toLowerCase().includes(searchTerm.toLowerCase()) ); const isBuiltInPolicy = (policyName: string) => { diff --git a/frontend/src/components/Users/Users.tsx b/frontend/src/components/Users/Users.tsx index 3ab16d9..68c9948 100644 --- a/frontend/src/components/Users/Users.tsx +++ b/frontend/src/components/Users/Users.tsx @@ -96,7 +96,7 @@ const Users: React.FC = () => { }; const filteredUsers = users.filter((user) => - user.accessKey.toLowerCase().includes(searchTerm.toLowerCase()) + user?.accessKey?.toLowerCase().includes(searchTerm.toLowerCase()) ); if (loading) {