Skip to content

Commit e06e67d

Browse files
feat(agent-installer): refine Agent Tunnel dialog text
Align user-facing strings with the project's UI conventions and remove implementation-specific terminology so the installer reads cleanly to an operator who doesn't (and shouldn't have to) know about transport protocols, token formats, or which Devolutions product minted the enrollment string. - Drop "QUIC" from feature description and dialog title/subtitle. The agent tunnel may be implemented over QUIC today; that's not something the operator running the installer needs to think about. - Drop "JWT" from labels, hints, and error messages. "Enrollment string" is the product term we already use and is self-explanatory. - Drop "Devolutions Server, Hub, or Gateway" enumeration. The enrollment string originates from whatever orchestration tool the operator runs (could be DVLS, Hub, a rebranded distribution, or a future third-party integration). Replace with "your gateway operator" — neutral, accurate, doesn't lock in product names. - Drop the JWT-shape and base64url-decodability checks in `AgentTunnelDialog.DoValidate`. The dialog now only checks the enrollment string is non-empty; structural validation happens at the gateway and the gateway's error reaches the operator verbatim through the InstallMessage.Error surface. Avoids the dialog half-validating implementation details that may evolve. - Tighten dialog title from "Agent Tunnel Configuration" to "Agent Tunnel" to match the noun-phrase pattern in the rest of the wxl catalog (e.g. "Destination Folder", "External URL", "Certificate"). - Normalize casing to Title Case for labels (matching existing "Advertise Subnets:" / "Advertise Domains:"). Hints stay sentence case ending with a period. - Update Agent Name hint to describe the fallback chain in plain English without leaking JWT internals. - Reword the enrollment-timeout failure to prompt the operator to check Gateway reachability, which is the actual recovery action. Same edits applied to the French resource file.
1 parent 81fd4da commit e06e67d

4 files changed

Lines changed: 29 additions & 50 deletions

File tree

package/AgentWindowsManaged/Actions/CustomActions.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -337,16 +337,15 @@ ActionResult Fail(string msg)
337337

338338
if (enrollmentString.Length == 0)
339339
{
340-
return Fail("Agent tunnel feature was selected but no enrollment string was provided. " +
341-
"Paste a JWT from Devolutions Server, Hub, or Gateway, or deselect the Agent Tunnel feature.");
340+
return Fail("An enrollment string is required. Paste the enrollment string provided by your gateway operator, or deselect the Agent Tunnel feature.");
342341
}
343342

344343
try
345344
{
346-
// The enrollment string is the DVLS-signed JWT verbatim. The agent's
347-
// `up --enrollment-string` parses `jet_gw_url` and `jet_agent_name` from the JWT
348-
// claims itself, so we just hand the JWT through. Advertise domains aren't a CLI
349-
// flag — agent.json carries them — so we patch that after enrollment succeeds.
345+
// Hand the enrollment string through verbatim. The agent's
346+
// `up --enrollment-string` parses the gateway URL and agent name out of it.
347+
// Advertise domains aren't a CLI flag — agent.json carries them — so we patch
348+
// that after enrollment succeeds.
350349
string installDir = session.Property(AgentProperties.InstallDir);
351350
string exePath = Path.Combine(installDir, Includes.EXECUTABLE_NAME);
352351

@@ -379,7 +378,7 @@ ActionResult Fail(string msg)
379378
if (!process.WaitForExit(60_000))
380379
{
381380
try { process.Kill(); } catch { /* already gone */ }
382-
return Fail("Agent tunnel enrollment timed out after 60 seconds.");
381+
return Fail("Agent tunnel enrollment timed out. Verify your Devolutions Gateway is reachable from this machine.");
383382
}
384383
string stdout = process.StandardOutput.ReadToEnd();
385384
string stderr = process.StandardError.ReadToEnd();

package/AgentWindowsManaged/Dialogs/AgentTunnelDialog.cs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
using DevolutionsAgent.Properties;
33

44
using System;
5-
using System.Linq;
6-
using System.Text.RegularExpressions;
75
using System.Windows.Forms;
86

97
using WixSharp;
@@ -43,36 +41,18 @@ public override void OnLoad(object sender, EventArgs e)
4341

4442
public override bool DoValidate()
4543
{
46-
// The dialog is only reached when the Agent Tunnel feature is selected (see Wizard.ShouldSkip),
47-
// so an enrollment string is required at this point.
44+
// The dialog is only reached when the Agent Tunnel feature is selected
45+
// (see Wizard.ShouldSkip), so an enrollment string is required here.
46+
// Structural validation of the string itself happens server-side at
47+
// enrollment time — surface that gateway error verbatim rather than
48+
// half-validating implementation details (signature, encoding, etc.)
49+
// here.
4850
if (string.IsNullOrWhiteSpace(enrollmentString.Text))
4951
{
50-
ShowValidationErrorString("Enrollment string is required. Paste a JWT from Devolutions Server, Hub, or Gateway, or go back and deselect the Agent Tunnel feature.");
52+
ShowValidationErrorString("An enrollment string is required. Paste the enrollment string provided by your gateway operator, or go back and deselect the Agent Tunnel feature.");
5153
return false;
5254
}
5355

54-
// JWT shape: three base64url segments separated by dots. The agent's `up --enrollment-string`
55-
// parses the JWT claims for jet_gw_url / jet_agent_name, so the dialog only sanity-checks
56-
// shape and base64url decodability here; signature verification happens at the gateway.
57-
string text = Regex.Replace(enrollmentString.Text, @"\s+", "");
58-
string[] parts = text.Split('.');
59-
if (parts.Length != 3 || parts.Any(string.IsNullOrEmpty))
60-
{
61-
ShowValidationErrorString("Enrollment string must be a JWT (three base64url segments separated by dots).");
62-
return false;
63-
}
64-
foreach (string seg in parts)
65-
{
66-
string b64 = seg.Replace('-', '+').Replace('_', '/');
67-
b64 = b64.PadRight((b64.Length + 3) & ~3, '=');
68-
try { _ = Convert.FromBase64String(b64); }
69-
catch (FormatException)
70-
{
71-
ShowValidationErrorString("Enrollment string is not valid base64url.");
72-
return false;
73-
}
74-
}
75-
7656
return true;
7757
}
7858

package/AgentWindowsManaged/Resources/DevolutionsAgent_en-us.wxl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<String Id="FeatureSessionDescription">Installs the RDP Extension</String>
1111
<String Id="FeatureSessionName">RDP Extension</String>
1212
<String Id="FeatureAgentTunnelName">Agent Tunnel</String>
13-
<String Id="FeatureAgentTunnelDescription">Configure the agent to connect to a Devolutions Gateway via QUIC tunnel. Requires an enrollment string from Devolutions Server, Hub, or Gateway.</String>
13+
<String Id="FeatureAgentTunnelDescription">Connects the agent to a Devolutions Gateway. Requires an enrollment string from your gateway operator.</String>
1414
<String Id="Language">1033</String>
1515
<String Id="ProductDescription">System-wide service for extending Devolutions Gateway functionality.</String>
1616
<String Id="VendorFullName">Devolutions Inc.</String>
@@ -60,13 +60,13 @@ If it appears minimized then active it from the taskbar.</String>
6060
<!-- dialogs.welcome -->
6161
<String Id="WelcomeDlgTitle">Welcome to the [ProductName] 20[ProductVersion] Setup Wizard</String>
6262
<!-- dialogs.agentTunnel -->
63-
<String Id="AgentTunnelDlgTitle">Agent Tunnel Configuration</String>
64-
<String Id="AgentTunnelDlgDescription">Configure connection to a Devolutions Gateway via QUIC tunnel.</String>
65-
<String Id="AgentTunnelDlgEnrollmentStringLabel">Enrollment String (paste the JWT from Devolutions Server, Hub, or Gateway):</String>
63+
<String Id="AgentTunnelDlgTitle">Agent Tunnel</String>
64+
<String Id="AgentTunnelDlgDescription">Connect this agent to a Devolutions Gateway.</String>
65+
<String Id="AgentTunnelDlgEnrollmentStringLabel">Enrollment String (provided by your gateway operator):</String>
66+
<String Id="AgentTunnelDlgAgentNameLabel">Agent Name (Optional):</String>
67+
<String Id="AgentTunnelDlgAgentNameHint">Identifies this agent in your gateway's management console. If left blank, the name embedded in the enrollment string is used, falling back to this computer's name.</String>
6668
<String Id="AgentTunnelDlgSubnetsLabel">Advertise Subnets:</String>
67-
<String Id="AgentTunnelDlgSubnetsHint">Comma-separated CIDR notation, e.g. 10.10.0.0/24, 192.168.1.0/24. Leave blank for auto-detection.</String>
69+
<String Id="AgentTunnelDlgSubnetsHint">Optional. Comma-separated CIDR ranges, e.g. 10.10.0.0/24, 192.168.1.0/24. If left blank, the agent's local subnets are detected automatically.</String>
6870
<String Id="AgentTunnelDlgDomainsLabel">Advertise Domains:</String>
69-
<String Id="AgentTunnelDlgDomainsHint">Comma-separated DNS suffixes the agent can resolve, e.g. corp.example.com, lab.example.com. Leave blank to skip.</String>
70-
<String Id="AgentTunnelDlgAgentNameLabel">Agent name (optional):</String>
71-
<String Id="AgentTunnelDlgAgentNameHint">Identifier for this agent. Leave blank to use the name in the JWT, or the local computer name as a final fallback.</String>
71+
<String Id="AgentTunnelDlgDomainsHint">Optional. Comma-separated DNS suffixes the agent can resolve, e.g. corp.example.com, lab.example.com.</String>
7272
</WixLocalization>

package/AgentWindowsManaged/Resources/DevolutionsAgent_fr-fr.wxl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
<String Id="FeatureSessionDescription">Installe l'extension RDP</String>
55
<String Id="FeatureSessionName">Extension RDP</String>
66
<String Id="FeatureAgentTunnelName">Tunnel d'agent</String>
7-
<String Id="FeatureAgentTunnelDescription">Configurer l'agent pour se connecter à une passerelle Devolutions via un tunnel QUIC. Nécessite une chaîne d'enrôlement depuis Devolutions Server, Hub, ou Gateway.</String>
8-
<String Id="AgentTunnelDlgTitle">Configuration du tunnel d'agent</String>
9-
<String Id="AgentTunnelDlgDescription">Configurer la connexion à une passerelle Devolutions via un tunnel QUIC.</String>
10-
<String Id="AgentTunnelDlgEnrollmentStringLabel">Chaîne d'enrôlement (collez le JWT depuis Devolutions Server, Hub ou Gateway) :</String>
7+
<String Id="FeatureAgentTunnelDescription">Connecte l'agent à une passerelle Devolutions. Nécessite une chaîne d'enrôlement fournie par l'opérateur de votre passerelle.</String>
8+
<String Id="AgentTunnelDlgTitle">Tunnel d'agent</String>
9+
<String Id="AgentTunnelDlgDescription">Connectez cet agent à une passerelle Devolutions.</String>
10+
<String Id="AgentTunnelDlgEnrollmentStringLabel">Chaîne d'enrôlement (fournie par l'opérateur de votre passerelle) :</String>
11+
<String Id="AgentTunnelDlgAgentNameLabel">Nom de l'agent (facultatif) :</String>
12+
<String Id="AgentTunnelDlgAgentNameHint">Identifie cet agent dans la console de gestion de votre passerelle. Si laissé vide, le nom contenu dans la chaîne d'enrôlement est utilisé, à défaut le nom de cet ordinateur.</String>
1113
<String Id="AgentTunnelDlgSubnetsLabel">Sous-réseaux annoncés :</String>
12-
<String Id="AgentTunnelDlgSubnetsHint">Notation CIDR séparée par des virgules, p. ex. 10.10.0.0/24, 192.168.1.0/24. Laissez vide pour la détection automatique.</String>
14+
<String Id="AgentTunnelDlgSubnetsHint">Facultatif. Plages CIDR séparées par des virgules, p. ex. 10.10.0.0/24, 192.168.1.0/24. Si laissé vide, les sous-réseaux locaux de l'agent sont détectés automatiquement.</String>
1315
<String Id="AgentTunnelDlgDomainsLabel">Domaines annoncés :</String>
14-
<String Id="AgentTunnelDlgDomainsHint">Suffixes DNS séparés par des virgules que l'agent peut résoudre, p. ex. corp.example.com, lab.example.com. Laissez vide pour ignorer.</String>
15-
<String Id="AgentTunnelDlgAgentNameLabel">Nom de l'agent (facultatif) :</String>
16-
<String Id="AgentTunnelDlgAgentNameHint">Identifiant de cet agent. Laissez vide pour utiliser le nom inscrit dans le JWT, ou le nom de l'ordinateur local comme dernier recours.</String>
16+
<String Id="AgentTunnelDlgDomainsHint">Facultatif. Suffixes DNS séparés par des virgules que l'agent peut résoudre, p. ex. corp.example.com, lab.example.com.</String>
1717
<String Id="Language">1036</String>
1818
<String Id="ProductDescription">Service à l’échelle du système pour étendre les fonctionnalités de Devolutions Gateway.</String>
1919
<String Id="VendorFullName">Devolutions Inc.</String>

0 commit comments

Comments
 (0)