45 lines
1.6 KiB
C#
45 lines
1.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace ChatSharp.Handlers
|
|
{
|
|
internal static class SaslHandlers
|
|
{
|
|
public static void HandleAuthentication(IrcClient client, IrcMessage message)
|
|
{
|
|
if (client.IsAuthenticatingSasl)
|
|
{
|
|
if (message.Parameters[0] == "+")
|
|
{
|
|
// Based off irc-framework implementation
|
|
var plainString = $"{client.User.Nick}\0{client.User.Nick}\0{client.User.Password}";
|
|
var b64Bytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(plainString)));
|
|
|
|
while (b64Bytes.Length >= 400)
|
|
{
|
|
var chunk = b64Bytes.Take(400).ToArray();
|
|
b64Bytes = b64Bytes.Skip(400).ToArray();
|
|
client.SendRawMessage(string.Format("AUTHENTICATE {0}", Encoding.UTF8.GetString(chunk)));
|
|
}
|
|
if (b64Bytes.Length > 0)
|
|
client.SendRawMessage(string.Format("AUTHENTICATE {0}", Encoding.UTF8.GetString(b64Bytes)));
|
|
else
|
|
client.SendRawMessage("AUTHENTICATE +");
|
|
|
|
client.IsAuthenticatingSasl = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void HandleError(IrcClient client, IrcMessage message)
|
|
{
|
|
if (client.IsNegotiatingCapabilities && !client.IsAuthenticatingSasl)
|
|
{
|
|
client.SendRawMessage("CAP END");
|
|
client.IsNegotiatingCapabilities = false;
|
|
}
|
|
}
|
|
}
|
|
}
|