예제 #1
0
        public void CheckIp(Torch.API.IPlayer Player)
        {
            if (Player == null)
            {
                Log.Info($"Cannont check for IP, player in Null");
                return;
            }

            ulong steamid        = Player.SteamId;
            var   steamid_backup = MyEventContext.Current.Sender.Value;

            if (steamid == 0)
            {
                steamid = steamid_backup;
            }

            var state = new MyP2PSessionState();

            Sandbox.Engine.Networking.MyGameService.Peer2Peer.GetSessionState(steamid, ref state);
            var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray());

            foreach (var account in PlayersAccounts)
            {
                if (account.KnownIps.Contains(ip.ToString()) && account.Player != Player.Name)
                {
                    Log.Warn($"WARNING! {Player.Name} shares the same IP address as {account.Player}");
                }
            }
        }
예제 #2
0
        //Largely copied from SE
        private void ValidateAuthTicketResponse(ulong steamId, JoinResult response, ulong steamOwner)
        {
            var state = new MyP2PSessionState();

            MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref state);
            var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray());

            Torch.CurrentSession.KeenSession.PromotedUsers.TryGetValue(steamId, out MyPromoteLevel promoteLevel);

            _log.Debug($"ValidateAuthTicketResponse(user={steamId}, response={response}, owner={steamOwner}, permissions={promoteLevel})");

            _log.Info($"Connection attempt by {steamId} from {ip}");

            if (IsProfiling(steamId))
            {
                _log.Warn($"Rejecting user {steamId} for using Profiler/ModSDK!");
                UserRejected(steamId, JoinResult.ProfilingNotAllowed);
            }

            if (Players.ContainsKey(steamId))
            {
                _log.Warn($"Player {steamId} has already joined!");
                UserRejected(steamId, JoinResult.AlreadyJoined);
            }
            else if (Torch.CurrentSession.KeenSession.OnlineMode == MyOnlineModeEnum.OFFLINE &&
                     promoteLevel < MyPromoteLevel.Admin)
            {
                _log.Warn($"Rejecting user {steamId}, world is set to offline and user is not admin.");
                UserRejected(steamId, JoinResult.TicketCanceled);
            }
            else if (MySandboxGame.ConfigDedicated.GroupID == 0uL)
            {
                RunEvent(new ValidateAuthTicketEvent(steamId, steamOwner, response, 0, true, false));
            }
            else if (_getServerAccountType(MySandboxGame.ConfigDedicated.GroupID) != MyGameServiceAccountType.Clan)
            {
                UserRejected(steamId, JoinResult.GroupIdInvalid);
            }
            else if (MyGameService.GameServer.RequestGroupStatus(steamId, MySandboxGame.ConfigDedicated.GroupID))
            {
                lock (_waitingForGroupLocal)
                {
                    if (_waitingForGroupLocal.Count >= _waitListSize)
                    {
                        _waitingForGroupLocal.RemoveAt(0);
                    }
                    _waitingForGroupLocal.Add(new WaitingForGroup(steamId, response, steamOwner));
                }
            }
            else
            {
                UserRejected(steamId, JoinResult.SteamServersOffline);
            }
        }
예제 #3
0
 private void OnTick()
 {
     this.m_ticks++;
     if (this.m_ticks > 12)
     {
         MyP2PSessionState state = new MyP2PSessionState();
         MyGameService.Peer2Peer.GetSessionState(base.ServerId, ref state);
         base.IsConnectionDirect = !state.UsingRelay;
         base.IsConnectionAlive  = state.ConnectionActive;
         this.m_ticks            = 0;
     }
 }
예제 #4
0
        async Task LoadIpLocation(ulong steamId)
        {
            // Get the public IP of the Steam player
            var state      = new MyP2PSessionState();
            var networking = MySteamGameService_Networking.Value;

            networking.Peer2Peer.GetSessionState(steamId, ref state);
            var ip        = BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray();
            var ipAddress = new IPAddress(ip).ToString();

            // Get the location
            var location = await _ipstackEndpoints.GetLocationOrNullAsync(ipAddress);

            _ipLocations[steamId] = location ?? new IpstackLocation();
        }
