New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

vpn_based_remote_access_system

Package Overview
Dependencies
Maintainers
1
Versions
66
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vpn_based_remote_access_system - npm Package Compare versions

Comparing version 1.0.60 to 1.0.61

users.db

5

index.js

@@ -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();

2

package.json
{
"name": "vpn_based_remote_access_system",
"version": "1.0.60",
"version": "1.0.61",
"description": "毕设:基于OpenVPN的远程访问系统",

@@ -5,0 +5,0 @@ "main": "index.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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc