vpn_based_remote_access_system
Advanced tools
Comparing version 1.0.60 to 1.0.61
@@ -8,3 +8,2 @@ const { logInfo, logError } = require('./logs')('Index'); | ||
const proxy = require('./proxy'); | ||
const usergroup = require('./usergroup'); | ||
const readline = require('readline').createInterface({ | ||
@@ -82,6 +81,2 @@ input: process.stdin, | ||
if (input.startsWith('group ')) { | ||
usergroup.handleCommand(input); | ||
} | ||
if (input === 'stop') { | ||
@@ -88,0 +83,0 @@ //server1.shutdownServer(); |
{ | ||
"name": "vpn_based_remote_access_system", | ||
"version": "1.0.60", | ||
"version": "1.0.61", | ||
"description": "毕设:基于OpenVPN的远程访问系统", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
50
proxy.js
@@ -51,3 +51,3 @@ const http = require('http'); | ||
hostname, | ||
port: config.forwardPort, // ʹ�������ļ��е�ת���˿� 8080 | ||
port: config.forwardPort, // ʹ�������ļ��е�ת���˿ڣ��� OpenVPN �����Ӷ˿� | ||
path, | ||
@@ -74,5 +74,2 @@ method: req.method, | ||
const { hostname } = url.parse(`http://${req.url}`); | ||
const clientIP = cltSocket.remoteAddress; | ||
/* | ||
const srvSocket = net.connect(config.forwardPort, hostname, () => { | ||
@@ -83,49 +80,4 @@ cltSocket.write('HTTP/1.1 200 Connection Established\r\nProxy-agent: Node.js-Proxy\r\n\r\n'); | ||
cltSocket.pipe(srvSocket); | ||
});*/ | ||
// ͨ���û� ip ��ȡ�������û��鱻�������ʵĶ˿� | ||
const query = ` | ||
SELECT gp.allowed_ports | ||
FROM users u | ||
JOIN user_ips ui ON u.username = ui.username | ||
JOIN group_permissions gp ON u.groups = gp.group_name | ||
WHERE ui.ip = ?`; | ||
db.get(query, [clientIP], (err, row) => { | ||
if (err) { | ||
logError(err.message); | ||
cltSocket.end('HTTP/1.1 500 Internal Server Error\r\n\r\n'); | ||
return; | ||
} | ||
// ������ ip ����Ӧ���û� | ||
if (!row) { | ||
logError(`Access denied for IP ${clientIP}. No permissions found.`); | ||
cltSocket.end('HTTP/1.1 403 Forbidden\r\n\r\n'); | ||
return; | ||
} | ||
const allowedPorts = row.allowed_ports.split(','); // ��ȡ���������ʵĶ˿ں� | ||
if (!allowedPorts.includes(String(port))) { | ||
logError(`Access to ${hostname}:${port} is not allowed.`); | ||
cltSocket.end('HTTP/1.1 403 Forbidden\r\n\r\n'); | ||
return; | ||
} | ||
// Ȩ���ͨ���������������� | ||
const srvSocket = net.connect(port, hostname, () => { | ||
cltSocket.write('HTTP/1.1 200 Connection Established\r\nProxy-agent: Node.js-Proxy\r\n\r\n'); | ||
srvSocket.write(head); | ||
srvSocket.pipe(cltSocket); | ||
cltSocket.pipe(srvSocket); | ||
}); | ||
srvSocket.on('error', err => { | ||
logInfo(`Server connection error: ${err.message}`); | ||
cltSocket.end(); | ||
srvSocket.end(); | ||
}); | ||
}); | ||
// �ͻ������ִ��������ǿͻ��������ж����ӣ������־�в����� | ||
@@ -132,0 +84,0 @@ cltSocket.on('error', err => { |
@@ -8,2 +8,3 @@ const sqlite3 = require('sqlite3').verbose(); | ||
} | ||
addDefaultGroup(); | ||
}); | ||
@@ -14,9 +15,9 @@ | ||
const defaultGroupName = 'default'; | ||
const defaultPorts = '5140'; // Ĭ�϶˿ں� | ||
const defaultPorts = '5140,8080'; // Ĭ�϶˿ں� | ||
db.run(`INSERT OR IGNORE INTO group_permissions (group_name, allowed_ports) VALUES (?, ?)`, [defaultGroupName, defaultPorts], function (err) { | ||
if (err) { | ||
console.error(err.message); | ||
logError(err.message); | ||
return; | ||
} | ||
console.log(`Default group '${defaultGroupName}' has been added or already exists.`); | ||
logInfo(`Default group '${defaultGroupName}' has been added or already exists.`); | ||
}); | ||
@@ -23,0 +24,0 @@ } |
@@ -34,4 +34,3 @@ const express = require('express'); | ||
registered_at DATETIME, | ||
last_login_at DATETIME, | ||
groups TEXT DEFAULT 'default' | ||
last_login_at DATETIME | ||
)`); | ||
@@ -51,8 +50,2 @@ | ||
// 用户组名称及相应所允许访问的端口表 | ||
db.run(`CREATE TABLE IF NOT EXISTS group_permissions ( | ||
group_name TEXT PRIMARY KEY, | ||
allowed_ports TEXT | ||
)`); | ||
// 身份验证中间件 | ||
@@ -70,8 +63,7 @@ function isAuthenticated(req, res, next) { | ||
const { username, email, password } = req.body; | ||
const hashedPassword = await bcrypt.hash(password, 10); | ||
const userIP = req.socket.remoteAddress; // 获取用户 IP | ||
const registeredAt = new Date().toLocaleString(); // 获取当前时间作为注册时间 | ||
logInfo(`User ${username}(${email}) in ${userIP} has registered.`); | ||
const hashedPassword = await await bcrypt.hash(password + registeredAt, 10); // 将注册时间作为盐值,加密密码 | ||
// 在 users 表中插入新的一行 | ||
// 在 users 表中插入新的一行,以添加用户 | ||
const userQuery = `INSERT INTO users (username, email, password, registered_at) VALUES (?, ?, ?, ?)`; | ||
@@ -91,2 +83,3 @@ db.run(userQuery, [username, email, hashedPassword, registeredAt], function (err) { | ||
}); | ||
logInfo(`User ${username}(${email}) in ${userIP} has registered.`); | ||
} catch (error) { | ||
@@ -99,3 +92,3 @@ res.status(500).send({ message: 'Error creating the user' }); | ||
try { | ||
const { loginIdentifier, loginPassword } = req.body; | ||
const { loginIdentifier, loginPassword } = req.body; // loginIdentifier 含用户名与邮箱 | ||
const userQuery = `SELECT * FROM users WHERE username = ? OR email = ?`; | ||
@@ -109,3 +102,3 @@ db.get(userQuery, [loginIdentifier, loginIdentifier], async (err, userRow) => { | ||
} | ||
const passwordMatch = await bcrypt.compare(loginPassword, userRow.password); | ||
const passwordMatch = await bcrypt.compare(loginPassword + userRow.registered_at, userRow.password); | ||
if (!passwordMatch) { | ||
@@ -115,3 +108,3 @@ return res.status(401).send({ message: 'Invalid username or password' }); | ||
// 登录成功,更新用户上次登录时间 | ||
// 登录成功,更新数据表中用户上次登录时间 | ||
const lastLoginAt = new Date().toLocaleString(); // 获取当前时间作为上次登录时间 | ||
@@ -137,3 +130,3 @@ const updateUserQuery = `UPDATE users SET last_login_at = ? WHERE id = ?`; | ||
} | ||
// 更新成功,为用户跳转到main.html | ||
// 更新成功,为用户跳转页面 | ||
logInfo(`User ${loginIdentifier} (IP: ${userIP}) has logged in.`); | ||
@@ -209,2 +202,44 @@ req.session.username = userRow.username; // 将用户名存入session | ||
// 注销账号 | ||
router.post('/unregister', async (req, res) => { | ||
try { | ||
const { username } = req.body; | ||
// 检查用户是否存在 | ||
const userExistsQuery = `SELECT * FROM users WHERE username = ?`; | ||
db.get(userExistsQuery, [username], async (err, userRow) => { | ||
if (err) { | ||
logError("Error checking user existence:", err); | ||
return res.status(500).json({ success: false, message: 'Internal server error' }); | ||
} | ||
if (!userRow) { | ||
return res.json({ success: false, message: 'User does not exist' }); | ||
} | ||
// 分别从用户表与 ip 表中删除用户信息 | ||
const deleteUserQuery = `DELETE FROM users WHERE username = ?`; | ||
db.run(deleteUserQuery, [username], async (deleteUserErr) => { | ||
if (deleteUserErr) { | ||
logError("Error deleting user:", deleteUserErr); | ||
return res.status(500).json({ success: false, message: 'Internal server error' }); | ||
} | ||
const deleteIPQuery = `DELETE FROM user_ips WHERE username = ?`; | ||
db.run(deleteIPQuery, [username], async (deleteIPErr) => { | ||
if (deleteIPErr) { | ||
logError("Error deleting user IP:", deleteIPErr); | ||
return res.status(500).json({ success: false, message: 'Internal server error' }); | ||
} | ||
logInfo(`User ${username} has unregistered.`); | ||
res.json({ redirect: '/index.html', success: true, message: 'Account successfully unregistered' }); | ||
}); | ||
}); | ||
}); | ||
} catch (error) { | ||
logError("Error unregistering account:", error); | ||
res.status(500).json({ success: false, message: 'Failed to unregister account' }); | ||
} | ||
}); | ||
function allocatePort(callback) { | ||
@@ -300,3 +335,3 @@ // 生成一个在配置所规定范围内的随机数作为分配给用户的端口号 | ||
const { serverStartDuration } = req.body; | ||
const proxyServer = new ProxyServer(row.port, serverStartDuration, true); | ||
const proxyServer = new ProxyServer(row.port, serverStartDuration, true); // 创建实例 | ||
@@ -431,2 +466,3 @@ try { | ||
const logs = data.split('\n').filter(line => line); | ||
// 读取日志的每一行,检查其时间戳,如果在所记录的时间戳之后,则存入 newLogs 以集中返回给管理员界面 | ||
logs.forEach(log => { | ||
@@ -444,3 +480,3 @@ const logTimeMatch = log.match(/\[(.*?)\]/); | ||
if (logs.length > 0) { | ||
const lastLogTimeMatch = logs[logs.length - 1].match(/\[(.*?)\]/); | ||
const lastLogTimeMatch = logs[logs.length - 1].match(/\[(.*?)\]/); // 从日志的最后一行匹配最后一次更新的时间戳 | ||
if (lastLogTimeMatch) { | ||
@@ -447,0 +483,0 @@ newLastLogTime = lastLogTimeMatch[1]; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
82342
11
965