From 5e408b3192fbc8b3d41836f4492f9f09e6fefb0b Mon Sep 17 00:00:00 2001 From: Joey Gerits Date: Tue, 7 Jan 2025 10:38:51 +0100 Subject: [PATCH 1/3] Added BasicAuth for testing purposes --- trino-csharp/Trino.Client/Auth/BasicAuth.cs | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 trino-csharp/Trino.Client/Auth/BasicAuth.cs diff --git a/trino-csharp/Trino.Client/Auth/BasicAuth.cs b/trino-csharp/Trino.Client/Auth/BasicAuth.cs new file mode 100644 index 0000000..2dba6f6 --- /dev/null +++ b/trino-csharp/Trino.Client/Auth/BasicAuth.cs @@ -0,0 +1,45 @@ +using System; +using System.Net.Http; +using System.Text; + +namespace Trino.Client.Auth +{ + /// + /// For testing purposes, you can use the BasicAuth class to authenticate with Trino. + /// + public class BasicAuth : ITrinoAuth + { + public BasicAuth() + { + User = "admin"; + } + public BasicAuth(string user) + { + User = user; + } + + public string User + { + get; + set; + } + + public void AuthorizeAndValidate() + { + if (string.IsNullOrEmpty(User) ) + { + throw new ArgumentException("LDAPAuth: username property is null or empty"); + } + } + + /// + /// Modify the request with authentication + /// + /// Http request message + public virtual void AddCredentialToRequest(HttpRequestMessage httpRequestMessage) + { + var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{User}" )); + httpRequestMessage.Headers.Add("Authorization", "Basic " + credentials); + } + } +} From 6506cae4b2dc5b1d35b79fcf4e3f195199ca98f4 Mon Sep 17 00:00:00 2001 From: Joey Gerits Date: Thu, 9 Jan 2025 14:34:46 +0100 Subject: [PATCH 2/3] Fix the basicAuth and add unit tests --- .../ConnectionStringTests.cs | 24 +++++++++++++++++++ trino-csharp/Trino.Client/Auth/BasicAuth.cs | 7 +----- .../Utilities/ConnectionStringUtils.cs | 3 ++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/trino-csharp/Trino.Client.Test/ConnectionStringTests.cs b/trino-csharp/Trino.Client.Test/ConnectionStringTests.cs index d88cdb8..a3be278 100644 --- a/trino-csharp/Trino.Client.Test/ConnectionStringTests.cs +++ b/trino-csharp/Trino.Client.Test/ConnectionStringTests.cs @@ -143,5 +143,29 @@ public void LDAPAuth() // verify the connection string can be regenerated Assert.IsNotNull(connection.ConnectionString); } + + [TestMethod] + public void BasicAuth() + { + const string host = "host.trino.com"; + const string auth = "BasicAuth"; + const string user = "user"; + const string defaultPort = "443"; + const string scheme = "https"; + + string connectionString = + $"host={host};auth={auth};user={user}"; + + TrinoConnection connection = new TrinoConnection(); + connection.ConnectionString = connectionString; + Assert.AreEqual(connection.ConnectionSession.Properties.Server.Host, host); + Assert.AreEqual(connection.ConnectionSession.Properties.Server.Port.ToString(), defaultPort); + Assert.AreEqual(connection.ConnectionSession.Properties.Server.Scheme, scheme); + Assert.AreEqual(connection.ConnectionSession.Auth.GetType().Name, auth, StringComparer.InvariantCultureIgnoreCase); + Assert.AreEqual(((BasicAuth)connection.ConnectionSession.Auth).User, user); + + // verify the connection string can be regenerated + Assert.IsNotNull(connection.ConnectionString); + } } } diff --git a/trino-csharp/Trino.Client/Auth/BasicAuth.cs b/trino-csharp/Trino.Client/Auth/BasicAuth.cs index 2dba6f6..6058ddd 100644 --- a/trino-csharp/Trino.Client/Auth/BasicAuth.cs +++ b/trino-csharp/Trino.Client/Auth/BasicAuth.cs @@ -11,11 +11,6 @@ public class BasicAuth : ITrinoAuth { public BasicAuth() { - User = "admin"; - } - public BasicAuth(string user) - { - User = user; } public string User @@ -28,7 +23,7 @@ public void AuthorizeAndValidate() { if (string.IsNullOrEmpty(User) ) { - throw new ArgumentException("LDAPAuth: username property is null or empty"); + throw new ArgumentException("BasicAuth: username property is null or empty"); } } diff --git a/trino-csharp/Trino.Data.ADO/Utilities/ConnectionStringUtils.cs b/trino-csharp/Trino.Data.ADO/Utilities/ConnectionStringUtils.cs index 85a8f23..754c159 100644 --- a/trino-csharp/Trino.Data.ADO/Utilities/ConnectionStringUtils.cs +++ b/trino-csharp/Trino.Data.ADO/Utilities/ConnectionStringUtils.cs @@ -296,7 +296,8 @@ private static Dictionary BuildAuthTypesMap(IEnumerable addi // JWT is built in, but additional auth providers can originate from other DLLs to keep dependencies minimal Type jwtAuth = typeof(TrinoJWTAuth); Type ldapAuth = typeof(LDAPAuth); - Dictionary authTypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { { jwtAuth.Name, jwtAuth }, { ldapAuth.Name, ldapAuth } }; + Type basicAuth = typeof(BasicAuth); + Dictionary authTypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { { jwtAuth.Name, jwtAuth }, { ldapAuth.Name, ldapAuth }, {basicAuth.Name, basicAuth} }; if (additionalAuthProviders != null) { From 17b8c3b2f35df7ac400bf10f0147aacddd9fd1fe Mon Sep 17 00:00:00 2001 From: Joey Gerits Date: Wed, 22 Jan 2025 11:00:28 +0100 Subject: [PATCH 3/3] Update code to make BasicAuth more usable and let LDAPAuth extend basicauth --- trino-csharp/Trino.Client/Auth/BasicAuth.cs | 14 ++++++++--- trino-csharp/Trino.Client/Auth/LDAPAuth.cs | 26 ++------------------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/trino-csharp/Trino.Client/Auth/BasicAuth.cs b/trino-csharp/Trino.Client/Auth/BasicAuth.cs index 6058ddd..d22cadf 100644 --- a/trino-csharp/Trino.Client/Auth/BasicAuth.cs +++ b/trino-csharp/Trino.Client/Auth/BasicAuth.cs @@ -5,7 +5,7 @@ namespace Trino.Client.Auth { /// - /// For testing purposes, you can use the BasicAuth class to authenticate with Trino. + /// For setting up basic authentication with a username and optional password. /// public class BasicAuth : ITrinoAuth { @@ -19,7 +19,12 @@ public string User set; } - public void AuthorizeAndValidate() + public string Password { + get; + set; + } + + public virtual void AuthorizeAndValidate() { if (string.IsNullOrEmpty(User) ) { @@ -33,7 +38,10 @@ public void AuthorizeAndValidate() /// Http request message public virtual void AddCredentialToRequest(HttpRequestMessage httpRequestMessage) { - var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{User}" )); + var credentials = Convert.ToBase64String(string.IsNullOrEmpty(Password) ? + Encoding.ASCII.GetBytes($"{User}") : + Encoding.ASCII.GetBytes($"{User}:{Password}")); + httpRequestMessage.Headers.Add("Authorization", "Basic " + credentials); } } diff --git a/trino-csharp/Trino.Client/Auth/LDAPAuth.cs b/trino-csharp/Trino.Client/Auth/LDAPAuth.cs index 85858bb..af3c996 100644 --- a/trino-csharp/Trino.Client/Auth/LDAPAuth.cs +++ b/trino-csharp/Trino.Client/Auth/LDAPAuth.cs @@ -4,40 +4,18 @@ namespace Trino.Client.Auth { - public class LDAPAuth : ITrinoAuth + public class LDAPAuth : BasicAuth { public LDAPAuth() { } - public string User - { - get; - set; - } - - public string Password - { - get; - set; - } - - public void AuthorizeAndValidate() + public override void AuthorizeAndValidate() { if (string.IsNullOrEmpty(User) || string.IsNullOrEmpty(Password)) { throw new ArgumentException("LDAPAuth: username or password property is null or empty"); } } - - /// - /// Modify the request with authentication - /// - /// Http request message - public virtual void AddCredentialToRequest(HttpRequestMessage httpRequestMessage) - { - var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{User}:{Password}")); - httpRequestMessage.Headers.Add("Authorization", "Basic " + credentials); - } } }