public static TCPProcessCmdResults ProcessSetSecPwd(TCPManager tcpMgr, TMSKSocket socket, TCPClientPool tcpClientPool, TCPRandKey tcpRandKey, TCPOutPacketPool pool, int nID, byte[] data, int count, out TCPOutPacket tcpOutPacket)
        {
            tcpOutPacket = null;
            try
            {
                SetSecondPassword setReq = DataHelper.BytesToObject <SetSecondPassword>(data, 0, count);
                if (setReq == null)
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("解析指令错误, cmd={0}", nID), null, true);
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }
                GameClient client = GameManager.ClientMgr.FindClient(socket);
                if (client == null || client.ClientData.RoleID != setReq.RoleID)
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("根据RoleID定位GameClient对象失败, CMD={0}, Client={1}, RoleID={2}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(socket, false), setReq.RoleID), null, true);
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }
                if (GameFuncControlManager.IsGameFuncDisabled(GameFuncType.System1Dot4Dot1))
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("ProcessSetSecPwd功能尚未开放, CMD={0}, Client={1}, RoleID={2}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(socket, false), setReq.RoleID), null, true);
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }
                SecPwdState         pwdState            = SecondPasswordManager.GetSecPwdState(client.strUserID);
                string              oldSecPwd_Encrypted = (pwdState != null) ? pwdState.SecPwd : null;
                SecondPasswordError error;
                if (!string.IsNullOrEmpty(oldSecPwd_Encrypted))
                {
                    if (setReq.OldSecPwd == null || oldSecPwd_Encrypted != setReq.OldSecPwd)
                    {
                        error = SecondPasswordError.SecPwdVerifyFailed;
                        goto IL_1F8;
                    }
                }
                string newSecPwd_Decrypted = SecondPasswordRC4.Decrypt(setReq.NewSecPwd);
                if (string.IsNullOrEmpty(newSecPwd_Decrypted))
                {
                    error = SecondPasswordError.SecPwdIsNull;
                }
                else if (!Regex.IsMatch(newSecPwd_Decrypted, "^[a-zA-Z0-9_]+$"))
                {
                    error = SecondPasswordError.SecPwdCharInvalid;
                }
                else if (newSecPwd_Decrypted.Length < 6)
                {
                    error = SecondPasswordError.SecPwdIsTooShort;
                }
                else if (newSecPwd_Decrypted.Length > 8)
                {
                    error = SecondPasswordError.SecPwdIsTooLong;
                }
                else
                {
                    string   cmd2db   = string.Format("{0}:{1}", client.strUserID, setReq.NewSecPwd);
                    string[] dbFields = Global.ExecuteDBCmd(10183, cmd2db, client.ServerId);
                    if (dbFields == null || dbFields.Length != 2)
                    {
                        error = SecondPasswordError.SecPwdDBFailed;
                    }
                    else
                    {
                        error = SecondPasswordError.SecPwdSetSuccess;
                    }
                }
IL_1F8:
                if (error == SecondPasswordError.SecPwdSetSuccess)
                {
                    if (pwdState == null)
                    {
                        pwdState = new SecPwdState();
                    }
                    pwdState.SecPwd     = setReq.NewSecPwd;
                    pwdState.NeedVerify = false;
                    SecondPasswordManager.SetSecPwdState(client.strUserID, pwdState);
                }
                int has  = 0;
                int need = 0;
                if (pwdState != null)
                {
                    has  = 1;
                    need = (pwdState.NeedVerify ? 1 : 0);
                }
                string rsp = string.Format("{0}:{1}:{2}:{3}", new object[]
                {
                    setReq.RoleID,
                    (int)error,
                    has,
                    need
                });
                GameManager.ClientMgr.SendToClient(client, rsp, nID);
                return(TCPProcessCmdResults.RESULT_OK);
            }
            catch (Exception ex)
            {
                DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(socket), false, false);
            }
            return(TCPProcessCmdResults.RESULT_FAILED);
        }