예제 #5
0
        public void CheckIp(Torch.API.IPlayer Player)
        {
            var state = new MyP2PSessionState();

            Sandbox.Engine.Networking.MyGameService.Peer2Peer.GetSessionState(Player.SteamId, ref state);
            var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray());

            foreach (var account in PlayersAccounts)
            {
                if (account.KnownIps.Contains(ip.ToString()) && account.Player != Player.Name)
                {
                    Log.Warn($"WARNING! {Player.Name} shares the same IP address as {account.Player}");
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Get Players IP address
        /// </summary>
        /// <param name="steamId">SteamId of the player</param>
        /// <returns></returns>
        public static IPAddress GetIPAddressOfClient(ulong steamId)
        {
            try
            {
                var state = new MyP2PSessionState();

                if (!MySteamServiceWrapper.Static.Peer2Peer.GetSessionState(steamId, ref state))
                {
                    return(null);
                }
                return(new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray()));
            }
            catch (Exception)
            {
                return(null);
            }
        }
예제 #7
0
        public void GenerateAccount(Torch.API.IPlayer player)
        {
            try {
                var state = new MyP2PSessionState();
                Sandbox.Engine.Networking.MyGameService.Peer2Peer.GetSessionState(player.SteamId, ref state);
                var ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray());

                ulong             steamid = player.SteamId;
                PlayerAccountData data    = new PlayerAccountData();
                bool found = false;
                foreach (var Account in PlayersAccounts)
                {
                    if (Account.SteamID == steamid)
                    {
                        if (!Account.KnownIps.Contains(ip.ToString()) && ip.ToString() != "0.0.0.0")
                        {
                            Account.KnownIps.Add(ip.ToString());
                        }

                        if (Account.IdentityID == 0L && !string.IsNullOrEmpty(Account.Player))
                        {
                            Account.IdentityID = Utilities.GetIdentityByNameOrIds(Account.Player)?.IdentityId ?? 0L;
                            UpdatePlayerAccount(Account);
                        }
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    Log.Info($"Creating new account object for {player.Name}");
                    data.SteamID = steamid;
                    data.Player  = player.Name;
                    data.Rank    = EssentialsPlugin.Instance.Config.DefaultRank;
                    data.KnownIps.Add(ip.ToString());
                    PlayersAccounts.Add(data);
                    SaveAccountData();
                    return;
                }
            }
            catch (Exception e) {
                Log.Error($"Exception creating account for {player.Name} {e.ToString()}");
            }
        }
예제 #8
0
        public void GenerateAccount(Torch.API.IPlayer player)
        {
            try
            {
                ulong steamid        = 0;
                var   steamid_backup = MyEventContext.Current.Sender.Value;
                System.Net.IPAddress ip;

                if (player == null || player.SteamId == 0)
                {
                    steamid = steamid_backup;
                }
                else
                {
                    steamid = player.SteamId;
                }

                if (steamid != 0)
                {
                    var state = new MyP2PSessionState();
                    Sandbox.Engine.Networking.MyGameService.Peer2Peer.GetSessionState(steamid, ref state);
                    ip = new IPAddress(BitConverter.GetBytes(state.RemoteIP).Reverse().ToArray());
                    if (ip == null)
                    {
                        return;
                    }
                }
                else
                {
                    ip = null;
                }

                // Disconnect client with Ip 0.0.0.0 to prevent SteamLib Crash.
                if (ip != null)
                {
                    if (ip.ToString() == "0.0.0.0")
                    {
                        MyMultiplayer.Static.DisconnectClient(steamid);
                        Log.Info($"Detected IP: {ip} from SteamID {steamid} Client was disconnected");
                    }
                }

                PlayerAccountData data = new PlayerAccountData();
                bool found             = false;

                foreach (var Account in PlayersAccounts)
                {
                    if (Account.SteamID == steamid)
                    {
                        if (!Account.KnownIps.Contains(ip.ToString()) && ip.ToString() != "0.0.0.0")
                        {
                            Account.KnownIps.Add(ip.ToString());
                        }

                        if (Account.IdentityID == 0L && !string.IsNullOrEmpty(Account.Player))
                        {
                            Account.IdentityID = Utilities.GetIdentityByNameOrIds(Account.Player)?.IdentityId ?? 0L;
                            UpdatePlayerAccount(Account);
                        }

                        if (ip != null)
                        {
                            if (!Account.KnownIps.Contains(ip.ToString()) && ip.ToString() != "0.0.0.0")
                            {
                                if (Account != null && Account.KnownIps != null)
                                {
                                    Account.KnownIps.Add(ip.ToString());
                                }
                                else
                                {
                                    Log.Info($"No account KnowIps exist for IP: {ip}");
                                }
                            }
                        }
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    if (player == null)
                    {
                        Log.Info($"Cannont Create new account Player is Null");
                        return;
                    }

                    Log.Info($"Creating new account object for {player.Name}");
                    if (steamid != 0)
                    {
                        data.SteamID = steamid;
                    }
                    else
                    {
                        data.SteamID = steamid_backup;
                    }
                    data.Player = player.Name;
                    data.Rank   = EssentialsPlugin.Instance.Config.DefaultRank;
                    if (ip != null)
                    {
                        data.KnownIps.Add(ip.ToString());
                    }
                    PlayersAccounts.Add(data);
                    SaveAccountData();
                    return;
                }
                if (steamid == 0)
                {
                    Log.Info($"Cannont Create new account for player, no steamid or IP detected, maybe next time.");
                }
            }
            catch
            {
                Log.Error($"Creating NEW account for {player.Name}, Player was not found in List.");
            }
        }