diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 457b430..bf09d88 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -1,4 +1,4 @@ -using System.Data; +using System.Data; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; @@ -24,8 +24,6 @@ namespace Milimoe.FunGame.Server.Controller public Authenticator? Authenticator { get; } public DataRequestType LastRequest => _lastRequest; - private string _forgetVerify = ""; - private string _regVerify = ""; private DataRequestType _lastRequest = DataRequestType.UnKnown; private readonly bool[] _isReadyCheckCD = [false, false]; protected DataSet _dsUser = new(); @@ -556,14 +554,10 @@ namespace Milimoe.FunGame.Server.Controller { // 检查验证码是否发送过 SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(SQLHelper, username, email)); - if (SQLHelper.Result == SQLResult.Success) + if (SQLHelper.Result == SQLResult.Success && DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime) && (DateTime.Now - RegTime).TotalMinutes < 10) { - DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime]; - string RegVerifyCode = (string)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]; - if ((DateTime.Now - RegTime).TotalMinutes < 10) - { - ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); - } + string RegVerifyCode = SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? ""; + ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); returnType = RegInvokeType.InputVerifyCode; } else @@ -571,8 +565,8 @@ namespace Milimoe.FunGame.Server.Controller // 发送验证码,需要先删除之前过期的验证码 SQLHelper.NewTransaction(); SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); - _regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); - SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(SQLHelper, username, email, _regVerify)); + string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); + SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(SQLHelper, username, email, regVerify)); if (SQLHelper.Result == SQLResult.Success) { SQLHelper.Commit(); @@ -581,11 +575,11 @@ namespace Milimoe.FunGame.Server.Controller // 发送验证码 string ServerName = Config.ServerName; string Subject = $"[{ServerName}] FunGame 注册验证码"; - string Body = $"亲爱的 {username},
感谢您注册[{ServerName}],您的验证码是 {_regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; + string Body = $"亲爱的 {username},
感谢您注册[{ServerName}],您的验证码是 {regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; string[] To = [email]; if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) { - ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{_regVerify}"); + ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{regVerify}"); } else { @@ -595,7 +589,7 @@ namespace Milimoe.FunGame.Server.Controller } else // 不使用MailSender的情况 { - ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{_regVerify},请服务器管理员告知此用户"); + ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{regVerify},请服务器管理员告知此用户"); } returnType = RegInvokeType.InputVerifyCode; } @@ -610,18 +604,22 @@ namespace Milimoe.FunGame.Server.Controller SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(SQLHelper, username, email, verifycode)); if (SQLHelper.Result == SQLResult.Success) { + if (!DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime)) + { + RegTime = General.DefaultTime; + } // 检查验证码是否过期 - DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime]; if ((DateTime.Now - RegTime).TotalMinutes >= 10) { ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); msg = "此验证码已过期,请重新注册。"; SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); + returnType = RegInvokeType.None; } else { // 注册 - if (_regVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode])) + if (verifycode.Equals(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode])) { SQLHelper.NewTransaction(); ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email); @@ -787,7 +785,10 @@ namespace Milimoe.FunGame.Server.Controller if (SQLHelper.Result == SQLResult.Success) { // 检查验证码是否过期 - DateTime SendTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime]; + if (!DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime)) + { + SendTime = General.DefaultTime; + } if ((DateTime.Now - SendTime).TotalMinutes >= 10) { ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); @@ -797,7 +798,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查验证码是否正确 - if (_forgetVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode])) + if (verifycode.Equals(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode])) { ServerHelper.WriteLine("[ForgerPassword] Username: " + username + " Email: " + email); SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); @@ -823,12 +824,12 @@ namespace Milimoe.FunGame.Server.Controller { // 检查验证码是否发送过和是否过期 SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(SQLHelper, username, email)); - if (SQLHelper.Result != SQLResult.Success || (DateTime.Now - ((DateTime)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime])).TotalMinutes >= 10) + if (SQLHelper.Result != SQLResult.Success || (DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime) && (DateTime.Now - SendTime).TotalMinutes >= 10)) { // 发送验证码,需要先删除之前过期的验证码 SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); - _forgetVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); - SQLHelper.Execute(ForgetVerifyCodes.Insert_ForgetVerifyCode(SQLHelper, username, email, _forgetVerify)); + string forgetVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); + SQLHelper.Execute(ForgetVerifyCodes.Insert_ForgetVerifyCode(SQLHelper, username, email, forgetVerify)); if (SQLHelper.Result == SQLResult.Success) { if (MailSender != null) @@ -836,11 +837,11 @@ namespace Milimoe.FunGame.Server.Controller // 发送验证码 string ServerName = Config.ServerName; string Subject = $"[{ServerName}] FunGame 找回密码验证码"; - string Body = $"亲爱的 {username},
您正在找回[{ServerName}]账号的密码,您的验证码是 {_forgetVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; + string Body = $"亲爱的 {username},
您正在找回[{ServerName}]账号的密码,您的验证码是 {forgetVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; string[] To = [email]; if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) { - ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{_forgetVerify}"); + ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{forgetVerify}"); msg = ""; } else @@ -851,7 +852,7 @@ namespace Milimoe.FunGame.Server.Controller } else // 不使用MailSender的情况 { - ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{_forgetVerify},请服务器管理员告知此用户"); + ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},请服务器管理员告知此用户"); msg = ""; } } diff --git a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs b/FunGame.Server/Utilities/MySQL/MySQLHelper.cs index 0ae6ff2..2bcaf69 100644 --- a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs +++ b/FunGame.Server/Utilities/MySQL/MySQLHelper.cs @@ -1,4 +1,4 @@ -using System.Data; +using System.Data; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; @@ -212,6 +212,10 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility _result = SQLResult.Fail; ServerHelper.Error(e); } + finally + { + _transaction = null; + } } /// @@ -222,13 +226,17 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility try { _transaction?.Rollback(); - _result = SQLResult.Success; + _result = SQLResult.SQLError; } catch (Exception e) { _result = SQLResult.Fail; ServerHelper.Error(e); } + finally + { + _transaction = null; + } } private bool _isDisposed = false; diff --git a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs b/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs index 6e483aa..63c3815 100644 --- a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs +++ b/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs @@ -1,4 +1,4 @@ -using System.Data; +using System.Data; using Microsoft.Data.Sqlite; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Constant; @@ -164,7 +164,7 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility DataTable table = new(); table.Load(reader); _dataSet.Tables.Add(table); - } while (reader.NextResult()); + } while (!reader.IsClosed && reader.NextResult()); if (localTransaction) Commit(); @@ -211,6 +211,10 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility _result = SQLResult.Fail; ServerHelper.Error(e); } + finally + { + _transaction = null; + } } /// @@ -221,13 +225,17 @@ namespace Milimoe.FunGame.Server.Utility.DataUtility try { _transaction?.Rollback(); - _result = SQLResult.Success; + _result = SQLResult.SQLError; } catch (Exception e) { _result = SQLResult.Fail; ServerHelper.Error(e); } + finally + { + _transaction = null; + } } ///