From cfd83aedc4155b5d76f201fdfcf907a4fa11d170 Mon Sep 17 00:00:00 2001 From: jpmvaz Date: Sun, 13 Sep 2026 20:17:19 +0100 Subject: [PATCH] v_1.5 --- .dockerignore | 8 + OLD_VERSIONS/v1.2/Martinhal_Contact_Site.zip | Bin 0 -> 17479 bytes .../Martinhal_Contact_Site_v1.3_update.zip | Bin 0 -> 17893 bytes .../Martinhal_Contact_Site_v1.4_update.zip | Bin 0 -> 18744 bytes .../Martinhal_Contact_Site_v1.5_update.zip | Bin 0 -> 19416 bytes Readme.md | 227 ++++++ docker-compose.yml | 16 + dockerfile | 23 + index.html | 668 ++++++++++++++++++ package.json | 14 + server.js | 392 ++++++++++ 11 files changed, 1348 insertions(+) create mode 100644 .dockerignore create mode 100644 OLD_VERSIONS/v1.2/Martinhal_Contact_Site.zip create mode 100644 OLD_VERSIONS/v1.3/Martinhal_Contact_Site_v1.3_update.zip create mode 100644 OLD_VERSIONS/v1.4/Martinhal_Contact_Site_v1.4_update.zip create mode 100644 OLD_VERSIONS/v1.5/Martinhal_Contact_Site_v1.5_update.zip create mode 100644 Readme.md create mode 100644 docker-compose.yml create mode 100644 dockerfile create mode 100644 index.html create mode 100644 package.json create mode 100644 server.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..615380d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +npm-debug.log +.git +.gitignore +README.md +.env +.DS_Store +backup_*.json \ No newline at end of file diff --git a/OLD_VERSIONS/v1.2/Martinhal_Contact_Site.zip b/OLD_VERSIONS/v1.2/Martinhal_Contact_Site.zip new file mode 100644 index 0000000000000000000000000000000000000000..63fc2e3bda776346d587ed95a98d52fd6de01d76 GIT binary patch literal 17479 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 P^Fjgv0Kgac$Jze^hGJvE literal 0 HcmV?d00001 diff --git a/OLD_VERSIONS/v1.3/Martinhal_Contact_Site_v1.3_update.zip b/OLD_VERSIONS/v1.3/Martinhal_Contact_Site_v1.3_update.zip new file mode 100644 index 0000000000000000000000000000000000000000..f2278aefdd20a6bf49944aed52ae7c9d3cc2e75d GIT binary patch literal 17893 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 literal 0 HcmV?d00001 diff --git a/OLD_VERSIONS/v1.4/Martinhal_Contact_Site_v1.4_update.zip b/OLD_VERSIONS/v1.4/Martinhal_Contact_Site_v1.4_update.zip new file mode 100644 index 0000000000000000000000000000000000000000..f3411b9a79043baeb0ba57122c0b02b0ce524415 GIT binary patch literal 18744 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

