v1.10.0 #471

Merged
LukeGus merged 106 commits from dev-1.10.0 into main 2026-01-01 04:20:12 +00:00
4 changed files with 16 additions and 30 deletions
Showing only changes of commit 04e1ba22be - Show all commits

View File

@@ -80,10 +80,6 @@ function cleanupSession(sessionId: string) {
} catch (error) {}
clearTimeout(session.timeout);
delete sshSessions[sessionId];
dockerLogger.info("Docker SSH session cleaned up", {
operation: "session_cleanup",
sessionId,
});
}
}
@@ -472,7 +468,6 @@ app.post("/docker/ssh/connect", async (req, res) => {
cleanupSession(sessionId);
}
// Clean up any stale pending TOTP sessions
if (pendingTOTPSessions[sessionId]) {
try {
pendingTOTPSessions[sessionId].client.end();

View File

@@ -1017,7 +1017,6 @@ wss.on("connection", async (ws: WebSocket, req) => {
finish(responses);
};
// Set timeout for TOTP response
totpTimeout = setTimeout(() => {
if (keyboardInteractiveFinish) {
keyboardInteractiveFinish = null;
@@ -1070,7 +1069,6 @@ wss.on("connection", async (ws: WebSocket, req) => {
finish(responses);
};
// Set timeout for password response
totpTimeout = setTimeout(() => {
if (keyboardInteractiveFinish) {
keyboardInteractiveFinish = null;

View File

@@ -1044,7 +1044,7 @@
"noneAuthDescription": "This authentication method will use keyboard-interactive authentication when connecting to the SSH server.",
"noneAuthDetails": "Keyboard-interactive authentication allows the server to prompt you for credentials during connection. This is useful for servers that require multi-factor authentication or if you do not want to save credentials locally.",
"forceKeyboardInteractive": "Force Keyboard-Interactive",
"forceKeyboardInteractiveDesc": "Forces the use of keyboard-interactive authentication. This is often required for servers that use Two-Factor Authentication (TOTP/2FA).",
"forceKeyboardInteractiveDesc": "Forces the use of keyboard-interactive authentication. This is sometimes required for servers that use Two-Factor Authentication (TOTP/2FA).",
"overrideCredentialUsername": "Override Credential Username",
"overrideCredentialUsernameDesc": "Use a different username than the one stored in the credential. This allows you to use the same credential with different usernames.",
"jumpHosts": "Jump Hosts",
@@ -1923,7 +1923,13 @@
"snippetsSettings": "Snippets",
"currentPassword": "Current Password",
"passwordChangedSuccess": "Password changed successfully! Please log in again.",
"failedToChangePassword": "Failed to change password. Please check your current password and try again."
"failedToChangePassword": "Failed to change password. Please check your current password and try again.",
"theme": "Theme",
"themeLight": "Light",
"themeDark": "Dark",
"themeSystem": "System",
"appearanceDesc": "Select the color theme for the application",
"terminalSyntaxHighlightingDesc": "Automatically highlight commands, paths, IPs, and log levels in terminal output"
},
"user": {
"failedToLoadVersionInfo": "Failed to load version information"

View File

@@ -430,10 +430,7 @@ export function UserProfile({
{t("leftSidebar.deleteAccount")}
</Label>
<p className="text-sm text-muted-foreground mt-1">
{t(
"leftSidebar.deleteAccountWarningShort",
"This action is not reversible and will permanently delete your account.",
)}
{t("leftSidebar.deleteAccountWarningShort")}
</p>
</div>
<Button
@@ -448,7 +445,6 @@ export function UserProfile({
</TabsContent>
<TabsContent value="appearance" className="space-y-4">
{/* Language & Localization Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.languageLocalization")}
@@ -468,22 +464,18 @@ export function UserProfile({
</div>
</div>
{/* Theme Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.appearance", "Appearance")}
{t("profile.appearance")}
</h3>
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<Label className="text-foreground-secondary">
{t("profile.theme", "Theme")}
{t("profile.theme")}
</Label>
<p className="text-sm text-muted-foreground mt-1">
{t(
"profile.appearanceDesc",
"Choose your preferred theme",
)}
{t("profile.appearanceDesc")}
</p>
</div>
<Select value={theme} onValueChange={setTheme}>
@@ -494,19 +486,19 @@ export function UserProfile({
<SelectItem value="light">
<div className="flex items-center gap-2">
<Sun className="w-4 h-4" />
{t("profile.themeLight", "Light")}
{t("profile.themeLight")}
</div>
</SelectItem>
<SelectItem value="dark">
<div className="flex items-center gap-2">
<Moon className="w-4 h-4" />
{t("profile.themeDark", "Dark")}
{t("profile.themeDark")}
</div>
</SelectItem>
<SelectItem value="system">
<div className="flex items-center gap-2">
<Monitor className="w-4 h-4" />
{t("profile.themeSystem", "System")}
{t("profile.themeSystem")}
</div>
</SelectItem>
</SelectContent>
@@ -515,7 +507,6 @@ export function UserProfile({
</div>
</div>
{/* File Manager Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.fileManagerSettings")}
@@ -538,7 +529,6 @@ export function UserProfile({
</div>
</div>
{/* Terminal Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.terminalSettings")}
@@ -567,8 +557,7 @@ export function UserProfile({
</span>
</Label>
<p className="text-sm text-muted-foreground mt-1">
Automatically highlight commands, paths, IPs, and log
levels in terminal output
{t("profile.terminalSyntaxHighlightingDesc")}
</p>
</div>
<Switch
@@ -579,7 +568,6 @@ export function UserProfile({
</div>
</div>
{/* Host & Sidebar Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.hostSidebarSettings")}
@@ -602,7 +590,6 @@ export function UserProfile({
</div>
</div>
{/* Snippets Section */}
<div className="rounded-lg border-2 border-edge bg-elevated p-4">
<h3 className="text-lg font-semibold mb-4">
{t("profile.snippetsSettings")}