示例#2
0
        /// <summary>
        /// 设置二级密码
        /// </summary>
        public static TCPProcessCmdResults ProcessSetSecPwd(TCPManager tcpMgr, TMSKSocket socket, TCPClientPool tcpClientPool, TCPRandKey tcpRandKey, TCPOutPacketPool pool, int nID, byte[] data, int count, out TCPOutPacket tcpOutPacket)
        {
            tcpOutPacket = null;

            try
            {
                SetSecondPassword setReq = DataHelper.BytesToObject <SetSecondPassword>(data, 0, count);
                if (setReq == null)
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("解析指令错误, cmd={0}", (int)nID));
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }

                GameClient client = GameManager.ClientMgr.FindClient(socket);
                if (null == client || client.ClientData.RoleID != setReq.RoleID)
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("根据RoleID定位GameClient对象失败, CMD={0}, Client={1}, RoleID={2}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(socket), setReq.RoleID));
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }

                // 如果1.4.1的功能没开放
                if (GameFuncControlManager.IsGameFuncDisabled(GameFuncType.System1Dot4Dot1))
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("ProcessSetSecPwd功能尚未开放, CMD={0}, Client={1}, RoleID={2}", (TCPGameServerCmds)nID, Global.GetSocketRemoteEndPoint(socket), setReq.RoleID));
                    return(TCPProcessCmdResults.RESULT_FAILED);
                }

                //旧的加密后的二级密码, 如果尚未设置,则为空
                SecPwdState         pwdState            = GetSecPwdState(client.strUserID);
                string              oldSecPwd_Encrypted = pwdState != null ? pwdState.SecPwd : null;
                SecondPasswordError error = SecondPasswordError.SecPwdSetSuccess;
                do
                {
                    if (!string.IsNullOrEmpty(oldSecPwd_Encrypted))
                    {
                        // 存在旧的二级密码,直接进行密文比较
                        if (setReq.OldSecPwd == null ||
                            oldSecPwd_Encrypted != setReq.OldSecPwd)
                        {
                            error = SecondPasswordError.SecPwdVerifyFailed;
                            break;
                        }
                    }

                    //解密后的新二级密码
                    string newSecPwd_Decrypted = SecondPasswordRC4.Decrypt(setReq.NewSecPwd);
                    if (string.IsNullOrEmpty(newSecPwd_Decrypted))
                    {
                        error = SecondPasswordError.SecPwdIsNull;
                        break;
                    }

                    if (!Regex.IsMatch(newSecPwd_Decrypted, "^[a-zA-Z0-9_]+$"))
                    {
                        error = SecondPasswordError.SecPwdCharInvalid;
                        break;
                    }

                    if (newSecPwd_Decrypted.Length < _PwdMinLen)
                    {
                        error = SecondPasswordError.SecPwdIsTooShort;
                        break;
                    }

                    if (newSecPwd_Decrypted.Length > _PwdMaxLen)
                    {
                        error = SecondPasswordError.SecPwdIsTooLong;
                        break;
                    }

                    //直接存储密文
                    string   cmd2db   = string.Format("{0}:{1}", client.strUserID, setReq.NewSecPwd);
                    string[] dbFields = Global.ExecuteDBCmd((int)TCPGameServerCmds.CMD_DB_UPDATE_USR_SECOND_PASSWORD, cmd2db, client.ServerId);
                    if (null == dbFields || dbFields.Length != 2)
                    {
                        error = SecondPasswordError.SecPwdDBFailed;
                        break;
                    }

                    error = SecondPasswordError.SecPwdSetSuccess;
                    break;
                } while (false);

                if (error == SecondPasswordError.SecPwdSetSuccess)
                {
                    // 设置二级密码成功了,更新状态
                    if (pwdState == null)
                    {
                        pwdState = new SecPwdState();
                    }
                    pwdState.SecPwd     = setReq.NewSecPwd;
                    pwdState.NeedVerify = false;
                    SetSecPwdState(client.strUserID, pwdState);
                }

                int has = 0, need = 0;
                if (pwdState != null)
                {
                    has  = 1;
                    need = pwdState.NeedVerify ? 1 : 0;
                }

                string rsp = string.Format("{0}:{1}:{2}:{3}", setReq.RoleID, (int)error, has, need);
                GameManager.ClientMgr.SendToClient(client, rsp, nID);
                return(TCPProcessCmdResults.RESULT_OK);
            }
            catch (Exception ex)
            {
                DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(socket), false);
            }

            return(TCPProcessCmdResults.RESULT_FAILED);
        }