public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args) { var sessionState = SessionManager.sessionStates[UserID]; var xtlk = new MSG_XTALK(); if (TargetID == 0) { xtlk.text = "Sorry, you must target a user to use this command."; sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0); } else { var targetSessionState = SessionManager.sessionStates[TargetID]; foreach (var asset in targetSessionState.details.propSpec) { var dbAsset = dbContext.Assets .Where(a => a.AssetId == asset.id) .FirstOrDefault(); if (dbAsset != null) { dbContext.Assets.Remove(dbAsset); } } if (dbContext.HasUnsavedChanges()) { dbContext.SaveChanges(); } targetSessionState.details.nbrProps = 0; targetSessionState.details.propSpec = null; SessionManager.SendToRoomID(targetSessionState.RoomID, 0, new MSG_USERPROP { nbrProps = 0, propSpec = null, }, EventTypes.MSG_USERPROP, (Int32)targetSessionState.UserID); xtlk.text = $"{targetSessionState.details.name}'s avatar has been eraised!"; sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0); } return(true); }
public void Receive(ThePalaceEntities dbContext, object message) { var sessionState = ((Message)message).sessionState; var protocol = ((Message)message).protocol; var header = ((Message)message).header; var inboundPacket = (Protocols.MSG_USERDESC)protocol; var user = dbContext.UserData .Where(u => u.UserId == sessionState.UserID) .FirstOrDefault(); user.FaceNbr = inboundPacket.faceNbr; user.ColorNbr = inboundPacket.colorNbr; dbContext.SaveChanges(); if (!sessionState.Authorized) { if ((sessionState.userFlags & (int)(UserFlags.U_PropGag | UserFlags.U_Pin)) != 0) { sessionState.details.faceNbr = inboundPacket.faceNbr; sessionState.details.colorNbr = inboundPacket.colorNbr; sessionState.details.nbrProps = 0; sessionState.details.propSpec = null; return; } } sessionState.details.faceNbr = inboundPacket.faceNbr; sessionState.details.colorNbr = inboundPacket.colorNbr; sessionState.details.nbrProps = (Int16)inboundPacket.nbrProps; sessionState.details.propSpec = inboundPacket.propSpec; AssetLoader.CheckAssets(sessionState, inboundPacket.propSpec); SessionManager.SendToRoomID(sessionState.RoomID, 0, inboundPacket, (EventTypes)Enum.Parse(typeof(EventTypes), header.eventType), header.refNum); }
public void Receive(ThePalaceEntities dbContext, object message) { var sessionState = ((Message)message).sessionState; var maxRoomId = dbContext.Rooms .Select(r => r.RoomId) .Max(); var maxOrderId = dbContext.Rooms .Select(r => r.OrderID) .Max(); maxRoomId++; maxOrderId++; var newRoom = new Rooms { RoomId = maxRoomId, Name = $"New Room {maxRoomId}", CreateDate = DateTime.UtcNow, OrderID = maxOrderId, MaxOccupancy = 0, Flags = 0, }; dbContext.Rooms.Add(newRoom); var newRoomData = new RoomData { RoomId = maxRoomId, FacesId = 0, Password = null, PictureName = "clouds.png", ArtistName = sessionState.Name, }; dbContext.RoomData.Add(newRoomData); dbContext.SaveChanges(); Logger.Log(MessageTypes.Info, $"MSG_ROOMNEW[{sessionState.AuthUserID}]: {newRoom.Name}"); var room = dbContext.GetRoom(maxRoomId); if (!room.NotFound) { sessionState.RoomID = room.ID; var sendBusinesses = new List <ISendBusiness> { new MSG_ROOMDESC(), new MSG_USERLIST(), new MSG_ROOMDESCEND(), }; foreach (var sendBusiness in sendBusinesses) { sendBusiness.Send(dbContext, message); } new MSG_USERNEW().SendToRoomID(dbContext, message); } }
public void Send(ThePalaceEntities dbContext, object message) { var sessionState = ((Message)message).sessionState; var roomID = dbContext.FindRoomID(sessionState.reg.desiredRoom); if (roomID == 0) { new MSG_SERVERDOWN { reason = ServerDownFlags.SD_ServerFull, whyMessage = "The Server is full!", }.Send(dbContext, message); sessionState.driver.DropConnection(); return; } sessionState.RoomID = roomID; sessionState.successfullyConnected = true; var sendBusinesses = new List <ISendBusiness> { new MSG_ALTLOGONREPLY(), new MSG_VERSION(), new MSG_SERVERINFO(), new MSG_USERSTATUS(), }; foreach (var sendBusiness in sendBusinesses) { sendBusiness.Send(dbContext, message); } new MSG_USERLOG().SendToServer(dbContext, message); using (var dbContextTransaction = dbContext.Database.BeginTransaction()) { try { dbContext.Users1.Add(new Users1 { UserId = (Int32)sessionState.UserID, Name = sessionState.reg.userName, RoomId = sessionState.RoomID, Flags = sessionState.userFlags, }); dbContext.UserData.Add(new UserData { UserId = (Int32)sessionState.UserID, RoomPosH = sessionState.details.roomPos.h, RoomPosV = sessionState.details.roomPos.v, FaceNbr = sessionState.details.faceNbr, ColorNbr = sessionState.details.colorNbr, AwayFlag = 0, OpenToMsgs = 0, }); dbContext.SaveChanges(); dbContextTransaction.Commit(); } catch (Exception ex) { dbContextTransaction.Rollback(); ex.DebugLog(); } } new MSG_HTTPSERVER().Send(dbContext, message); new MSG_ROOMGOTO().Receive(dbContext, new Message { sessionState = sessionState, protocol = new Protocols.MSG_ROOMGOTO { dest = sessionState.RoomID, }, }); }
public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args) { var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null; var xtlk = new MSG_XTALK(); if (TargetID == 0 && args.Length < 1) { xtlk.text = "A target user or parameter is required for this command."; } if (TargetID != 0) { var targetSessionState = SessionManager.sessionStates[TargetID]; if (targetSessionState.Authorized) { xtlk.text = "Sorry, you may not perform this command on another staff member."; sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0); } else { var ipAddress = targetSessionState.driver.GetIPAddress(); var serverDown = new Business.MSG_SERVERDOWN { reason = ServerDownFlags.SD_Banished, whyMessage = "You have been banned!", }; SessionManager.sessionStates.Values.ToList().ForEach(state => { if (state.driver.GetIPAddress() == ipAddress) { serverDown.Send(dbContext, new Message { sessionState = state, }); state.driver.DropConnection(); } dbContext.Bans.Add(new Bans { Ipaddress = ipAddress, RegCtr = (Int32)state.reg.counter, RegCrc = (Int32)state.reg.crc, Puidctr = (Int32)state.reg.puidCtr, Puidcrc = (Int32)state.reg.puidCRC, Note = state.details.name, UntilDate = null, }); }); } } if (args != null && args.Length > 0) { var bans = new List <Bans>(); var serverDown = new Business.MSG_SERVERDOWN { reason = ServerDownFlags.SD_Banished, whyMessage = "You have been banned!", }; foreach (var _arg in args) { var arg = _arg.Trim(); if (Regex.IsMatch(arg, "^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$")) { bans.Add(new Bans { Ipaddress = arg, UntilDate = null, }); } if (Regex.IsMatch(arg, @"^[\{]*[A-Q][\}]*$")) { var seed = Cipher.WizKeytoSeed(arg); var crc = Cipher.ComputeLicenseCrc((UInt32)seed); var ctr = Cipher.GetSeedFromReg((UInt32)seed, crc); bans.Add(new Bans { RegCrc = (Int32)crc, RegCtr = ctr, UntilDate = null, }); } if (Regex.IsMatch(arg, @"^[\{]*[Z][A-Q][\}]*$")) { var seed = Cipher.WizKeytoSeed(arg); var crc = Cipher.ComputeLicenseCrc((UInt32)seed); var ctr = Cipher.GetSeedFromPUID((UInt32)seed, crc); bans.Add(new Bans { Puidcrc = (Int32)crc, Puidctr = ctr, UntilDate = null, }); } } SessionManager.sessionStates.Values.ToList().ForEach(state => { foreach (var ban in bans) { if (state.driver.GetIPAddress() == ban.Ipaddress || (state.reg.crc == ban.RegCrc && state.reg.counter == ban.RegCtr) || (state.reg.puidCRC == ban.Puidcrc && state.reg.puidCtr == ban.Puidctr)) { ban.Note = state.details.name; serverDown.Send(dbContext, new Message { sessionState = state, }); state.driver.DropConnection(); } } }); if (bans.Count > 0) { dbContext.Bans.AddRange(bans); } } if (dbContext.HasUnsavedChanges()) { dbContext.SaveChanges(); xtlk.text = "Ban record(s) added..."; } else { xtlk.text = "Usage: `ban [<target user>] or [<IP|REG|PUID>]"; } if (UserID == 0xFFFFFFFF) { Logger.ConsoleLog(xtlk.text); } else { sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0); } return(true); }
public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args) { var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null; var xtlk = new MSG_XTALK { text = $"Purging Props", }; if (args.Length <= 0) { xtlk.text = $"Clearing Room[{sessionState.RoomID}] Loose Props, issued by [{sessionState.UserID}] {sessionState.details.name}"; SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0); Logger.ConsoleLog(xtlk.text); dbContext.LooseProps2.RemoveRange(dbContext.LooseProps2.AsNoTracking().Where(m => m.RoomId == sessionState.RoomID).ToList()); } else { for (int i = 0; i < args.Length; i++) { var arg = args[i]; if (!arg.Substring(0, 1).Equals("-")) { xtlk.text = "Invalid Paramters for PurgeProps specified"; if (UserID != 0xFFFFFFFF) { SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0); } Logger.ConsoleLog(xtlk.text); break; } if (arg.Contains("T")) { if ((i + 1) >= args.Length) { xtlk.text = "[T]ime Operation requires a DateTime string to be passed"; if (UserID != 0xFFFFFFFF) { SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0); } Logger.ConsoleLog(xtlk.text); break; } var time = args[i + 1].TryParse <DateTime>(); if (!time.HasValue) { xtlk.text = "Invalid DateTime format"; if (UserID != 0xFFFFFFFF) { SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0); } Logger.ConsoleLog("Invalid DateTime format"); return(true); } xtlk.text = $"Removing Props Older than {time.ToString()}, issued by [{sessionState.UserID}] {sessionState.details.name}"; SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0); Logger.ConsoleLog(xtlk.text); dbContext.Assets.RemoveRange(dbContext.Assets.AsNoTracking().Where(m => m.LastUsed <= time)); i++; break; } else if (arg.Contains("C")) { xtlk.text = $"Removing All Cached Props, issued by [{sessionState.UserID}] {sessionState.details.name}"; SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0); Logger.ConsoleLog(xtlk.text); dbContext.Assets.RemoveRange(dbContext.Assets); break; } if (arg.Contains("L")) { xtlk.text = $"Purging All Loose Props, issued by [{sessionState.UserID}] {sessionState.details.name}"; SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0); Logger.ConsoleLog(xtlk.text); dbContext.LooseProps.RemoveRange(dbContext.LooseProps); break; } } } dbContext.SaveChanges(); return(true); }
public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args) { var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null; var xtlk = new MSG_XTALK(); if (args.Length < 1) { xtlk.text = "A parameter is required for this command."; } else { foreach (var _arg in args) { var arg = _arg.Trim(); if (Regex.IsMatch(arg, "^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$")) { var records = dbContext.Bans .Where(b => b.Ipaddress == arg) .ToList(); if (records.Count > 0) { dbContext.Bans.RemoveRange(records); } } if (Regex.IsMatch(arg, @"^[\{]*[A-Q][\}]*$")) { var seed = Cipher.WizKeytoSeed(arg); var crc = Cipher.ComputeLicenseCrc((UInt32)seed); var ctr = Cipher.GetSeedFromReg((UInt32)seed, crc); var records = dbContext.Bans .Where(b => b.RegCtr == ctr && b.RegCrc == crc) .ToList(); if (records.Count > 0) { dbContext.Bans.RemoveRange(records); } } if (Regex.IsMatch(arg, @"^[\{]*[Z][A-Q][\}]*$")) { var seed = Cipher.WizKeytoSeed(arg); var crc = Cipher.ComputeLicenseCrc((UInt32)seed); var ctr = Cipher.GetSeedFromPUID((UInt32)seed, crc); var records = dbContext.Bans .Where(b => b.Puidctr == ctr && b.Puidcrc == crc) .ToList(); if (records.Count > 0) { dbContext.Bans.RemoveRange(records); } } } if (dbContext.HasUnsavedChanges()) { dbContext.SaveChanges(); xtlk.text = "Ban record(s) removed..."; } else { xtlk.text = "Unable to find ban record(s) by that criteria, try again."; } } if (UserID == 0xFFFFFFFF) { Logger.ConsoleLog(xtlk.text); } else { sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0); } return(true); }
public static void AuthorizeUser(ThePalaceEntities dbContext, object message, out int AuthUserID, out List <int> AuthRoleIDs, out List <int> AuthMsgIDs, out List <string> AuthCmds) { var sessionState = ((Message)message).sessionState; var protocol = ((Message)message).protocol; var ipAddress = sessionState.driver.GetIPAddress(); var xTalkB = new Business.MSG_XTALK(); var xTalkP = new MSG_XTALK(); var authUserID = 0; var actions = new Dictionary <Type, Action> { { typeof(MSG_LOGON), () => { var inboundPacket = (MSG_LOGON)protocol; authUserID = dbContext.Auth.AsNoTracking() .AsEnumerable() .Where(a => ((a.AuthType & (byte)AuthTypes.Password) == 0 || ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == (inboundPacket.reg.wizPassword ?? string.Empty).Trim())) && ((a.AuthType & (byte)AuthTypes.IPAddress) == 0 || ((a.AuthType & (byte)AuthTypes.IPAddress) != 0 && a.Value.Trim() == ipAddress)) && ((a.AuthType & (byte)AuthTypes.RegCode) == 0 || ((a.AuthType & (byte)AuthTypes.RegCode) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.counter && a.Crc == sessionState.reg.crc)) && ((a.AuthType & (byte)AuthTypes.PUID) == 0 || ((a.AuthType & (byte)AuthTypes.PUID) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.puidCtr && a.Crc == sessionState.reg.puidCRC))) .Select(a => a.UserId) .FirstOrDefault(); if (authUserID > 0) { xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!"; Logger.Log(MessageTypes.Info, xTalkP.text); xTalkB.SendToUserID(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); xTalkB.SendToStaff(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); } } }, { typeof(MSG_SUPERUSER), () => { var inboundPacket = (MSG_SUPERUSER)protocol; authUserID = dbContext.Auth.AsNoTracking() .AsEnumerable() .Where(a => ((a.AuthType & (byte)AuthTypes.Password) == 0 || ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == (inboundPacket.password ?? string.Empty).Trim())) && ((a.AuthType & (byte)AuthTypes.IPAddress) == 0 || ((a.AuthType & (byte)AuthTypes.IPAddress) != 0 && a.Value.Trim() == ipAddress)) && ((a.AuthType & (byte)AuthTypes.RegCode) == 0 || ((a.AuthType & (byte)AuthTypes.RegCode) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.counter && a.Crc == sessionState.reg.crc)) && ((a.AuthType & (byte)AuthTypes.PUID) == 0 || ((a.AuthType & (byte)AuthTypes.PUID) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.puidCtr && a.Crc == sessionState.reg.puidCRC))) .Select(a => a.UserId) .FirstOrDefault(); if (authUserID > 0) { xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!"; xTalkB.SendToUserID(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); } else { xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] attempted authorization and failed..."; } Logger.Log(MessageTypes.Info, xTalkP.text); xTalkB.SendToStaff(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); } }, { typeof(MSG_AUTHRESPONSE), () => { var inboundPacket = (MSG_AUTHRESPONSE)protocol; authUserID = dbContext.Auth.AsNoTracking() .Where(a => ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == inboundPacket.password.Trim())) .Join( dbContext.Users.AsNoTracking(), a => a.UserId, u => u.UserId, (a, u) => new { a, u } ) .Where(u => u.u.Name == inboundPacket.userName.Trim()) .Select(a => a.a.UserId) .FirstOrDefault(); if (authUserID > 0) { xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!"; xTalkB.SendToUserID(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); } else { xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] attempted authorization and failed..."; } Logger.Log(MessageTypes.Info, xTalkP.text); xTalkB.SendToStaff(dbContext, new Message { sessionState = sessionState, protocol = xTalkP, }); } } }; var type = protocol.GetType(); if (type != null && actions.ContainsKey(type)) { actions[type](); } if (authUserID > 0) { AuthUserID = authUserID; AuthRoleIDs = dbContext.GroupUsers.AsNoTracking() .Where(gu => gu.UserId == authUserID) .Join( dbContext.GroupRoles.AsNoTracking(), gu => gu.GroupId, gr => gr.GroupId, (gu, gr) => new { gu, gr } ) .Select(g => g.gr.RoleId) .Distinct() .ToList(); AuthMsgIDs = new List <int>(); AuthCmds = new List <string>(); sessionState.userFlags |= (short)(UserFlags.U_SuperUser | UserFlags.U_God); var now = DateTime.UtcNow; var sessionDuration_InMinutes = ConfigManager.GetValue <UInt32>("SessionDuration_InMinutes", 1440).Value; var expireDate = now.AddMinutes(sessionDuration_InMinutes); var sessionRec = dbContext.Sessions .Where(s => s.UserId == authUserID) .SingleOrDefault(); if (sessionRec == null) { sessionRec = new Sessions { UserId = authUserID, Hash = Guid.NewGuid(), UntilDate = expireDate, LastUsed = now, }; dbContext.Sessions.Add(sessionRec); } else if (sessionRec.LastUsed < now) { sessionRec.Hash = Guid.NewGuid(); sessionRec.UntilDate = expireDate; sessionRec.LastUsed = now; } else { sessionRec.LastUsed = now; } if (dbContext.HasUnsavedChanges()) { dbContext.SaveChanges(); } if (sessionState.successfullyConnected) { var uSta = new MSG_USERSTATUS { flags = sessionState.userFlags, hash = sessionRec.Hash, }; sessionState.Send(uSta, EventTypes.MSG_USERSTATUS, (Int32)sessionState.UserID); } } else { AuthUserID = 0; AuthRoleIDs = null; AuthMsgIDs = null; AuthCmds = null; } }