2021-04-08 20:09:59 +08:00
|
|
|
|
using MongoDB.Driver;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace ET
|
|
|
|
|
{
|
|
|
|
|
public static class AccountHelper
|
|
|
|
|
{
|
2021-04-24 17:39:11 +08:00
|
|
|
|
private static Dictionary<string, int> accountRegisterCount = new();
|
2021-04-08 20:09:59 +08:00
|
|
|
|
public static async ETTask<int> GetFirbiddenIpCount(string ip)
|
|
|
|
|
{
|
2021-04-11 19:50:39 +08:00
|
|
|
|
List<ForbiddenIP> list = await DBComponent.Instance.QueryFilter(Builders<ForbiddenIP>.Filter.Eq(t => t.Ip, ip));
|
2021-04-12 23:38:54 +08:00
|
|
|
|
if (list == null || list.Count == 0)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
2021-04-12 23:38:54 +08:00
|
|
|
|
return 0;
|
2021-04-08 20:09:59 +08:00
|
|
|
|
}
|
2021-04-12 23:38:54 +08:00
|
|
|
|
|
|
|
|
|
ForbiddenIP forbiddenIP = list[0];
|
|
|
|
|
return forbiddenIP.count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string GetPlayerFormatName(this long id)
|
|
|
|
|
{
|
|
|
|
|
return $"【{UserComponent.Instance.Get(id)?.NickName}({id})】";
|
2021-04-08 20:09:59 +08:00
|
|
|
|
}
|
2021-04-24 17:39:11 +08:00
|
|
|
|
|
|
|
|
|
public static async ETTask CheckIdentify(Account account,string identify)
|
|
|
|
|
{
|
|
|
|
|
account.identifyList ??= new();
|
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(identify);
|
|
|
|
|
Utility.Encryption.GetSelfXorBytes(bytes, CryptionHelper.GetXorKey());
|
|
|
|
|
string _key = Encoding.UTF8.GetString(bytes);
|
|
|
|
|
account.identifyList.Add(_key);
|
|
|
|
|
await DBComponent.Instance.Save(account);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool CanRegister(string identify)
|
|
|
|
|
{
|
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(identify);
|
|
|
|
|
Utility.Encryption.GetSelfXorBytes(bytes, CryptionHelper.GetXorKey());
|
|
|
|
|
string _key = Encoding.UTF8.GetString(bytes);
|
|
|
|
|
var arr = _key.Split('+');
|
|
|
|
|
string strCount1 = arr[0];
|
|
|
|
|
string strCount2 = arr[4];
|
|
|
|
|
string strCount3 = arr[6];
|
|
|
|
|
|
|
|
|
|
string strValue1 = arr[1];
|
|
|
|
|
string strValue2 = arr[5];
|
|
|
|
|
string strValue3 = arr[7];
|
|
|
|
|
if (!int.TryParse(strCount1, out int count1) ||!int.TryParse(strCount2, out int count2)||!int.TryParse(strCount3, out int count3))
|
|
|
|
|
return false;
|
|
|
|
|
if (count1 != strValue1.Length || count2 != strValue2.Length || count3 != strValue3.Length)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (accountRegisterCount.TryGetValue(_key, out var count))
|
|
|
|
|
{
|
|
|
|
|
if (count >= 10) return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void Refresh()
|
|
|
|
|
{
|
|
|
|
|
accountRegisterCount.Clear();
|
|
|
|
|
}
|
2021-04-08 20:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
public sealed class SecurityUtil
|
|
|
|
|
{
|
|
|
|
|
public class SecurityData
|
|
|
|
|
{
|
|
|
|
|
public byte[] xorScale;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static readonly byte[] xorScale;
|
|
|
|
|
static SecurityUtil()
|
|
|
|
|
{
|
|
|
|
|
if (xorScale == null)
|
|
|
|
|
{
|
|
|
|
|
string path = Path.Combine(Environment.CurrentDirectory, "../Release/key");
|
|
|
|
|
string str = File.ReadAllText(path);
|
|
|
|
|
SecurityData data = MongoHelper.FromJson<SecurityData>(str);
|
|
|
|
|
xorScale = data.xorScale;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 对数组进行异或
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="buffer"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static byte[] Xor(byte[] buffer)
|
|
|
|
|
{
|
|
|
|
|
//------------------
|
|
|
|
|
//第3步:xor解密
|
|
|
|
|
//------------------
|
|
|
|
|
int iScaleLen = xorScale.Length;
|
|
|
|
|
for (int i = 0; i < buffer.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
buffer[i] = (byte)(buffer[i] ^ xorScale[i % iScaleLen]);
|
|
|
|
|
}
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|