diff --git a/build.ps1 b/build.ps1 index 71990e9..126ff65 100644 --- a/build.ps1 +++ b/build.ps1 @@ -143,9 +143,10 @@ if (!(Test-Path $CAKE_EXE)) { [System.Net.ServicePointManager]::SecurityProtocol = $previousSecurityProtocol +$scpt="${PSScriptRoot}/${Script}" # Build Cake arguments -$cakeArguments = @("$Script"); +$cakeArguments = @("$scpt"); if ($Target) { $cakeArguments += "--target=$Target" } if ($Configuration) { $cakeArguments += "--configuration=$Configuration" } if ($Version) { $cakeArguments += "--version=$Version" } @@ -157,6 +158,6 @@ if ($Pre) { $cakeArguments += "--pre=true" } $cakeArguments += $ScriptArgs # Start Cake -Write-Host "Running build script..." +Write-Host "Running build script for Scalus..." &$CAKE_EXE $cakeArguments exit $LASTEXITCODE diff --git a/polaris.yml b/polaris.yml index db3d174..7b88e39 100644 --- a/polaris.yml +++ b/polaris.yml @@ -8,9 +8,9 @@ project: capture: build: cleanCommands: - - shell: [powershell, ./build.ps1, "-Target clean"] + - shell: [powershell, "${project.projectDir}/build.ps1", "-Target clean"] buildCommands: - - shell: [powershell, ./build.ps1] + - shell: [powershell, "${project.projectDir}/build.ps1"] fileSystem: ears: extensions: [ear] diff --git a/scripts/Win/Product.wxs b/scripts/Win/Product.wxs index 81e7261..8fd4941 100644 --- a/scripts/Win/Product.wxs +++ b/scripts/Win/Product.wxs @@ -3,14 +3,15 @@ - + - - + + NOT NEWERVERSIONDETECTED + @@ -65,15 +66,11 @@ - - - - - + diff --git a/src/CommandLineHandler.cs b/src/CommandLineHandler.cs index 70887de..fb27d29 100644 --- a/src/CommandLineHandler.cs +++ b/src/CommandLineHandler.cs @@ -23,21 +23,22 @@ public CommandLineHandler(IEnumerable verbs) public IApplication Build(string[] args, Func appResolver) { - var parser = new CommandLine.Parser(with => { + using (var parser = new CommandLine.Parser(with => { with.HelpWriter = null; - }); - - var verbTypes = Verbs.Select(x => x.GetType()).OrderBy(x => x.GetCustomAttribute().Name).ToArray(); - var parserResult = parser.ParseArguments(args, verbTypes); + })) + { + var verbTypes = Verbs.Select(x => x.GetType()).OrderBy(x => x?.GetCustomAttribute()?.Name)?.ToArray(); + var parserResult = parser.ParseArguments(args, verbTypes); - IApplication application = null; - parserResult - .WithParsed(x => - { - application = appResolver(x); - }) - .WithNotParsed(x => HandleErrors(parserResult, x)); - return application; + IApplication application = null; + parserResult + .WithParsed(x => + { + application = appResolver(x); + }) + .WithNotParsed(x => HandleErrors(parserResult, x)); + return application; + } } static void HandleErrors(ParserResult parserResult, IEnumerable errs) @@ -48,7 +49,7 @@ static void HandleErrors(ParserResult parserResult, IEnumerable err // Handle version if (errs.IsVersion()) { - Console.WriteLine($"{header}\r\n{copyright}\r\nVersion: {Assembly.GetEntryAssembly().GetName().Version}\r\n"); + Console.WriteLine($"{header}\r\n{copyright}\r\nVersion: {Assembly.GetEntryAssembly()?.GetName()?.Version}\r\n"); return; } diff --git a/src/Dto/ApplicationConfig.cs b/src/Dto/ApplicationConfig.cs index 23f5cfb..899223c 100644 --- a/src/Dto/ApplicationConfig.cs +++ b/src/Dto/ApplicationConfig.cs @@ -59,9 +59,9 @@ public void Validate(List errors) { errors.Add($"An Exec must be configured for application:{Name}({Id})"); } - if (string.IsNullOrEmpty(Protocol)) + if (!ProtocolMapping.ValidateProtocol(Protocol, out string err)) { - errors.Add($"A protocol must be configured for application:{Name}({Id})"); + errors.Add(err); } if (string.IsNullOrEmpty(Name)) { diff --git a/src/Dto/ProtocolMapping.cs b/src/Dto/ProtocolMapping.cs index e2b956f..5684b52 100644 --- a/src/Dto/ProtocolMapping.cs +++ b/src/Dto/ProtocolMapping.cs @@ -1,13 +1,30 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; using Newtonsoft.Json; namespace scalus.Dto { public class ProtocolMapping { + public static bool ValidateProtocol(string val, out string err) + { + err=null; + if (string.IsNullOrEmpty(val)) + { + err =("Protocol name must be configured"); + return false; + } + if (Regex.IsMatch(val, "^[a-zA-Z][a-zA-Z0-9-+.]+$")) + { + return true; + } + err =($"Protocol name contains invalid chars:{val}"); + return false; + } + [JsonRequired] - public string Protocol { get; set; } + public string Protocol { get;set; } public string AppId { get; set; } private static readonly Dictionary _dtoPropertyDescription = new Dictionary @@ -20,9 +37,9 @@ public class ProtocolMapping public void Validate(List errors) { - if (string.IsNullOrEmpty(Protocol)) + if (!ValidateProtocol(Protocol, out string err)) { - errors.Add("Protocol name must be configured"); + errors.Add(err); } } } diff --git a/src/IScalusConfiguration.cs b/src/IScalusConfiguration.cs index deb5524..c6d0994 100644 --- a/src/IScalusConfiguration.cs +++ b/src/IScalusConfiguration.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Text; +using System.Threading.Tasks; namespace scalus { @@ -22,7 +23,7 @@ interface IScalusConfiguration public interface IScalusApiConfiguration { ScalusConfig GetConfiguration(); - ScalusConfig SaveConfiguration(ScalusConfig configuration); + List SaveConfiguration(ScalusConfig configuration); List ValidationErrors { get; } } diff --git a/src/Info/Application.cs b/src/Info/Application.cs index 9ce66ba..efbc6e7 100644 --- a/src/Info/Application.cs +++ b/src/Info/Application.cs @@ -53,37 +53,39 @@ private void ShowConfig() "); Console.WriteLine(" {0,-10} {1,-10} {2,-20} {3}", "Protocol", "Registered", "Description", "Configured Command"); Console.WriteLine(" ------------------------------------------------------------------------------------------------"); - if (config?.Protocols?.Count > 0) + if (config == null || config.Protocols == null || config.Protocols.Count == 0) + return; + + foreach (var one in config.Protocols) { - foreach (var one in config.Protocols) + if (one == null) + continue; + Console.Write(" {0,-10} ", one.Protocol); + ApplicationConfig appConfig = null; + if (config.Applications?.Count > 0) { - Console.Write(" {0,-10} ", one.Protocol); - ApplicationConfig appConfig = null; - if (config?.Applications?.Count > 0) - { - foreach (var a in from a in config.Applications - where a.Id == one.AppId + foreach (var a in from a in config.Applications + where a.Id == one.AppId select a) - { - appConfig = a; - break; - } - } - - if (appConfig != null) { - Console.Write("{0,-10} {1,-20} ({2} {3})", - Registration.IsRegistered(one.Protocol) ? "yes" : "no", appConfig.Description, - appConfig.Exec, string.Join(' ', appConfig.Args)); - } - else - { - Console.Write("{0,-10} {1,-20}", Registration.IsRegistered(one.Protocol) ? "yes" : "no", - "Not configured"); + appConfig = a; + break; } + } - Console.WriteLine(); + if (appConfig != null) + { + Console.Write("{0,-10} {1,-20} ({2} {3})", + Registration.IsRegistered(one.Protocol) ? "yes" : "no", appConfig.Description, + appConfig.Exec, string.Join(' ', appConfig.Args)); } + else + { + Console.Write("{0,-10} {1,-20}", Registration.IsRegistered(one.Protocol) ? "yes" : "no", + "Not configured"); + } + + Console.WriteLine(); } } diff --git a/src/Launch/Application.cs b/src/Launch/Application.cs index a196ba6..57a2f88 100644 --- a/src/Launch/Application.cs +++ b/src/Launch/Application.cs @@ -70,7 +70,7 @@ private void HandleLaunchError(Exception ex, string url) ApplicationId: {application?.Id ?? ""} Command: {application?.Exec ?? ""} - Args: {(application.Args != null ? string.Join(" ", application.Args) : "")} + Args: {(application?.Args != null ? string.Join(" ", application?.Args) : "")} Config File: {scalusJsonPath} diff --git a/src/Platform/OsServicesBase.cs b/src/Platform/OsServicesBase.cs index b465f2a..29082cb 100644 --- a/src/Platform/OsServicesBase.cs +++ b/src/Platform/OsServicesBase.cs @@ -52,7 +52,7 @@ public Process Execute(string command, IEnumerable args) } Log.Logger.Information($"Running process:{command} with args:{string.Join(' ', args)}"); var process = Process.Start(startupInfo); - Log.Logger.Information($"Started process, id:{process.Id}, exited:{process.HasExited}"); + Log.Logger.Information($"Started process, id:{process?.Id}, exited:{process?.HasExited}"); return process; } //execute a command, wait for it to end, return the exit code and retrieve the stdout & stderr @@ -124,13 +124,19 @@ public void OpenText(string message) File.WriteAllText(tempFile, message); var l = File.ReadAllText(tempFile); var process = OpenDefault(tempFile); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (process == null) { - process.WaitForExit(); - } - else - { - Task.Delay(10* 1000).Wait(); + Log.Error($"Failed to report warning:{message}"); + } + else { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + process.WaitForExit(); + } + else + { + Task.Delay(10* 1000).Wait(); + } } } catch (System.Exception ex) diff --git a/src/Program.cs b/src/Program.cs index b4bfcfe..5421e29 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -32,8 +32,8 @@ static int Main(string[] args) var application = parser.Build(args, x => { var type = x.GetType(); - var verb = type.GetCustomAttribute().Name; - return lifetimeScope.ResolveNamed(verb, new TypedParameter(type, x)); + var verb = type?.GetCustomAttribute()?.Name; + return verb == null ? null : lifetimeScope.ResolveNamed(verb, new TypedParameter(type, x)); }); // If application is null, then they ran help or version commands, just return diff --git a/src/ProtocolHandler.cs b/src/ProtocolHandler.cs index 7c1faf3..37c1ea7 100644 --- a/src/ProtocolHandler.cs +++ b/src/ProtocolHandler.cs @@ -83,6 +83,11 @@ public void Run(bool preview = false) return; } var process = OsServices.Execute(cmd, args); + if (process == null) + { + Serilog.Log.Error("Failed to create process for cmd:{cmd}"); + throw new Exception($"Failed to create process for cmd:{cmd}"); + } Serilog.Log.Debug("Post execute starting."); Parser.PostExecute(process); diff --git a/src/Registration.cs b/src/Registration.cs index 02dfd45..bd16b16 100644 --- a/src/Registration.cs +++ b/src/Registration.cs @@ -22,6 +22,12 @@ IOsServices osServices public bool IsRegistered(string protocol, bool useSudo = false) { + if (!ProtocolMapping.ValidateProtocol(protocol, out string err)) + { + Serilog.Log.Error($"Invalid protocol:{protocol}"); + UserInteraction.Message($"{protocol}: The protocol is invalid."); + return false; + } var registered = true; foreach (var registrar in Registrars) { @@ -37,10 +43,16 @@ public bool IsRegistered(string protocol, bool useSudo = false) public bool Register(IEnumerable protocols, bool force, bool rootMode = false, bool useSudo=false) { var retval = false; - foreach (var protocol in protocols) { retval = true; + if (!ProtocolMapping.ValidateProtocol(protocol, out string err)) + { + retval = false; + Serilog.Log.Error($"{err}"); + UserInteraction.Message($"{protocol}: {err}"); + continue; + } foreach (var registrar in Registrars) { @@ -89,6 +101,13 @@ public bool UnRegister(IEnumerable protocols, bool rootMode = false, boo { foreach (var protocol in protocols) { + if (!ProtocolMapping.ValidateProtocol(protocol, out string err)) + { + Serilog.Log.Error($"{err}"); + UserInteraction.Message($"{protocol}: {err}"); + continue; + } + foreach (var registrar in Registrars) { if (rootMode) diff --git a/src/ScalusConfiguration.cs b/src/ScalusConfiguration.cs index 67e67eb..7103258 100644 --- a/src/ScalusConfiguration.cs +++ b/src/ScalusConfiguration.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using scalus.Util; +using System.Threading.Tasks; namespace scalus { @@ -105,7 +106,7 @@ public ScalusApiConfiguration(string json) { } - public ScalusConfig SaveConfiguration(ScalusConfig configuration) + public List SaveConfiguration(ScalusConfig configuration) { ValidationErrors = new List(); @@ -125,7 +126,7 @@ public ScalusConfig SaveConfiguration(ScalusConfig configuration) Serilog.Log.Error($"*** Validation errors: {string.Join(", ", ValidationErrors)}"); } - return Config; + return ValidationErrors; } diff --git a/src/Ui/Controllers/ConfigurationController.cs b/src/Ui/Controllers/ConfigurationController.cs index 537d9a6..aa60292 100644 --- a/src/Ui/Controllers/ConfigurationController.cs +++ b/src/Ui/Controllers/ConfigurationController.cs @@ -39,13 +39,15 @@ public IActionResult Get() } [HttpPut] - public void Post([FromBody] ScalusConfig value) + [ProducesResponseType(StatusCodes.Status200OK)] + public IActionResult Post([FromBody] ScalusConfig value) { - Configuration.SaveConfiguration(value); - if (Configuration.ValidationErrors?.Count > 0) + var errs = Configuration.SaveConfiguration(value); + if (errs?.Count > 0) { - throw new Exception("Invalid configuration"); + return StatusCode(StatusCodes.Status500InternalServerError); } + return Ok(); } [HttpGet, Route("Registrations")] @@ -69,33 +71,41 @@ public IActionResult Registrations() } [HttpPut, Route("Register")] - public void Register([FromBody] ProtocolMapping protocolMapping) - { - var config = Configuration.GetConfiguration(); - foreach (var one in config.Protocols) + [ProducesResponseType(StatusCodes.Status200OK)] + public IActionResult Register([FromBody] ProtocolMapping protocolMapping) + { + if (!ProtocolMapping.ValidateProtocol(protocolMapping.Protocol, out string err)) { - if (one.Protocol.Equals(protocolMapping.Protocol) && - !Registration.IsRegistered(one.Protocol)) - { - var protocols = new List { one.Protocol }; - Registration.Register(protocols, true); - } + Serilog.Log.Error($"Cannot register invalid protocol:{protocolMapping.Protocol}:{err}"); + return BadRequest(); + } + if (Registration.IsRegistered(protocolMapping.Protocol)) + { + return Ok(); } + if (Registration.Register(new List { protocolMapping.Protocol }, true)) + return Ok(); + Serilog.Log.Error($"Cannot register {protocolMapping.Protocol} : registration reported failure"); + return UnprocessableEntity(); } [HttpPut, Route("UnRegister")] - public void UnRegister([FromBody] ProtocolMapping protocolMapping) + [ProducesResponseType(StatusCodes.Status200OK)] + public IActionResult UnRegister([FromBody] ProtocolMapping protocolMapping) { - var config = Configuration.GetConfiguration(); - foreach (var one in config.Protocols) + if (!ProtocolMapping.ValidateProtocol(protocolMapping.Protocol, out string err)) { - if (one.Protocol.Equals(protocolMapping.Protocol) && - Registration.IsRegistered(one.Protocol)) - { - var protocols = new List { one.Protocol }; - Registration.UnRegister(protocols); - } + Serilog.Log.Error($"Cannot register invalid protocol:{protocolMapping.Protocol}:{err}"); + return BadRequest(); + } + if (!Registration.IsRegistered(protocolMapping.Protocol)) + { + return Ok(); } + if (Registration.UnRegister(new List { protocolMapping.Protocol })) + return Ok(); + Serilog.Log.Error($"Protocol: {protocolMapping.Protocol} -deregistration reported failure"); + return UnprocessableEntity(); } [HttpGet, Route("Tokens")] diff --git a/src/Util/RegistryUtils.cs b/src/Util/RegistryUtils.cs index 43bb4bc..53caec6 100644 --- a/src/Util/RegistryUtils.cs +++ b/src/Util/RegistryUtils.cs @@ -15,9 +15,10 @@ private static RegistryKey EnsureWritable(RegistryKey key) private static RegistryKey EnsurePath(string path) { + RegistryKey curKey = null; try { - var curKey = GetPrefix(ref path); + curKey = GetPrefix(ref path); var parts = path.Split('\\'); foreach (var part in parts) @@ -25,20 +26,37 @@ private static RegistryKey EnsurePath(string path) var key = curKey; try { - curKey = key.CreateSubKey(part); // Try to create/open read/write + curKey = key?.CreateSubKey(part); // Try to create/open read/write } - catch (UnauthorizedAccessException) + catch (UnauthorizedAccessException e) { - curKey = key.OpenSubKey(part); // Try to open readonly + Serilog.Log.Error(e, $"Failed to create registry key [{key}] [{part}]"); + curKey = key?.OpenSubKey(part); // Try to open readonly + if (curKey == null) + return null; + } + finally + { + if (curKey == null) + { + Serilog.Log.Warning($"Failed to create registry key [{key}] [{part}]"); + } } - if (curKey == null) return null; } - return EnsureWritable(curKey); // Explicitly reopen with write access + return curKey == null ? null : EnsureWritable(curKey); // Explicitly reopen with write access } - catch (Exception) + catch (Exception e) { + Serilog.Log.Error(e, $"Failed to create registry key from path:{path}"); return null; } + finally + { + if (curKey == null) + { + Serilog.Log.Error($"Failed to create registry key from path:{path}"); + } + } } public static RegistryKey GetKey(string path) diff --git a/test/TestDefaultRdpUrlParser.cs b/test/TestDefaultRdpUrlParser.cs index 6f23a76..d0ec466 100644 --- a/test/TestDefaultRdpUrlParser.cs +++ b/test/TestDefaultRdpUrlParser.cs @@ -17,9 +17,8 @@ public void Test1() { //Rdp string //full+address=s:host&username=s:safeguarduserstring - var sut = new DefaultRdpUrlParser(new Dto.ParserConfig()); - - + using (var sut = new DefaultRdpUrlParser(new Dto.ParserConfig())) + { var prot="rdp"; var host="10.5.32.168"; var port="3389"; @@ -53,7 +52,7 @@ public void Test1() Assert.Equal(uri, dictionary[Token.OriginalUrl]); Assert.Equal(str, dictionary[Token.RelativeUrl]); Assert.Equal(prot, dictionary[Token.Protocol]); - + } } [Fact] @@ -169,7 +168,7 @@ public void Test4() //standard URI //myprot://myuser:mypass@myhost:2222/thisisapath?queryit#fragment - sut = new DefaultRdpUrlParser(new Dto.ParserConfig()); + using (sut = new DefaultRdpUrlParser(new Dto.ParserConfig())) { str="myuser%5c:mypass@myhost:3456/thisisapath?queryit#fragment"; var uri=$"myprot://{str}"; @@ -185,24 +184,25 @@ public void Test4() Assert.Equal("queryit", dictionary[Token.Query]); Assert.Equal("fragment", dictionary[Token.Fragment]); Assert.False(dictionary.ContainsKey(Token.GeneratedFile)); - + } } [Fact] public void Test5() { - var sut = new DefaultTelnetUrlParser(new Dto.ParserConfig()); + using( var sut = new DefaultTelnetUrlParser(new Dto.ParserConfig())) { var dictionary=sut.Parse("tel://myuser@myhost"); Assert.Equal("tel://myuser@myhost", dictionary[Token.OriginalUrl]); Assert.Equal("myuser@myhost", dictionary[Token.RelativeUrl]); Assert.Equal("tel", dictionary[Token.Protocol]); Assert.Equal("myuser", dictionary[Token.User]); Assert.Equal("myhost", dictionary[Token.Host]); + } } [Fact] public void Test6() { - var sut = new UrlParser.UrlParser(new Dto.ParserConfig()); + using (var sut = new UrlParser.UrlParser(new Dto.ParserConfig())) { var dictionary=sut.Parse("customprotocol://user:password@www.myhost.com:111/mylocation"); Assert.Equal("customprotocol://user:password@www.myhost.com:111/mylocation", dictionary[Token.OriginalUrl]); Assert.Equal("user:password@www.myhost.com:111/mylocation", dictionary[Token.RelativeUrl]); @@ -211,6 +211,7 @@ public void Test6() Assert.Equal("www.myhost.com", dictionary[Token.Host]); Assert.Equal("mylocation", dictionary[Token.Path]); Assert.Equal("111", dictionary[Token.Port]); + } } } diff --git a/test/TestDefaultSshUrlParser.cs b/test/TestDefaultSshUrlParser.cs index 193d7fa..945cc89 100644 --- a/test/TestDefaultSshUrlParser.cs +++ b/test/TestDefaultSshUrlParser.cs @@ -1,4 +1,4 @@ -using System; +using System ; using System.Web; using scalus.UrlParser; using Xunit; @@ -12,32 +12,34 @@ public class TestDefaultSshUrlParser public void Test1() { //generic user@host - var sut = new DefaultSshUrlParser(new Dto.ParserConfig()); - var str="key=value%40whatever%4012.23.43.2@1.2.3.4:33"; - var dictionary = sut.Parse(str); - Assert.Equal("ssh", dictionary[Token.Protocol]); - Assert.Equal(str, dictionary[Token.OriginalUrl]); - Assert.Equal(str, dictionary[Token.RelativeUrl]); - Assert.Equal("key=value@whatever@12.23.43.2", dictionary[Token.User]); - Assert.Equal("1.2.3.4", dictionary[Token.Host]); - Assert.Equal("33", dictionary[Token.Port]); - + using (var sut = new DefaultSshUrlParser(new Dto.ParserConfig())) + { + var str="key=value%40whatever%4012.23.43.2@1.2.3.4:33"; + var dictionary = sut.Parse(str); + Assert.Equal("ssh", dictionary[Token.Protocol]); + Assert.Equal(str, dictionary[Token.OriginalUrl]); + Assert.Equal(str, dictionary[Token.RelativeUrl]); + Assert.Equal("key=value@whatever@12.23.43.2", dictionary[Token.User]); + Assert.Equal("1.2.3.4", dictionary[Token.Host]); + Assert.Equal("33", dictionary[Token.Port]); + } //ssh://user@host - sut = new DefaultSshUrlParser(new Dto.ParserConfig()); - str="key=value%40whatever%4012.23.43.2@1.2.3.4:33"; - dictionary = sut.Parse($"ssh://{str}"); - - Assert.Equal("ssh", dictionary[Token.Protocol]); - Assert.Equal($"ssh://{str}", dictionary[Token.OriginalUrl]); - Assert.Equal(str, dictionary[Token.RelativeUrl]); - Assert.Equal("key=value@whatever@12.23.43.2", dictionary[Token.User]); - Assert.Equal("1.2.3.4", dictionary[Token.Host]); - Assert.Equal("33", dictionary[Token.Port]); - - str = "ssh://root%4010.1.1.1"; - dictionary = sut.Parse(str); - + using (var sut = new DefaultSshUrlParser(new Dto.ParserConfig())) + { + var str="key=value%40whatever%4012.23.43.2@1.2.3.4:33"; + var dictionary = sut.Parse($"ssh://{str}"); + + Assert.Equal("ssh", dictionary[Token.Protocol]); + Assert.Equal($"ssh://{str}", dictionary[Token.OriginalUrl]); + Assert.Equal(str, dictionary[Token.RelativeUrl]); + Assert.Equal("key=value@whatever@12.23.43.2", dictionary[Token.User]); + Assert.Equal("1.2.3.4", dictionary[Token.Host]); + Assert.Equal("33", dictionary[Token.Port]); + + str = "ssh://root%4010.1.1.1"; + dictionary = sut.Parse(str); + } } [Fact] @@ -45,7 +47,7 @@ public void Test2() { //ssh://safeguarduserstring@host - var sut = new DefaultSshUrlParser(new Dto.ParserConfig()); + using (var sut = new DefaultSshUrlParser(new Dto.ParserConfig())){ //vaultaddress=(.*)@token=(.*)@(.*)@(.*)@(.*) var prot = "ssh"; var vault="10.5.33.84"; @@ -120,7 +122,7 @@ public void Test2() Assert.Equal("10.5.34.42", dictionary[Token.TargetHost]); Assert.Equal("10.5.33.88", dictionary[Token.Host]); Assert.Equal(HttpUtility.UrlDecode(userstr), dictionary[Token.User]); - + } } @@ -128,7 +130,7 @@ public void Test2() public void Test3() { var str = "abc"; - var sut = new DefaultSshUrlParser(new Dto.ParserConfig()); + using (var sut = new DefaultSshUrlParser(new Dto.ParserConfig())){ Assert.ThrowsAny(() => sut.Parse(str)); str = "ssh://abc/"; @@ -136,6 +138,7 @@ public void Test3() Assert.Equal("ssh://abc/", dictionary[Token.OriginalUrl]); Assert.Equal("abc/", dictionary[Token.RelativeUrl]); Assert.Equal("ssh", dictionary[Token.Protocol]); + } } } diff --git a/test/TestLaunchArgs.cs b/test/TestLaunchArgs.cs index 5cae19b..c83524b 100644 --- a/test/TestLaunchArgs.cs +++ b/test/TestLaunchArgs.cs @@ -63,7 +63,8 @@ private IDictionary SetupData() [Fact] public void Test1() { - var parser = new DefaultSshUrlParser(new Dto.ParserConfig(), SetupData()); + using( var parser = new DefaultSshUrlParser(new Dto.ParserConfig(), SetupData())) + { var args = new List() { $"%{Token.Protocol}%", @@ -151,7 +152,7 @@ public void Test1() Assert.True(one.MoveNext()); Assert.Equal("thisismyhosthide", one.Current); Assert.False(one.MoveNext()); - + } } [Fact] @@ -325,8 +326,33 @@ public void TestJson() } "; CheckJson(json, 1); + + json = "{'Protocols':[{'Protocol':'one$'}]}"; + CheckJson(json, 1); } + [Fact] + public void TestJson1() + { + var json = "{'Protocols':[{'Protocol':'one$'}]}"; + CheckJson(json, 1); + json = "{'Protocols':[{'Protocol':'1one'}]}"; + CheckJson(json, 1); + json = "{'Protocols':[{'Protocol':'one_'}]}"; + CheckJson(json, 1); + json = "{'Protocols':[{'Protocol':'one-'}]}"; + CheckJson(json, 0); + json = "{'Protocols':[{'Protocol':'one+'}]}"; + CheckJson(json, 0); + json = "{'Protocols':[{'Protocol':'one.'}]}"; + CheckJson(json, 0); + json = "{'Protocols':[{'Protocol':'one111'}]}"; + CheckJson(json, 0); + + + + + } [Fact] public void TestInstalledJson()