feat: Merge PR
This commit is contained in:
@@ -52,7 +52,7 @@ access, SSH tunneling capabilities, and remote file management, with many more t
|
|||||||
- **SSH Terminal Access** - Full-featured terminal with split-screen support (up to 4 panels) and tab system
|
- **SSH Terminal Access** - Full-featured terminal with split-screen support (up to 4 panels) and tab system
|
||||||
- **SSH Tunnel Management** - Create and manage SSH tunnels with automatic reconnection and health monitoring
|
- **SSH Tunnel Management** - Create and manage SSH tunnels with automatic reconnection and health monitoring
|
||||||
- **Remote File Manager** - Manage files directly on remote servers with support for viewing and editing code, images, audio, and video. Upload, download, rename, delete, and move files seamlessly.
|
- **Remote File Manager** - Manage files directly on remote servers with support for viewing and editing code, images, audio, and video. Upload, download, rename, delete, and move files seamlessly.
|
||||||
- **SSH Host Manager** - Save, organize, and manage your SSH connections with tags and folders and easily save reusable login info while being able to automate the deploying of SSH keys
|
- **SSH Host Manager** - Save, organize, and manage your SSH connections with tags and folders, and easily save reusable login info while being able to automate the deployment of SSH keys
|
||||||
- **Server Stats** - View CPU, memory, and HDD usage on any SSH server
|
- **Server Stats** - View CPU, memory, and HDD usage on any SSH server
|
||||||
- **User Authentication** - Secure user management with admin controls and OIDC and 2FA (TOTP) support
|
- **User Authentication** - Secure user management with admin controls and OIDC and 2FA (TOTP) support
|
||||||
- **Database Encryption** - SQLite database files encrypted at rest with automatic encryption/decryption
|
- **Database Encryption** - SQLite database files encrypted at rest with automatic encryption/decryption
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "termix",
|
"name": "termix",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.7.3",
|
"version": "1.8.0",
|
||||||
"description": "A web-based server management platform with SSH terminal, tunneling, and file editing capabilities",
|
"description": "A web-based server management platform with SSH terminal, tunneling, and file editing capabilities",
|
||||||
"author": "Karmaa",
|
"author": "Karmaa",
|
||||||
"main": "electron/main.cjs",
|
"main": "electron/main.cjs",
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ router.post(
|
|||||||
if (effectiveAuthType === "password") {
|
if (effectiveAuthType === "password") {
|
||||||
sshDataObj.password = password || null;
|
sshDataObj.password = password || null;
|
||||||
sshDataObj.key = null;
|
sshDataObj.key = null;
|
||||||
sshDataObj.keyPassword = null;
|
sshDataObj.key_password = null;
|
||||||
sshDataObj.keyType = null;
|
sshDataObj.keyType = null;
|
||||||
} else if (effectiveAuthType === "key") {
|
} else if (effectiveAuthType === "key") {
|
||||||
sshDataObj.key = key || null;
|
sshDataObj.key = key || null;
|
||||||
@@ -286,7 +286,7 @@ router.post(
|
|||||||
} else {
|
} else {
|
||||||
sshDataObj.password = null;
|
sshDataObj.password = null;
|
||||||
sshDataObj.key = null;
|
sshDataObj.key = null;
|
||||||
sshDataObj.keyPassword = null;
|
sshDataObj.key_password = null;
|
||||||
sshDataObj.keyType = null;
|
sshDataObj.keyType = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,7 +465,7 @@ router.put(
|
|||||||
sshDataObj.password = password;
|
sshDataObj.password = password;
|
||||||
}
|
}
|
||||||
sshDataObj.key = null;
|
sshDataObj.key = null;
|
||||||
sshDataObj.keyPassword = null;
|
sshDataObj.key_password = null;
|
||||||
sshDataObj.keyType = null;
|
sshDataObj.keyType = null;
|
||||||
} else if (effectiveAuthType === "key") {
|
} else if (effectiveAuthType === "key") {
|
||||||
if (key) {
|
if (key) {
|
||||||
@@ -481,7 +481,7 @@ router.put(
|
|||||||
} else {
|
} else {
|
||||||
sshDataObj.password = null;
|
sshDataObj.password = null;
|
||||||
sshDataObj.key = null;
|
sshDataObj.key = null;
|
||||||
sshDataObj.keyPassword = null;
|
sshDataObj.key_password = null;
|
||||||
sshDataObj.keyType = null;
|
sshDataObj.keyType = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,9 +94,7 @@ class UserCrypto {
|
|||||||
DEK.fill(0);
|
DEK.fill(0);
|
||||||
DEK = this.decryptDEK(storedEncryptedDEK, systemKey);
|
DEK = this.decryptDEK(storedEncryptedDEK, systemKey);
|
||||||
} else if (!storedEncryptedDEK) {
|
} else if (!storedEncryptedDEK) {
|
||||||
throw new Error(
|
throw new Error("Failed to store and retrieve user encryption key.");
|
||||||
"Failed to store and retrieve user encryption key.",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
systemKey.fill(0);
|
systemKey.fill(0);
|
||||||
@@ -279,21 +277,6 @@ class UserCrypto {
|
|||||||
|
|
||||||
oldKEK.fill(0);
|
oldKEK.fill(0);
|
||||||
newKEK.fill(0);
|
newKEK.fill(0);
|
||||||
|
|
||||||
const dekCopy = Buffer.from(DEK);
|
|
||||||
|
|
||||||
const now = Date.now();
|
|
||||||
const oldSession = this.userSessions.get(userId);
|
|
||||||
if (oldSession) {
|
|
||||||
oldSession.dataKey.fill(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.userSessions.set(userId, {
|
|
||||||
dataKey: dekCopy,
|
|
||||||
lastActivity: now,
|
|
||||||
expiresAt: now + UserCrypto.SESSION_DURATION,
|
|
||||||
});
|
|
||||||
|
|
||||||
DEK.fill(0);
|
DEK.fill(0);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user