diff --git a/emails/translations/account-check-min_cs.html b/emails/translations/account-check-min_cs.html
deleted file mode 100644
index 9dd38c50..00000000
--- a/emails/translations/account-check-min_cs.html
+++ /dev/null
@@ -1 +0,0 @@
-
[[[SERVERNAME]]] - Ověření e-mailem
\ No newline at end of file
diff --git a/emails/translations/account-check-min_de.html b/emails/translations/account-check-min_de.html
deleted file mode 100644
index 1ccd44d3..00000000
--- a/emails/translations/account-check-min_de.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - E-Mail-Überprüfung
\ No newline at end of file
diff --git a/emails/translations/account-check-min_es.html b/emails/translations/account-check-min_es.html
deleted file mode 100644
index 65a20de2..00000000
--- a/emails/translations/account-check-min_es.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Verificación de Email
\ No newline at end of file
diff --git a/emails/translations/account-check-min_fr.html b/emails/translations/account-check-min_fr.html
deleted file mode 100644
index 89deac60..00000000
--- a/emails/translations/account-check-min_fr.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Vérification E-mail
\ No newline at end of file
diff --git a/emails/translations/account-check-min_hi.html b/emails/translations/account-check-min_hi.html
deleted file mode 100644
index 38b754cc..00000000
--- a/emails/translations/account-check-min_hi.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - ईमेल सत्यापन
\ No newline at end of file
diff --git a/emails/translations/account-check-min_ja.html b/emails/translations/account-check-min_ja.html
deleted file mode 100644
index 3874051d..00000000
--- a/emails/translations/account-check-min_ja.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-メールの確認
\ No newline at end of file
diff --git a/emails/translations/account-check-min_ko.html b/emails/translations/account-check-min_ko.html
deleted file mode 100644
index d48a3a77..00000000
--- a/emails/translations/account-check-min_ko.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Email 인증
\ No newline at end of file
diff --git a/emails/translations/account-check-min_nl.html b/emails/translations/account-check-min_nl.html
deleted file mode 100644
index b586adb6..00000000
--- a/emails/translations/account-check-min_nl.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - E-mail Verificatie
\ No newline at end of file
diff --git a/emails/translations/account-check-min_pt.html b/emails/translations/account-check-min_pt.html
deleted file mode 100644
index c1459803..00000000
--- a/emails/translations/account-check-min_pt.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Email Verification
\ No newline at end of file
diff --git a/emails/translations/account-check-min_ru.html b/emails/translations/account-check-min_ru.html
deleted file mode 100644
index 7998a7ec..00000000
--- a/emails/translations/account-check-min_ru.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - подтверждение по электронной почте
\ No newline at end of file
diff --git a/emails/translations/account-check-min_zh-chs.html b/emails/translations/account-check-min_zh-chs.html
deleted file mode 100644
index 03c6c69c..00000000
--- a/emails/translations/account-check-min_zh-chs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-电子邮件验证
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_cs.html b/emails/translations/account-invite-min_cs.html
deleted file mode 100644
index 7f3892c8..00000000
--- a/emails/translations/account-invite-min_cs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Pozvánka na účet
[[[SERVERNAME]]] - Pozvánka na účet |
Účet byl pro vás vytvořen na serveru [[[SERVERNAME]]], nyní k němu máte přístup:
Uživatelské jméno: [[[ACCOUNTNAME]]]
Heslo: [[[PASSWORD]]]
S pozdravem,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_de.html b/emails/translations/account-invite-min_de.html
deleted file mode 100644
index c1a13ac3..00000000
--- a/emails/translations/account-invite-min_de.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Kontoeinladung
[[[SERVERNAME]]] - Kontoeinladung |
Auf dem Server wurde ein Konto für Sie erstellt [[[SERVERNAME]]]können Sie jetzt darauf zugreifen mit:
Benutzername: [[[ACCOUNTNAME]]]
Passwort: [[[PASSWORD]]]
Freundliche Grüße,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_es.html b/emails/translations/account-invite-min_es.html
deleted file mode 100644
index 6ac1a96c..00000000
--- a/emails/translations/account-invite-min_es.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Invitación de Cuenta
[[[SERVERNAME]]] - Invitación de Cuenta |
Una cuenta ha sido creada en su servidor [[[SERVERNAME]]], ahora puede acceder con:
Usuario: [[[ACCOUNTNAME]]]
Contraseña: [[[PASSWORD]]]
Atentamente,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_fr.html b/emails/translations/account-invite-min_fr.html
deleted file mode 100644
index 79363e9e..00000000
--- a/emails/translations/account-invite-min_fr.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Invitation au compte
[[[SERVERNAME]]] - Invitation au compte |
Un compte a été créé pour vous sur le serveur [[[SERVERNAME]]], vous pouvez y accéder maintenant avec:
Nom d'utilisateur: [[[ACCOUNTNAME]]]
Mot de passe: [[[PASSWORD]]]
Meilleures salutations,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_hi.html b/emails/translations/account-invite-min_hi.html
deleted file mode 100644
index 6cc9317e..00000000
--- a/emails/translations/account-invite-min_hi.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - खाता निमंत्रण
[[[SERVERNAME]]] - खाता निमंत्रण |
सर्वर पर आपके लिए एक खाता बनाया गया था [[[SERVERNAME]]], आप इसे अभी एक्सेस कर सकते हैं:
उपयोगकर्ता नाम: [[[ACCOUNTNAME]]]
कुंजिका: [[[PASSWORD]]]
सादर,
[[[उपयोगकर्ता नाम]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_ja.html b/emails/translations/account-invite-min_ja.html
deleted file mode 100644
index 2db915b6..00000000
--- a/emails/translations/account-invite-min_ja.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-アカウントの招待
[[[SERVERNAME]]]-アカウントの招待 |
サーバー上にアカウントが作成されました [[[SERVERNAME]]]、あなたは今それを使ってそれにアクセスできます:
ユーザー名: [[[ACCOUNTNAME]]]
パスワード: [[[PASSWORD]]]
宜しくお願いします、
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_ko.html b/emails/translations/account-invite-min_ko.html
deleted file mode 100644
index 54bda02f..00000000
--- a/emails/translations/account-invite-min_ko.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - 계정 초대
당신을 위해 서버에서 한 계정이 생성되었습니다. [[[SERVERNAME]]]이제 당신은 다음으로 접근 가능합니다:
사용자 이름: [[[ACCOUNTNAME]]]
암호: [[[PASSWORD]]]
최고의 안부를 전합니다,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_nl.html b/emails/translations/account-invite-min_nl.html
deleted file mode 100644
index befe7c8d..00000000
--- a/emails/translations/account-invite-min_nl.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Account uitnodiging
[[[SERVERNAME]]] - Account uitnodiging |
Er is een account voor je aangemaakt op de server [[[SERVERNAME]]], je hebt er nu toegang toe met:
Gebruikersnaam: [[[ACCOUNTNAME]]]
Wachtwoord: [[[PASSWORD]]]
Vriendelijke groeten,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_pt.html b/emails/translations/account-invite-min_pt.html
deleted file mode 100644
index 991c0d29..00000000
--- a/emails/translations/account-invite-min_pt.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Account Invitation
[[[SERVERNAME]]] - Account Invitation |
An account was created for you on server [[[SERVERNAME]]], you can access it now with:
Nome de usuário: [[[ACCOUNTNAME]]]
Senha: [[[PASSWORD]]]
Best regards,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_ru.html b/emails/translations/account-invite-min_ru.html
deleted file mode 100644
index e454950a..00000000
--- a/emails/translations/account-invite-min_ru.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - приглашение в аккаунт
[[[SERVERNAME]]] - приглашение в аккаунт |
Учетная запись была создана для вас на сервере [[[SERVERNAME]]]Вы можете получить к нему доступ сейчас:
Имя пользователя: [[[ACCOUNTNAME]]]
Пароль: [[[PASSWORD]]]
С уважением,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-invite-min_zh-chs.html b/emails/translations/account-invite-min_zh-chs.html
deleted file mode 100644
index 2b20c96c..00000000
--- a/emails/translations/account-invite-min_zh-chs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-帐户邀请
在服务器上为您创建了一个帐户 [[[SERVERNAME]]],您现在可以通过以下方式访问它:
用戶名: [[[ACCOUNTNAME]]]
密碼: [[[PASSWORD]]]
最好的祝福,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/account-login-min_cs.html b/emails/translations/account-login-min_cs.html
deleted file mode 100644
index 6f6ae83f..00000000
--- a/emails/translations/account-login-min_cs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Přihlášení k účtu
[[[SERVERNAME]]] - Přihlášení k účtu |
Váš přihlašovací token je: [[[TOKEN]]]
Tento token lze použít pouze jednou a je platný po dobu 5 minut.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_de.html b/emails/translations/account-login-min_de.html
deleted file mode 100644
index c8d7f426..00000000
--- a/emails/translations/account-login-min_de.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Konto-Login
[[[SERVERNAME]]] - Konto-Login |
Ihr Login-Token lautet: [[[TOKEN]]]
Dieser Token kann nur einmal verwendet werden und ist 5 Minuten gültig.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_es.html b/emails/translations/account-login-min_es.html
deleted file mode 100644
index 55a45637..00000000
--- a/emails/translations/account-login-min_es.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Nombre de Usuario
[[[SERVERNAME]]] - Nombre de Usuario |
Su token de inicio de sesión es: [[[TOKEN]]]
Este token solo se puede usar una vez y es válido durante 5 minutos.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_fr.html b/emails/translations/account-login-min_fr.html
deleted file mode 100644
index 4a7f1305..00000000
--- a/emails/translations/account-login-min_fr.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Connexion au compte
[[[SERVERNAME]]] - Connexion au compte |
Votre jeton de connexion est: [[[TOKEN]]]
Ce jeton ne peut être utilisé qu'une seule fois et est valide pendant 5 minutes.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_hi.html b/emails/translations/account-login-min_hi.html
deleted file mode 100644
index 731a3985..00000000
--- a/emails/translations/account-login-min_hi.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - खाता लॉगिन
[[[SERVERNAME]]] - खाता लॉगिन |
आपका लॉगिन टोकन है: [[[टोकन]]]
यह टोकन केवल एक बार उपयोग किया जा सकता है और 5 मिनट के लिए वैध है।
\ No newline at end of file
diff --git a/emails/translations/account-login-min_ja.html b/emails/translations/account-login-min_ja.html
deleted file mode 100644
index f6d5515c..00000000
--- a/emails/translations/account-login-min_ja.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-アカウントログイン
[[[SERVERNAME]]]-アカウントログイン |
ログイントークンは次のとおりです:[[[TOKEN]]]
このトークンは1回だけ使用でき、5分間有効です。
\ No newline at end of file
diff --git a/emails/translations/account-login-min_ko.html b/emails/translations/account-login-min_ko.html
deleted file mode 100644
index 368ea790..00000000
--- a/emails/translations/account-login-min_ko.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - 계정 로그인
[[[SERVERNAME]]] - 계정 로그인 |
당신이 로그인한 토큰은 다음과 같습니다 : [[[TOKEN]]]
이 토큰은 오직 한 번만 사용될 수 있으며, 5분 동안만 유효합니다.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_nl.html b/emails/translations/account-login-min_nl.html
deleted file mode 100644
index 7ea6a268..00000000
--- a/emails/translations/account-login-min_nl.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Inloggen account
[[[SERVERNAME]]] - Inloggen account |
Uw login token is: [[[TOKEN]]]
Dit token kan maar één keer worden gebruikt en is 5 minuten geldig.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_pt.html b/emails/translations/account-login-min_pt.html
deleted file mode 100644
index 653bc3c4..00000000
--- a/emails/translations/account-login-min_pt.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Account Login
[[[SERVERNAME]]] - Account Login |
Your login token is: [[[TOKEN]]]
This token can only be used once and is valid for 5 minutes.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_ru.html b/emails/translations/account-login-min_ru.html
deleted file mode 100644
index d77dead5..00000000
--- a/emails/translations/account-login-min_ru.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Вход в аккаунт
[[[SERVERNAME]]] - Вход в аккаунт |
Ваш токен для входа: [[[TOKEN]]]
Этот токен может быть использован только один раз и действителен в течение 5 минут.
\ No newline at end of file
diff --git a/emails/translations/account-login-min_zh-chs.html b/emails/translations/account-login-min_zh-chs.html
deleted file mode 100644
index 0eacb515..00000000
--- a/emails/translations/account-login-min_zh-chs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-帐户登录
您的登录令牌为:[[[TOKEN]]]
该令牌只能使用一次,有效期为5分钟。
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_cs.html b/emails/translations/account-reset-min_cs.html
deleted file mode 100644
index f3590436..00000000
--- a/emails/translations/account-reset-min_cs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Reset účtu
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_de.html b/emails/translations/account-reset-min_de.html
deleted file mode 100644
index 99ad8315..00000000
--- a/emails/translations/account-reset-min_de.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Zurücksetzen des Kontos
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_es.html b/emails/translations/account-reset-min_es.html
deleted file mode 100644
index 001766f7..00000000
--- a/emails/translations/account-reset-min_es.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Resetear Cuenta
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_fr.html b/emails/translations/account-reset-min_fr.html
deleted file mode 100644
index 1bc1e8a0..00000000
--- a/emails/translations/account-reset-min_fr.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Réinitialisation du compte
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_hi.html b/emails/translations/account-reset-min_hi.html
deleted file mode 100644
index 1ada7e96..00000000
--- a/emails/translations/account-reset-min_hi.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - खाता रीसेट
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_ja.html b/emails/translations/account-reset-min_ja.html
deleted file mode 100644
index 3d34b8a4..00000000
--- a/emails/translations/account-reset-min_ja.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-アカウントのリセット
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_ko.html b/emails/translations/account-reset-min_ko.html
deleted file mode 100644
index 252f089f..00000000
--- a/emails/translations/account-reset-min_ko.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - 계정 재설정
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_nl.html b/emails/translations/account-reset-min_nl.html
deleted file mode 100644
index 2f7400b8..00000000
--- a/emails/translations/account-reset-min_nl.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Account Reset
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_pt.html b/emails/translations/account-reset-min_pt.html
deleted file mode 100644
index 8d4ca1cf..00000000
--- a/emails/translations/account-reset-min_pt.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Account Reset
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_ru.html b/emails/translations/account-reset-min_ru.html
deleted file mode 100644
index 980d30bf..00000000
--- a/emails/translations/account-reset-min_ru.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Сброс учетной записи
\ No newline at end of file
diff --git a/emails/translations/account-reset-min_zh-chs.html b/emails/translations/account-reset-min_zh-chs.html
deleted file mode 100644
index 1d83cfab..00000000
--- a/emails/translations/account-reset-min_zh-chs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-帐户重置
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_cs.html b/emails/translations/mesh-invite-min_cs.html
deleted file mode 100644
index a18a774e..00000000
--- a/emails/translations/mesh-invite-min_cs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Pozvánka
[[[SERVERNAME]]] - Instalace agenta |
Dobrý den, [[[NAME]]],
Uživatel [[[USERNAME]]] na serveru [[[SERVERNAME]]] vás žádá o instalaci softwaru pro spuštění relace dálkového ovládání.
Zpráva: [[[MSG]]]
Kliknutím sem stáhnete MeshAgent pro Windows.
Kliknutím sem stáhnete MeshAgent pro Apple OSX.
V případě systému Linux vyjměte a vložte do terminálu a nainstalujte agenta:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
Chcete-li nainstalovat software, klikněte zde a postupujte podle pokynů.
Pokud jste tento požadavek nezačali, ignorujte tento e-mail.
S pozdravem,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_de.html b/emails/translations/mesh-invite-min_de.html
deleted file mode 100644
index 11cf1d00..00000000
--- a/emails/translations/mesh-invite-min_de.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Einladung
[[[SERVERNAME]]] - Agenteninstallation |
Hallo [[[NAME]]],
Benutzer [[[USERNAME]]] auf dem Server [[[SERVERNAME]]] fordert Sie auf, Software zu installieren, um eine Fernsteuerungssitzung zu starten.
Botschaft: [[[MSG]]]
Klicken Sie hier, um den MeshAgent für Windows herunterzuladen.
Klicken Sie hier, um den MeshAgent für Apple OSX herunterzuladen.
Schneiden Sie unter Linux Folgendes aus und fügen Sie es in ein Terminal ein, um den Agenten zu installieren:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
Um die Software zu installieren, hier klicken und folgen Sie den Anweisungen.
Wenn Sie diese Anfrage nicht initiiert haben, ignorieren Sie diese Mail bitte.
Freundliche Grüße,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_es.html b/emails/translations/mesh-invite-min_es.html
deleted file mode 100644
index 1449a38c..00000000
--- a/emails/translations/mesh-invite-min_es.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Invitación
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_fr.html b/emails/translations/mesh-invite-min_fr.html
deleted file mode 100644
index 39745f0e..00000000
--- a/emails/translations/mesh-invite-min_fr.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Invitation
[[[SERVERNAME]]] - Installation de l'agent |
Bonjour [[[NAME]]],
Utilisateur [[[USERNAME]]] sur le serveur [[[SERVERNAME]]] vous demande d'installer un logiciel pour démarrer une session de contrôle à distance.
Message: [[[MSG]]]
Cliquez ici pour télécharger le MeshAgent pour Windows.
Cliquez ici pour télécharger le MeshAgent pour Apple OSX.
Pour Linux, copiez et collez les éléments suivants dans un terminal pour installer l'agent:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
Pour installer le logiciel, cliquez ici et suivez les instructions.
Si vous n'avez pas initié cette demande, veuillez ignorer ce courrier.
Meilleures salutations,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_hi.html b/emails/translations/mesh-invite-min_hi.html
deleted file mode 100644
index 329ffa16..00000000
--- a/emails/translations/mesh-invite-min_hi.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - निमंत्रण
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_ja.html b/emails/translations/mesh-invite-min_ja.html
deleted file mode 100644
index ee657713..00000000
--- a/emails/translations/mesh-invite-min_ja.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-招待
[[[SERVERNAME]]]-エージェントのインストール |
[[[NAME]]]様
サーバー上のユーザー[[[USERNAME]]] [[[SERVERNAME]]] リモートコントロールセッションを開始するソフトウェアをインストールするように要求しています。
メッセージ: [[[MSG]]]
Windows用のMeshAgentをダウンロードするには、ここをクリックしてください。
ここをクリックして、Apple OSX用のMeshAgentをダウンロードしてください。
Linuxの場合は、ターミナルで以下をカットアンドペーストしてエージェントをインストールします。
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
ソフトウェアをインストールするには、 ここをクリック 指示に従ってください。
このリクエストを開始していない場合は、このメールを無視してください。
宜しくお願いします、
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_ko.html b/emails/translations/mesh-invite-min_ko.html
deleted file mode 100644
index b9f31f70..00000000
--- a/emails/translations/mesh-invite-min_ko.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - 초대
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_nl.html b/emails/translations/mesh-invite-min_nl.html
deleted file mode 100644
index ef8a256a..00000000
--- a/emails/translations/mesh-invite-min_nl.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Uitnodiging
[[[SERVERNAME]]] - Agent installatie |
Hallo [[[NAME]]],
Gebruiker [[[USERNAME]]] op server [[[SERVERNAME]]] vraagt u om de software te installeren om een ondersteunings sessie te starten.
Bericht: [[[MSG]]]
Klik hier om de MeshAgent te downloaden voor Windows.
Klik hier om de MeshAgent te downloaden voor Apple OSX.
Voor Linux, knip het volgende en plak dit in een terminal om de agent te installeren:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
Om de software te installeren, Klik hier en volg de instructies.
Als u dit verzoek niet heeft ingediend, dan kunt u deze e-mail negeren.
Vriendelijke groeten,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_pt.html b/emails/translations/mesh-invite-min_pt.html
deleted file mode 100644
index 937970c5..00000000
--- a/emails/translations/mesh-invite-min_pt.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Invitation
[[[SERVERNAME]]] - Agent Installation |
Hello [[[NAME]]],
User [[[USERNAME]]] on server [[[SERVERNAME]]] is requesting you to install software to start a remote control session.
Message: [[[MSG]]]
Click here to download the MeshAgent for Windows.
Click here to download the MeshAgent for Apple OSX.
For Linux, cut & paste the following in a terminal to install the agent:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
To install the software, click here and follow the instructions.
If you did not initiate this request, please ignore this mail.
Best regards,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_ru.html b/emails/translations/mesh-invite-min_ru.html
deleted file mode 100644
index fdd5ab7e..00000000
--- a/emails/translations/mesh-invite-min_ru.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]] - Приглашение
[[[SERVERNAME]]] - Установка агента |
Здравствуйте, [[[NAME]]],
Пользователь [[[USERNAME]]] на сервере [[[SERVERNAME]]] просит вас установить программное обеспечение, чтобы начать сеанс удаленного управления.
Сообщение: [[[MSG]]]
Нажмите здесь, чтобы загрузить MeshAgent для Windows.
Нажмите здесь, чтобы загрузить MeshAgent для Apple OSX.
Для Linux вырезайте и вставляйте в терминал следующее, чтобы установить агент:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
Чтобы установить программное обеспечение, кликните сюда и следуйте инструкциям.
Если вы не инициировали этот запрос, игнорируйте это письмо.
С уважением,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/emails/translations/mesh-invite-min_zh-chs.html b/emails/translations/mesh-invite-min_zh-chs.html
deleted file mode 100644
index 2fb859e6..00000000
--- a/emails/translations/mesh-invite-min_zh-chs.html
+++ /dev/null
@@ -1 +0,0 @@
-[[[SERVERNAME]]]-邀请
您好[[[NAME]]],
伺服器上的使用者[[[USERNAME]]] [[[SERVERNAME]]] 正在要求您安装软件以启动远程控制会话。
信息: [[[MSG]]]
单击此处下载适用于Windows的MeshAgent。
单击此处下载适用于Apple OSX的MeshAgent。
对于Linux,将以下内容剪切并粘贴到终端中以安装代理程序:
wget -q "[[[SERVERURL]]]/meshagents?script=1" --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHIDHEX]]]\'
要安装软件, 点击这里 并按照说明进行操作。
如果您没有发起此请求,请忽略此邮件。
最好的祝福,
[[[USERNAME]]]
\ No newline at end of file
diff --git a/mstsc.js b/mstsc.js
index 6f406b51..3424ba5b 100644
--- a/mstsc.js
+++ b/mstsc.js
@@ -16,12 +16,11 @@
// Construct a MSTSC Relay object, called upon connection
// This is a bit of a hack as we are going to run the RDP connection thru a loopback connection.
// If the "node-rdpjs-2" module supported passing a socket, we would do something different.
-module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain, user) {
+module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain) {
const Net = require('net');
const WebSocket = require('ws');
var obj = {};
- obj.user = user;
obj.domain = domain;
obj.ws = ws;
obj.wsClient = null;
@@ -34,14 +33,13 @@ module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain, u
parent.parent.debug('relay', 'RDP: Request for RDP relay (' + req.clientIp + ')');
- // Disconnect this user
+ // Disconnect
obj.close = function (arg) {
if ((arg == 1) || (arg == null)) { try { ws.close(); } catch (e) { console.log(e); } } // Soft close, close the websocket
if (arg == 2) { try { ws._socket._parent.end(); } catch (e) { console.log(e); } } // Hard close, close the TCP socket
if (obj.wsClient) { obj.wsClient.close(); obj.wsClient = null; }
if (obj.tcpServer) { obj.tcpServer.close(); obj.tcpServer = null; }
if (rdpClient) { rdpClient.close(); rdpClient = null; }
- delete obj.user;
delete obj.domain;
delete obj.ws;
};
diff --git a/views/mstsc.handlebars b/views/mstsc.handlebars
index 3f2e5bb2..d8d6ff59 100644
--- a/views/mstsc.handlebars
+++ b/views/mstsc.handlebars
@@ -68,16 +68,25 @@
var client = null;
var canvas = null;
var urlargs = parseUriArgs();
- if (urlargs.name) { document.title = urlargs.name + ' - ' + document.title; }
+ var cookie = '{{{cookie}}}';
+ var name = decodeURIComponent('{{{name}}}');
+ if (name != '') { document.title = name + ' - ' + document.title; }
function load() {
- if (urlargs.name) { QH('computerName', urlargs.name); }
+ if (name != '') { QH('computerName', name); }
client = MstscClient.create(Q('myCanvas'));
Q('inputDomain').focus();
canvas = Q('myCanvas');
+ if (cookie == '') {
+ QE('inputDomain', false);
+ QE('inputUsername', false);
+ QE('inputPassword', false);
+ QE('connectButton', false);
+ }
}
function connect(domain, username, password) {
+ if (cookie == '') return;
var domain = Q('inputDomain').value;
var username = Q('inputUsername').value;
var password = Q('inputPassword').value;
@@ -85,7 +94,7 @@
QV('main', false);
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
- client.connect(urlargs.ws, domain, username, password, function (err) { QV('myCanvas', false); QV('main', true); });
+ client.connect(cookie, domain, username, password, function (err) { QV('myCanvas', false); QV('main', true); });
return false;
}
diff --git a/webserver.js b/webserver.js
index 8d76fa4f..e170f881 100644
--- a/webserver.js
+++ b/webserver.js
@@ -1632,7 +1632,63 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
const domain = getDomain(req);
if (domain == null) { parent.debug('web', 'handleMSTSCRequest: failed checks.'); res.sendStatus(404); return; }
if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
- render(req, res, getRenderPage('mstsc', req, domain), getRenderArgs({}, req, domain));
+
+ if (req.query.ws != null) {
+ // This is a query with a websocket relay cookie, check that the cookie is valid and use it.
+ var rcookie = parent.decodeCookie(req.query.ws, parent.loginCookieEncryptionKey, 240); // Cookie with 4 hour timeout
+ if ((rcookie != null) && (rcookie.domainid == domain.id) && (rcookie.nodeid != null) && (rcookie.tcpport != null)) { render(req, res, getRenderPage('mstsc', req, domain), getRenderArgs({ cookie: req.query.ws, name: encodeURIComponent(req.query.name) }, req, domain)); return; }
+ }
+
+ // Get the logged in user if present
+ var user = null;
+
+ // If there is a login token, use that
+ if (req.query.login != null) {
+ var ucookie = parent.decodeCookie(req.query.login, parent.loginCookieEncryptionKey, 240); // Cookie with 4 hour timeout
+ if ((ucookie != null) && (ucookie.a === 3) && (typeof ucookie.u == 'string')) { user = obj.users[ucookie.u]; }
+ }
+
+ // If no token, see if we have an active session
+ if ((user == null) && (req.session.userid != null)) { user = obj.users[req.session.userid]; }
+
+ // If still no user, see if we have a default user
+ if ((user == null) && (obj.args.user)) { user = obj.users['user/' + domain.id + '/' + obj.args.user.toLowerCase()]; }
+
+ // No user login, exit now
+ if (user == null) { res.sendStatus(401); return; }
+
+ // Check the nodeid
+ if (req.query.node != null) {
+ var nodeidsplit = req.query.node.split('/');
+ if (nodeidsplit.length == 1) {
+ req.query.node = 'node/' + domain.id + '/' + nodeidsplit[0]; // Format the nodeid correctly
+ } else if (nodeidsplit.length == 3) {
+ if ((nodeidsplit[0] != 'node') || (nodeidsplit[1] != domain.id)) { req.query.node = null; } // Check the nodeid format
+ } else {
+ req.query.node = null; // Bad nodeid
+ }
+ }
+
+ // If there is no nodeid, exit now
+ if (req.query.node == null) { render(req, res, getRenderPage('mstsc', req, domain), getRenderArgs({ cookie: '', name: '' }, req, domain)); return; }
+
+ // Fetch the node from the database
+ obj.db.Get(req.query.node, function (err, nodes) {
+ if ((err != null) || (nodes.length != 1)) { res.sendStatus(404); return; }
+ const node = nodes[0];
+
+ // Check access rights, must have remote control rights
+ if ((obj.GetNodeRights(user, node.meshid, node._id) & MESHRIGHT_REMOTECONTROL) == 0) { res.sendStatus(401); return; }
+
+ // Figure out the target port
+ var port = 3389;
+ if (typeof node.rdpport == 'number') { port = node.rdpport; }
+ if (req.query.port != null) { var qport = 0; try { qport = parseInt(req.query.port); } catch (ex) { } if ((typeof qport == 'number') && (qport > 0) && (qport < 65536)) { port = qport; } }
+
+ // Generate a cookie and respond
+ var cookie = parent.encodeCookie({ userid: user._id, domainid: user.domain, nodeid: node._id, tcpport: port }, parent.loginCookieEncryptionKey);
+ render(req, res, getRenderPage('mstsc', req, domain), getRenderArgs({ cookie: cookie, name: encodeURIComponent(node.name) }, req, domain));
+ });
}
// Called to process an agent invite request
@@ -4360,9 +4416,9 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
if (domain.mstsc === true) {
obj.app.get(url + 'mstsc.html', handleMSTSCRequest);
obj.app.ws(url + 'mstsc/relay.ashx', function (ws, req) {
- PerformWSSessionAuth(ws, req, false, function (ws1, req1, domain, user) {
- require('./mstsc.js').CreateMstscRelay(obj, obj.db, ws1, req1, obj.args, domain, user);
- });
+ const domain = getDomain(req);
+ if (domain == null) { parent.debug('web', 'mstsc: failed checks.'); try { ws.close(); } catch (e) { } return; }
+ require('./mstsc.js').CreateMstscRelay(obj, obj.db, ws, req, obj.args, domain);
});
}