From 3c52d13bffab9df992192b186786c2c8fb3b2409 Mon Sep 17 00:00:00 2001 From: Haacked Date: Mon, 23 Sep 2013 16:34:05 -0700 Subject: [PATCH] Port ssh key helpers from GHfW --- Octokit.Tests/Models/ModelExtensionsTests.cs | 66 ++++++++++++++++++++ Octokit.Tests/Octokit.Tests.csproj | 1 + Octokit/GitHubModels.cs | 19 ++++++ Octokit/ModelExtensions.cs | 34 ++++++++++ Octokit/Octokit.csproj | 1 + 5 files changed, 121 insertions(+) create mode 100644 Octokit.Tests/Models/ModelExtensionsTests.cs create mode 100644 Octokit/ModelExtensions.cs diff --git a/Octokit.Tests/Models/ModelExtensionsTests.cs b/Octokit.Tests/Models/ModelExtensionsTests.cs new file mode 100644 index 00000000..0b254915 --- /dev/null +++ b/Octokit.Tests/Models/ModelExtensionsTests.cs @@ -0,0 +1,66 @@ +using Xunit; +using Xunit.Extensions; + +namespace Octokit.Tests.Models +{ + public class ModelExtensionsTests + { + public class TheGetKeyDataAndNameMethod + { + [Theory] + [InlineData("ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA timothy.clem@gmail.com", "AAAAB3NzaC1yc2EAAAABIwAA", "timothy.clem@gmail.com")] + [InlineData("ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA", "AAAAB3NzaC1yc2EAAAABIwAA", "")] + [InlineData("ssh-dss AAAAB3NzaC1yc2EAAAABIwAA", "AAAAB3NzaC1yc2EAAAABIwAA", "")] + [InlineData("ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA", "AAAAB3NzaC1yc2EAAAABIwAA", "")] + public void CanParseKeyData(string raw, string data, string name) + { + var key = new SshKey { Key = raw }; + + SshKeyInfo keyInfo = key.GetKeyDataAndName(); + Assert.Equal(data, keyInfo.Data); + Assert.Equal(name, keyInfo.Name); + } + + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData("apsdfoihat")] + public void ParsingBadDataReturnsNull(string key) + { + Assert.Null(new SshKey { Key = key }.GetKeyDataAndName()); + } + } + + public class TheHasSameDataAsMethod + { + [Fact] + public void ReturnsTrueWhenTwoKeysHaveTheSameData() + { + var key = new SshKey { Key = "ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA", Title = "somekey" }; + var anotherKey = new SshKey { Key = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA", Title = "whatever" }; + + Assert.True(key.HasSameDataAs(anotherKey)); + } + + [Fact] + public void ReturnsFalseWhenCompareKeyIsNull() + { + var key = new SshKey { Key = "ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA", Title = "somekey" }; + + Assert.False(key.HasSameDataAs(null)); + } + + [Theory] + [InlineData(null, "ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA")] + [InlineData("ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA", null)] + [InlineData("ssh-dsa AAAAB3NzaC1yc2EAAAABIwAA", "ssh-dsa AAAAB3NzaC1yc2EAAAABIwAB")] + public void ReturnsFalseWhenTwoKeysHaveDifferentData(string firstKey, string secondKey) + { + var key = new SshKey { Key = firstKey, Title = "somekey" }; + var anotherKey = new SshKey { Key = secondKey, Title = "whatever" }; + + Assert.False(key.HasSameDataAs(anotherKey)); + } + } + } +} diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 56f30b36..28f2aee8 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -75,6 +75,7 @@ + diff --git a/Octokit/GitHubModels.cs b/Octokit/GitHubModels.cs index 9e7b81f5..bb89c0ef 100644 --- a/Octokit/GitHubModels.cs +++ b/Octokit/GitHubModels.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Octokit.Http; @@ -355,6 +356,24 @@ namespace Octokit public string Url { get; set; } } + /// + /// Represents the data and name parsed from the Ssh key. + /// + public class SshKeyInfo + { + public SshKeyInfo(string data, string name) + { + Ensure.ArgumentNotNull(data, "data"); + Ensure.ArgumentNotNull(name, "name"); + + Data = data; + Name = name; + } + + public string Data { get; private set; } + public string Name { get; private set; } + } + public class SshKeyUpdate { /// diff --git a/Octokit/ModelExtensions.cs b/Octokit/ModelExtensions.cs new file mode 100644 index 00000000..b5699286 --- /dev/null +++ b/Octokit/ModelExtensions.cs @@ -0,0 +1,34 @@ +using System.Text.RegularExpressions; + +namespace Octokit +{ + public static class ModelExtensions + { + static readonly Regex sshKeyRegex = new Regex(@"ssh-[rd]s[as] (?\S+) ?(?.*)$", RegexOptions.Compiled); + + public static SshKeyInfo GetKeyDataAndName(this SshKey sshKey) + { + Ensure.ArgumentNotNull(sshKey, "sshKey"); + + var key = sshKey.Key; + if (key == null) return null; + var match = sshKeyRegex.Match(key); + return (match.Success ? new SshKeyInfo(match.Groups["data"].Value, match.Groups["name"].Value) : null); + } + + public static bool HasSameDataAs(this SshKey key, SshKey otherKey) + { + Ensure.ArgumentNotNull(key, "key"); + + if (otherKey == null) return false; + var keyData = key.GetKeyData(); + return keyData != null && keyData == otherKey.GetKeyData(); + } + + static string GetKeyData(this SshKey key) + { + var keyInfo = key.GetKeyDataAndName(); + return keyInfo == null ? null : keyInfo.Data; + } + } +} diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 1fb26bc9..ee754497 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -120,6 +120,7 @@ +