+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..de18957 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "martinhal-contacts", + "version": "1.5.0", + "description": "Martinhal Contact Management System", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "qrcode": "^1.5.3" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..01c8de4 --- /dev/null +++ b/server.js @@ -0,0 +1,392 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const cors = require('cors'); +const crypto = require('crypto'); +const QRCode = require('qrcode'); + +const app = express(); +const PORT = 8000; + +// Middleware +app.use(cors()); +app.use(express.json({ limit: '50mb' })); // Increased limit for base64 images/avatars + +// SECURITY: never let the static handler expose the auth store (contains +// password hashes and MFA secrets). Must come BEFORE express.static. +app.use((req, res, next) => { + if (/users_data\.json/i.test(req.path)) return res.status(404).end(); + next(); +}); +app.use(express.static(__dirname)); // Serve static files from current directory + +const DATA_FILE = path.join(__dirname, 'contacts_data.json'); +const USERS_FILE = path.join(__dirname, 'users_data.json'); + +// Initialize contacts data file if it doesn't exist +if (!fs.existsSync(DATA_FILE)) { + const initialData = { + contacts: [ + { id: 1, name: 'John Smith', unit: 'Marketing', phone: '+351 123 456 789', mobile: '+351 987 654 321', email: 'john.smith@company.com', department: 'IT', locations: ['Martinhal Oriente'], photo: 'https://i.pravatar.cc/150?img=12' }, + { id: 2, name: 'Maria Santos', unit: 'Finance', phone: '+351 123 456 790', mobile: '+351 987 654 322', email: 'maria.santos@company.com', department: 'Accounting', locations: ['Martinhal Lisbon', 'Martinhal Quinta'], photo: 'https://i.pravatar.cc/150?img=5' }, + { id: 3, name: 'Pedro Costa', unit: 'Operations', phone: '+351 123 456 791', mobile: '+351 987 654 323', email: 'pedro.costa@company.com', department: 'Maintenance', locations: ['Martinhal Sagres'], photo: 'https://i.pravatar.cc/150?img=33' } + ], + departments: ['IT', 'Accounting', 'Board', 'Housekeeping', 'Maintenance'], + locations: ['Martinhal Oriente', 'Martinhal Lisbon', 'Martinhal Quinta', 'Martinhal Sagres'] + }; + fs.writeFileSync(DATA_FILE, JSON.stringify(initialData, null, 2)); + console.log('Created initial data file:', DATA_FILE); +} + +// Initialize (empty) users store if it doesn't exist -> triggers first-run setup +if (!fs.existsSync(USERS_FILE)) { + fs.writeFileSync(USERS_FILE, JSON.stringify({ users: [] }, null, 2)); + console.log('Created empty users store:', USERS_FILE); +} + +// --------------------------------------------------------------------------- +// Auth helpers +// --------------------------------------------------------------------------- + +function loadUsers() { + try { return JSON.parse(fs.readFileSync(USERS_FILE, 'utf8')); } + catch (e) { return { users: [] }; } +} +function saveUsers(d) { + fs.writeFileSync(USERS_FILE, JSON.stringify(d, null, 2)); +} + +// Password hashing (scrypt + random salt, constant-time compare) +function hashPassword(pw) { + const salt = crypto.randomBytes(16).toString('hex'); + const hash = crypto.scryptSync(String(pw), salt, 64).toString('hex'); + return { salt, hash }; +} +function verifyPassword(pw, salt, hash) { + try { + const h = crypto.scryptSync(String(pw), salt, 64).toString('hex'); + const a = Buffer.from(h, 'hex'); + const b = Buffer.from(hash, 'hex'); + return a.length === b.length && crypto.timingSafeEqual(a, b); + } catch (e) { return false; } +} + +// --- TOTP (RFC 6238) implemented with built-in crypto, no extra deps --- +const B32 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; +function base32Encode(buf) { + let bits = 0, value = 0, out = ''; + for (let i = 0; i < buf.length; i++) { + value = (value << 8) | buf[i]; bits += 8; + while (bits >= 5) { out += B32[(value >>> (bits - 5)) & 31]; bits -= 5; } + } + if (bits > 0) out += B32[(value << (5 - bits)) & 31]; + return out; +} +function base32Decode(str) { + str = String(str).replace(/=+$/, '').toUpperCase().replace(/\s/g, ''); + let bits = 0, value = 0; const out = []; + for (const ch of str) { + const idx = B32.indexOf(ch); + if (idx < 0) continue; + value = (value << 5) | idx; bits += 5; + if (bits >= 8) { out.push((value >>> (bits - 8)) & 0xff); bits -= 8; } + } + return Buffer.from(out); +} +function genTotpSecret() { return base32Encode(crypto.randomBytes(20)); } +function hotp(secretB32, counter) { + const key = base32Decode(secretB32); + const buf = Buffer.alloc(8); + for (let i = 7; i >= 0; i--) { buf[i] = counter & 0xff; counter = Math.floor(counter / 256); } + const hmac = crypto.createHmac('sha1', key).update(buf).digest(); + const offset = hmac[hmac.length - 1] & 0xf; + const code = ((hmac[offset] & 0x7f) << 24) | ((hmac[offset + 1] & 0xff) << 16) | + ((hmac[offset + 2] & 0xff) << 8) | (hmac[offset + 3] & 0xff); + return (code % 1000000).toString().padStart(6, '0'); +} +function verifyTotp(secretB32, token, window = 1) { + if (!token) return false; + token = String(token).replace(/\s/g, ''); + const counter = Math.floor(Date.now() / 1000 / 30); + for (let e = -window; e <= window; e++) { + if (hotp(secretB32, counter + e) === token) return true; + } + return false; +} +function otpauthUrl(username, secret) { + const issuer = 'Martinhal Contacts'; + return 'otpauth://totp/' + encodeURIComponent(issuer) + ':' + encodeURIComponent(username) + + '?secret=' + secret + '&issuer=' + encodeURIComponent(issuer) + '&algorithm=SHA1&digits=6&period=30'; +} + +// Sessions (in-memory; users re-login after a server restart) +const sessions = new Map(); // token -> username +function issueToken(username) { + const t = crypto.randomBytes(24).toString('hex'); + sessions.set(t, username); + return t; +} +function currentUser(req) { + const h = req.headers.authorization || ''; + const t = h.startsWith('Bearer ') ? h.slice(7) : null; + if (!t || !sessions.has(t)) return null; + const uname = sessions.get(t); + const d = loadUsers(); + return d.users.find(u => u.username === uname) || null; +} +function requireAuth(req, res, next) { + const u = currentUser(req); + if (!u) return res.status(401).json({ error: 'Not authenticated' }); + req.user = u; + next(); +} +function requireAdmin(req, res, next) { + const u = currentUser(req); + if (!u) return res.status(401).json({ error: 'Not authenticated' }); + if (!u.isAdmin) return res.status(403).json({ error: 'Administrator privileges required' }); + req.user = u; + next(); +} +function safeProfile(u) { + return { + username: u.username, + displayName: u.displayName || u.username, + avatar: u.avatar || '', + mfaEnabled: !!u.mfaEnabled, + isAdmin: !!u.isAdmin + }; +} + +// --------------------------------------------------------------------------- +// Auth routes +// --------------------------------------------------------------------------- + +// Is initial setup done? (any user exists) +app.get('/api/auth/status', (req, res) => { + const d = loadUsers(); + res.json({ setupComplete: d.users.length > 0 }); +}); + +// First-run setup: create the very first admin (only when no users exist). +// MFA is optional, so we don't force enrollment — we just sign them in. +app.post('/api/auth/setup', (req, res) => { + const d = loadUsers(); + if (d.users.length > 0) return res.status(403).json({ error: 'Setup already completed' }); + const { username, password, displayName } = req.body || {}; + if (!username || !password) return res.status(400).json({ error: 'Username and password required' }); + if (String(password).length < 8) return res.status(400).json({ error: 'Password must be at least 8 characters' }); + const { salt, hash } = hashPassword(password); + const user = { + username: String(username).trim(), + salt, hash, + mfaSecret: '', // generated only if/when the user enables MFA + mfaEnabled: false, + displayName: (displayName || '').trim() || String(username).trim(), + avatar: '', + isAdmin: true, + createdAt: new Date().toISOString() + }; + d.users.push(user); + saveUsers(d); + res.json({ status: 'ok', token: issueToken(user.username), profile: safeProfile(user) }); +}); + +// Login. MFA is OPTIONAL: a code is only required for users who have +// chosen to enable it. Everyone else logs in with username + password. +app.post('/api/auth/login', (req, res) => { + const { username, password, code } = req.body || {}; + const d = loadUsers(); + const u = d.users.find(x => x.username === String(username || '').trim()); + if (!u || !verifyPassword(password, u.salt, u.hash)) { + return res.status(401).json({ error: 'Invalid username or password' }); + } + + // Only enforce a second factor if this account has MFA switched on. + if (u.mfaEnabled) { + if (!code) return res.json({ status: 'mfa' }); + if (!verifyTotp(u.mfaSecret, code)) return res.status(401).json({ status: 'mfa', error: 'Invalid code' }); + } + + return res.json({ status: 'ok', token: issueToken(u.username), profile: safeProfile(u) }); +}); + +app.post('/api/auth/logout', (req, res) => { + const h = req.headers.authorization || ''; + const t = h.startsWith('Bearer ') ? h.slice(7) : null; + if (t) sessions.delete(t); + res.json({ success: true }); +}); + +// Current profile (session restore) +app.get('/api/auth/me', requireAuth, (req, res) => { + res.json({ profile: safeProfile(req.user) }); +}); + +// Update own profile (avatar / display name) +app.post('/api/auth/profile', requireAuth, (req, res) => { + const d = loadUsers(); + const u = d.users.find(x => x.username === req.user.username); + if (!u) return res.status(404).json({ error: 'User not found' }); + if (typeof req.body.displayName === 'string') u.displayName = req.body.displayName.trim() || u.username; + if (typeof req.body.avatar === 'string') u.avatar = req.body.avatar; // '' clears it + saveUsers(d); + res.json({ profile: safeProfile(u) }); +}); + +// --- Optional MFA management (per-user, opt-in) --- + +// Begin enabling MFA: generate a fresh secret + QR. Does NOT enable it yet. +app.post('/api/auth/mfa/setup', requireAuth, (req, res) => { + const d = loadUsers(); + const u = d.users.find(x => x.username === req.user.username); + if (!u) return res.status(404).json({ error: 'User not found' }); + u.mfaSecret = genTotpSecret(); + u.mfaEnabled = false; + saveUsers(d); + const url = otpauthUrl(u.username, u.mfaSecret); + QRCode.toDataURL(url, (err, qr) => { + res.json({ otpauthUrl: url, qrDataUrl: err ? '' : qr, secret: u.mfaSecret }); + }); +}); + +// Confirm a code and switch MFA on for this account. +app.post('/api/auth/mfa/enable', requireAuth, (req, res) => { + const { code } = req.body || {}; + const d = loadUsers(); + const u = d.users.find(x => x.username === req.user.username); + if (!u) return res.status(404).json({ error: 'User not found' }); + if (!u.mfaSecret) return res.status(400).json({ error: 'Start MFA setup first' }); + if (!verifyTotp(u.mfaSecret, code)) return res.status(400).json({ error: 'Invalid code, try again' }); + u.mfaEnabled = true; + saveUsers(d); + res.json({ profile: safeProfile(u) }); +}); + +// Turn MFA back off (user is already authenticated). +app.post('/api/auth/mfa/disable', requireAuth, (req, res) => { + const d = loadUsers(); + const u = d.users.find(x => x.username === req.user.username); + if (!u) return res.status(404).json({ error: 'User not found' }); + u.mfaEnabled = false; + u.mfaSecret = ''; + saveUsers(d); + res.json({ profile: safeProfile(u) }); +}); + +// Change your own password (any authenticated user, admins included). +app.post('/api/auth/password', requireAuth, (req, res) => { + const { currentPassword, newPassword } = req.body || {}; + if (!currentPassword || !newPassword) return res.status(400).json({ error: 'Current and new password required' }); + if (String(newPassword).length < 8) return res.status(400).json({ error: 'New password must be at least 8 characters' }); + const d = loadUsers(); + const u = d.users.find(x => x.username === req.user.username); + if (!u) return res.status(404).json({ error: 'User not found' }); + if (!verifyPassword(currentPassword, u.salt, u.hash)) { + return res.status(401).json({ error: 'Current password is incorrect' }); + } + const { salt, hash } = hashPassword(newPassword); + u.salt = salt; + u.hash = hash; + saveUsers(d); + // Keep the current session but sign this account out everywhere else. + const h = req.headers.authorization || ''; + const cur = h.startsWith('Bearer ') ? h.slice(7) : null; + for (const [tok, uname] of sessions) if (uname === u.username && tok !== cur) sessions.delete(tok); + res.json({ success: true }); +}); + +app.get('/api/auth/users', requireAdmin, (req, res) => { + const d = loadUsers(); + res.json({ users: d.users.map(safeProfile) }); +}); + +// Add a new user (they enroll their own MFA on first login). Only admins may +// add users, and they choose whether the new account is an admin or view-only. +app.post('/api/auth/users', requireAdmin, (req, res) => { + const { username, password, displayName, isAdmin } = req.body || {}; + if (!username || !password) return res.status(400).json({ error: 'Username and password required' }); + if (String(password).length < 8) return res.status(400).json({ error: 'Password must be at least 8 characters' }); + const d = loadUsers(); + if (d.users.some(u => u.username === String(username).trim())) { + return res.status(409).json({ error: 'Username already exists' }); + } + const { salt, hash } = hashPassword(password); + d.users.push({ + username: String(username).trim(), + salt, hash, + mfaSecret: '', + mfaEnabled: false, + displayName: (displayName || '').trim() || String(username).trim(), + avatar: '', + isAdmin: !!isAdmin, + createdAt: new Date().toISOString() + }); + saveUsers(d); + res.json({ success: true }); +}); + +// Delete a user (cannot delete yourself or the last remaining user) +app.delete('/api/auth/users/:username', requireAdmin, (req, res) => { + const target = req.params.username; + if (target === req.user.username) return res.status(400).json({ error: "You can't delete your own account" }); + const d = loadUsers(); + if (d.users.length <= 1) return res.status(400).json({ error: 'Cannot delete the last user' }); + const before = d.users.length; + d.users = d.users.filter(u => u.username !== target); + if (d.users.length === before) return res.status(404).json({ error: 'User not found' }); + saveUsers(d); + // Invalidate any active sessions for that user + for (const [tok, uname] of sessions) if (uname === target) sessions.delete(tok); + res.json({ success: true }); +}); + +// --------------------------------------------------------------------------- +// Contacts data routes (unchanged behaviour) +// --------------------------------------------------------------------------- + +app.get('/api/data', requireAuth, (req, res) => { + try { + const data = JSON.parse(fs.readFileSync(DATA_FILE, 'utf8')); + res.json(data); + } catch (error) { + console.error('Error reading data:', error); + res.status(500).json({ error: 'Failed to read data' }); + } +}); + +app.post('/api/data', requireAdmin, (req, res) => { + try { + fs.writeFileSync(DATA_FILE, JSON.stringify(req.body, null, 2)); + res.json({ success: true }); + } catch (error) { + console.error('Error saving data:', error); + res.status(500).json({ error: 'Failed to save data' }); + } +}); + +app.post('/api/backup', requireAdmin, (req, res) => { + try { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const backupFile = path.join(__dirname, `backup_${timestamp}.json`); + const data = fs.readFileSync(DATA_FILE, 'utf8'); + fs.writeFileSync(backupFile, data); + res.json({ success: true, file: backupFile }); + } catch (error) { + console.error('Error creating backup:', error); + res.status(500).json({ error: 'Failed to create backup' }); + } +}); + +if (require.main === module) { + app.listen(PORT, () => { + const d = loadUsers(); + console.log('================================='); + console.log(`Server running at http://localhost:${PORT}`); + console.log(`Data file: ${DATA_FILE}`); + console.log(`Users file: ${USERS_FILE}`); + console.log(`Setup complete: ${d.users.length > 0} (${d.users.length} user(s))`); + console.log('================================='); + }); +} + +module.exports = app;