ForgeCore/ForgeCoreAPI/ACS/AccessToken.cs
2024-12-17 12:10:01 -07:00

67 lines
No EOL
2 KiB
C#

using System;
using System.Security.Cryptography;
using System.Text;
using ForgeCoreAPI.Utilities;
using LibAC.NBT;
using LibAC.NBT.API;
namespace ForgeCoreAPI.ACS;
/// <summary>
/// This represents the access token which would be utilized to authenticate commands
/// </summary>
public class AccessToken
{
public string TokenName { get; set; } = "";
public AccessTokenType TokenType { get; set; } = AccessTokenType.READ;
private string AccessTokenSeed { get; set; } = "";
public DateTime Expiration { get; set; } = DateTime.Now.AddDays(30);
public static AccessToken Create(string tokenName, AccessTokenType tokenType, bool expires = true)
{
AccessToken AT = new AccessToken();
AT.TokenName = tokenName;
AT.TokenType = tokenType;
if (!expires)
AT.Expiration = DateTime.MinValue;
var bytes = HashHelpers.EncodeMD5(HashHelpers.MakeRandomBytes(255));
AT.AccessTokenSeed = Convert.ToHexString(bytes);
return AT;
}
public override string ToString()
{
return Convert.ToHexString(HashHelpers.EncodeMD5(Encoding.UTF8.GetBytes($"{TokenName}:${AccessTokenSeed}")));
}
public CompoundTag Save()
{
CompoundTag tag = new CompoundTag();
tag.Put("name", StringTag.ValueOf(TokenName));
tag.Put("type", ByteTag.ValueOf((byte)TokenType));
tag.Put("seed", StringTag.ValueOf(AccessTokenSeed));
NbtUtils.WriteBoolean(tag, "expires", Expiration == DateTime.MinValue);
tag.Put("expiration", StringTag.ValueOf(Expiration.ToString()));
return tag;
}
public static AccessToken Load(CompoundTag tag)
{
AccessToken AT = new AccessToken();
AT.TokenName = tag["name"].AsString();
AT.TokenType = (AccessTokenType)tag["type"].AsByte();
AT.AccessTokenSeed = tag["seed"].AsString();
AT.Expiration = DateTime.Parse(tag["expiration"].AsString());
return AT;
}
}
public enum AccessTokenType : byte
{
FULL = 0,
READ = 1
}