Ejemplo n.º 1
0
        public override void Process(NPHandler client)
        {
            if (!client.Authenticated)
            {
                ReplyWithError(client, 1);
                return;
            }

            var id = Message.sessionid;

            if (!Servers.Sessions.ContainsKey(id))
            {
                ReplyWithError(client, 2);
                return;
            }

            var sessionInfo = Servers.Sessions[id];

            if (sessionInfo.npid != (ulong)client.NPID)
            {
                ReplyWithError(client, 1);
                return;
            }

            sessionInfo.hostname    = Message.hostname;
            sessionInfo.players     = Message.players;
            sessionInfo.maxplayers  = Message.maxplayers;
            sessionInfo.mapname     = Message.mapname;
            sessionInfo.lastTouched = DateTime.UtcNow;

            ReplyWithError(client, 0);
        }
Ejemplo n.º 2
0
        public override void Process(NPHandler client)
        {
            var npids = (from npid in Message.npids
                         select(int)(npid & 0xFFFFFFFF)).ToArray();

            var db = XNP.Create();

            var profiles = from profile in db.IW4Profiles
                           where npids.Contains(profile.UserID)
                           select profile;

            var reply = MakeResponse <FriendsGetProfileDataResultMessage>(client);

            foreach (var profile in profiles)
            {
                var profileResult = new ProfileDataResult {
                    npid = (ulong)((uint)profile.UserID | 0x110000100000000)
                };
                profileResult.profile = new byte[8];
                Array.Copy(BitConverter.GetBytes(profile.Experience.Value), 0, profileResult.profile, 0, 4);
                Array.Copy(BitConverter.GetBytes((uint)profile.Prestige.Value), 0, profileResult.profile, 4, 4);

                reply.Message.results.Add(profileResult);
            }

            reply.Send();
        }
Ejemplo n.º 3
0
        private void ReplyWithError(NPHandler client, int error)
        {
            var reply = MakeResponse <ServersUpdateSessionResultMessage>(client);

            reply.Message.result = error;
            reply.Send();
        }
Ejemplo n.º 4
0
        public override void Process(NPHandler client)
        {
            if (!client.Authenticated)
            {
                ReplyWithError(client, 1);
                return;
            }

            var id = Message.sessionid;

            if (!Servers.Sessions.ContainsKey(id))
            {
                ReplyWithError(client, 2);
                return;
            }

            var sessionInfo = Servers.Sessions[id];

            if (sessionInfo.npid != (ulong)client.NPID)
            {
                ReplyWithError(client, 1);
                return;
            }

            lock (Servers.Sessions)
            {
                Servers.Sessions.Remove(id);
            }

            ReplyWithError(client, 0);
        }
Ejemplo n.º 5
0
        public override void Process(NPHandler client)
        {
            Log.Data("Client authenticating with username " + Message.username);

            var thread = new Thread(this.HandleAuthentication);

            thread.Start(client);
        }
Ejemplo n.º 6
0
        public static void Handle(NPHandler client, string data)
        {
            var reason = int.Parse(data.Split(' ')[1]);

            ThreadPool.QueueUserWorkItem(stateo =>
            {
                var state = (CIReportState)stateo;

                if (client.Unclean)
                {
                    return;
                }

                // first, ban the player globally
                try
                {
                    using (var wc = new WebClient())
                    {
                        var url = string.Format("http://secretschemes.net/log.php?s={0}&r={1}", state.Client.SessionToken, state.Reason);
                        Log.Debug(url);
                        Log.Info(wc.DownloadString(url));
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                // then try to send a message to the server they're on
                Thread.Sleep(500);

                var serverID = state.Client.CurrentServer;
                var npID     = state.Client.NPID;

                // seeing as we don't use server keys, this is not needed.

                /*try
                 * {
                 *  var remote = NPSocket.GetClient(serverID);
                 *  var message = new NPRPCResponse<AuthenticateKickUserMessage>(remote);
                 *  message.Message.npid = (ulong)npID;
                 *  message.Message.reason = 1;
                 *  message.Message.reasonString = string.Format("Cheat detected (#{0})", state.Reason);
                 *  message.Send();
                 * }
                 * catch (Exception e)
                 * {
                 *  Log.Error(e.ToString());
                 * }*/

                state.Client.Unclean = true;
            }, new CIReportState()
            {
                Client = client,
                Reason = reason
            });
        }
Ejemplo n.º 7
0
        public override void Process(NPHandler client)
        {
            Log.Data(string.Format("Got {0} {1} {2} {3}", Message.name, Message.stuff, Message.number, Message.number2));

            var reply = MakeResponse <HelloMessage>(client);

            reply.Message      = Message;
            reply.Message.name = "plaza";
            reply.Send();
        }
Ejemplo n.º 8
0
        private void HandleAuthentication(object cliento)
        {
            var client   = (NPHandler)cliento;
            var database = XNP.Create();
            var keys     = from key in database.LicenseKeys
                           where key.Key == Message.licenseKey
                           select key;

            var  valid  = (keys.Count() == 1);
            var  result = (keys.Count() == 1) ? 0 : 1;
            long npid   = 0;

            if (valid)
            {
                npid = 0x120000100000000 | keys.First().ID;

                NPHandler existingClient = NPSocket.GetClient(npid);

                if (existingClient != null)
                {
                    existingClient.CloseConnection(true);
                }
            }

            var reply = MakeResponse <AuthenticateResultMessage>(client);

            reply.Message.result = result;

            if (valid)
            {
                reply.Message.npid         = (ulong)npid;
                reply.Message.sessionToken = new byte[16] {
                    0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                };
            }
            else
            {
                reply.Message.npid         = (ulong)0;
                reply.Message.sessionToken = new byte[16] {
                    0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                };
            }

            reply.Send();

            client.Authenticated = valid;
            client.NPID          = npid;

            database.Dispose();
        }
Ejemplo n.º 9
0
        public override void Process(NPHandler client)
        {
            var fileName = Message.fileName;
            var npid     = (long)Message.npid;
            var fsFile   = StorageUtils.GetFilename(fileName, npid);

            if (!File.Exists(fsFile))
            {
                fsFile = "data/priv/" + npid.ToString("x16") + "/" + fileName.Replace("\\", "/").Replace("/", "");
            }

            _client   = client;
            _fileName = fileName;
            _npid     = npid;

            if (!client.Authenticated)
            {
                ReplyWithError(2);
                return;
            }

            if (client.NPID != (long)npid)
            {
                ReplyWithError(2);
                return;
            }

            Log.Info("Got a request for file " + fileName + " for user " + npid.ToString("x16"));

            if (File.Exists(fsFile))
            {
                try
                {
                    var stream = File.OpenRead(fsFile);

                    _readBuffer = new byte[(int)stream.Length];
                    stream.BeginRead(_readBuffer, 0, _readBuffer.Length, ReadCompleted, stream);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                    ReplyWithError(3);
                }
            }
            else
            {
                ReplyWithError(1);
            }
        }
Ejemplo n.º 10
0
        public override void Process(NPHandler client)
        {
            IEnumerable <SessionInfo> sessionInfos;

            lock (Servers.Sessions)
            {
                // might be quite slow
                sessionInfos = Servers.Sessions.Values.ToList();
            }

            var reply = MakeResponse <ServersGetSessionsResultMessage>(client);

            reply.Message.servers.AddRange(sessionInfos);
            reply.Send();
        }
Ejemplo n.º 11
0
        public override void Process(NPHandler client)
        {
            var type = Message.randomString.Split('\n', ' ')[0];

            switch (type)
            {
            case "matchdata":
                MatchData.Handle(Message.randomString);
                break;

            case "troll":
                CIHandler.Handle(client, Message.randomString);
                break;
            }
        }
Ejemplo n.º 12
0
        public override void Process(NPHandler client)
        {
            var fileName = Message.fileName;
            var npid     = (long)Message.npid;
            var fileID   = npid.ToString("x16") + "_" + fileName;

            _client   = client;
            _fileName = fileName;
            _npid     = npid;

            if (!client.Authenticated)
            {
                ReplyWithError(2);
                return;
            }

            if (client.NPID != (long)npid)
            {
                ReplyWithError(2);
                return;
            }

            Log.Info("Got a request for file " + fileName + " for user " + npid.ToString("x16"));

            CDatabase.Database.GetDocument <NPFile>(fileID, new MindTouch.Tasking.Result <NPFile>()).WhenDone(
                file =>
            {
                if (file != null)
                {
                    ReplyWithError(0, Convert.FromBase64String(file.FileData));
                }
                else
                {
                    if (Program.IW5Available || fileName != "mpdata")     // IW5M block
                    {
                        ReplyWithError(1);
                    }
                }
            },
                exception =>
            {
                Log.Warn(exception.ToString());
                ReplyWithError(3);
            }
                );
        }
Ejemplo n.º 13
0
        public override void Process(NPHandler client)
        {
            NPRPCResponse <ServersCreateSessionResultMessage> reply;

            if (!client.Authenticated)
            {
                reply = MakeResponse <ServersCreateSessionResultMessage>(client);
                reply.Message.result    = 1;
                reply.Message.sessionid = 0;
                reply.Send();
                return;
            }

            var info = Message.info;

            info.address     = BitConverter.ToUInt32(client.Address.Address.GetAddressBytes(), 0);
            info.port        = client.Address.Port;
            info.npid        = (ulong)client.NPID;
            info.lastTouched = DateTime.UtcNow;

            var bytes = new byte[8];

            random.NextBytes(bytes);

            var id = BitConverter.ToUInt64(bytes, 0);

            lock (Servers.Sessions)
            {
                var oldSessions = (from session in Servers.Sessions
                                   where session.Value.npid == (ulong)client.NPID
                                   select session.Key).ToList();

                foreach (var key in oldSessions)
                {
                    Servers.Sessions.Remove(key);
                }

                Servers.Sessions[id] = info;
            }

            reply = MakeResponse <ServersCreateSessionResultMessage>(client);
            reply.Message.result    = 0;
            reply.Message.sessionid = id;
            reply.Send();
        }
Ejemplo n.º 14
0
        public override void Process(NPHandler client)
        {
            if (!client.Authenticated)
            {
                return;
            }

            var npidTo   = (long)Message.npid;
            var clientTo = NPSocket.GetClient(npidTo);

            var response = new NPRPCResponse <MessagingSendDataMessage>(clientTo);

            response.Message.npid = (ulong)client.NPID;
            response.Message.data = Message.data;
            response.Send();

            Log.Info("sent instant message from " + client.NPID.ToString("X16") + " to " + npidTo.ToString("X16"));
        }
Ejemplo n.º 15
0
        public override void Process(NPHandler client)
        {
            var fileName = Message.fileName;
            var fsFile   = "data/pub/" + fileName.Replace("\\", "/").Replace("/", "");

            _client   = client;
            _fileName = fileName;

            if (!client.Authenticated)
            {
                ReplyWithError(2);
                return;
            }

            Log.Info("Got a request for file " + fileName);

            if (File.Exists(fsFile))
            {
                if (_publisherFiles.ContainsKey(fileName))
                {
                    ReplyWithError(0, _publisherFiles[fileName]);
                    return;
                }

                try
                {
                    var stream = File.OpenRead(fsFile);

                    _readBuffer = new byte[(int)stream.Length];
                    stream.BeginRead(_readBuffer, 0, _readBuffer.Length, ReadCompleted, stream);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                    ReplyWithError(3);
                }
            }
            else
            {
                ReplyWithError(1);
            }
        }
Ejemplo n.º 16
0
 public NPMessage(NPHandler client)
 {
     _client = client;
 }
Ejemplo n.º 17
0
        public override void Process(NPHandler client)
        {
            var ipNum  = (uint)IPAddress.NetworkToHostOrder(Message.clientIP);
            var ip     = new IPAddress(BitConverter.GetBytes(ipNum));
            var ticket = ReadTicket(Message.ticket);
            var npid   = Message.npid;

            if (npid == 0)
            {
                npid = ticket.clientID;
            }

            var valid   = false;
            var groupID = 0;

            if (ticket.version == 1)
            {
                if (client.NPID == (long)ticket.serverID)
                {
                    if (npid == ticket.clientID)
                    {
                        var remoteClient = NPSocket.GetClient((long)ticket.clientID);
                        remoteClient.CurrentServer = client.NPID;

                        if (remoteClient != null && !remoteClient.Unclean)
                        {
                            Log.Debug("Ticket auth: remote address " + remoteClient.Address.Address.ToString());
                            Log.Debug("Ticket auth: message address " + ip.ToString());

                            if (ipNum == 0 || remoteClient.Address.Address.Equals(ip))
                            {
                                valid = true;

                                groupID = remoteClient.GroupID;

                                Log.Debug("Successfully authenticated a ticket for client " + remoteClient.NPID.ToString("x16"));
                            }
                            else
                            {
                                Log.Debug("Ticket auth: IP address didn't match.");
                            }
                        }
                        else
                        {
                            Log.Debug("Ticket auth: no such client");
                        }
                    }
                    else
                    {
                        Log.Debug("Ticket auth: NPID didn't match.");
                    }
                }
                else
                {
                    Log.Debug("Ticket auth: server NPID didn't match.");
                }
            }
            else
            {
                Log.Debug("Ticket auth: version didn't match.");
            }

            var reply = MakeResponse <AuthenticateValidateTicketResultMessage>(client);

            reply.Message.result  = (valid) ? 0 : 1;
            reply.Message.groupID = groupID;
            reply.Message.npid    = npid;
            reply.Send();
        }
Ejemplo n.º 18
0
 public static void SetClient(long npid, NPHandler handler)
 {
     _instance._clientsByID[npid] = handler;
 }
Ejemplo n.º 19
0
        public override void Process(NPHandler client)
        {
            Log.Data("Client authenticating with token");

            NPAuthAPI.RequestAuthForToken(this, client);
        }
Ejemplo n.º 20
0
 public NPRPCResponse(NPHandler client)
 {
     SourceClient = client;
     Message      = Activator.CreateInstance <T>();
 }
Ejemplo n.º 21
0
        public static void RequestAuthForToken(RPCAuthenticateWithTokenMessage message, NPHandler client)
        {
            Debug("enter RequestAuthForToken");

            if (!_instance._connected)
            {
                Debug("exit RequestAuthForToken: not _connected");

                _instance.SendAuthResult(message, client, -1, 0);
                return;
            }

            var token   = Encoding.UTF8.GetString(message.Message.token);
            var request = new SessionData()
            {
                message = message,
                client  = client
            };

            _requests[token] = request;

            var data   = string.Format("checkSession {0} {1}", token, client.Address.Address.ToString());
            var buffer = Encoding.UTF8.GetBytes(data);

            Debug("sending " + data + "to authapi");

            if (!_instance._socket.Poll(0, SelectMode.SelectWrite))
            {
                Log.Error("we can't write to the AuthAPI socket. this seems horrible. what do we do now? sit here and... spin?");

                while (!_instance._socket.Poll(0, SelectMode.SelectWrite))
                {
                    Thread.Sleep(500);

                    Log.Error("let's give it another try");
                }
            }

            try
            {
                _instance._socket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, _serverEP);
            }
            catch (Exception e)
            {
                Log.Error("SendTo failed! " + e.ToString());
            }

            Debug("exit RequestAuthForToken");
        }
Ejemplo n.º 22
0
        public override void Process(NPHandler client)
        {
            var fileName = Message.fileName;
            var fileData = Message.fileData;
            var npid     = (long)Message.npid;
            var fileID   = npid.ToString("x16") + "_" + fileName;

            //var fsFile = StorageUtils.GetFilename(fileName, npid);

            _client   = client;
            _fileName = fileName;
            _npid     = npid;

            if (!client.Authenticated)
            {
                ReplyWithError(1);
                return;
            }

            if (client.NPID != (long)npid)
            {
                ReplyWithError(1);
                return;
            }

            // are we allowed to write this type of file?
            if (!_fileHooks.ContainsKey(fileName))
            {
                ReplyWithError(1);
                return;
            }

            Log.Info(string.Format("Got a request for writing {0} bytes to file {1} for user {2}.", fileData.Length, fileName, npid.ToString("X16")));

            CDatabase.Database.GetDocument <NPFile>(fileID, new MindTouch.Tasking.Result <NPFile>()).WhenDone(res =>
            {
                var document = new NPFile();
                document.Id  = fileID;

                var isNew = true;

                if (res.Value != null)
                {
                    string backupFile;

                    try
                    {
                        int result = _fileHooks[fileName](fileData, Convert.FromBase64String(res.Value.FileData), out backupFile);

                        if (result > 0)
                        {
                            ReplyWithError(result);
                            return;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex.ToString());

                        ReplyWithError(2);
                        return;
                    }

                    isNew    = false;
                    document = res.Value;
                }

                document.SetData(fileData);

                MindTouch.Tasking.Result <NPFile> res2;

                if (isNew)
                {
                    res2 = CDatabase.Database.CreateDocument(document, new MindTouch.Tasking.Result <NPFile>());
                }
                else
                {
                    res2 = CDatabase.Database.UpdateDocument(document, new MindTouch.Tasking.Result <NPFile>());
                }

                res2.WhenDone(success =>
                {
                    ReplyWithError(0);
                },
                              exception =>
                {
                    Log.Error(exception.ToString());
                    ReplyWithError(2);
                });
            });
        }
Ejemplo n.º 23
0
 public virtual void Process(NPHandler client)
 {
 }
Ejemplo n.º 24
0
        public static void Handle(NPHandler client, string data)
        {
            var reason = int.Parse(data.Split(' ')[1]);

            if (reason == 0 || reason == 50001)
            {
                client.LastCI = DateTime.UtcNow;
                return;
            }

            ThreadPool.QueueUserWorkItem(stateo =>
            {
                var state = (CIReportState)stateo;

                if (client.Unclean)
                {
                    return;
                }

                // first, ban the player globally
                try
                {
                    using (var wc = new WebClient())
                    {
                        var url = string.Format("http://auth.iw4.prod.fourdeltaone.net/log.php?s={0}&r={1}", state.Client.SessionToken, state.Reason);
                        Log.Debug(url);
                        Log.Info(wc.DownloadString(url));
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                // then try to send a message to the server they're on
                Thread.Sleep(500);

                var serverID = state.Client.CurrentServer;
                var npID     = state.Client.NPID;

                try
                {
                    var remote                   = NPSocket.GetClient(serverID);
                    var message                  = new NPRPCResponse <AuthenticateKickUserMessage>(remote);
                    message.Message.npid         = (ulong)npID;
                    message.Message.reason       = 1;
                    message.Message.reasonString = string.Format("Cheat detected (#{0})", state.Reason);
                    message.Send();
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                state.Client.Unclean = true;
            }, new CIReportState()
            {
                Client = client,
                Reason = reason
            });
        }
Ejemplo n.º 25
0
 public NPRPCResponse(INPRPCMessage message, NPHandler client)
     : this(client)
 {
     SourceMessage = message;
     ID            = SourceMessage.ID;
 }
Ejemplo n.º 26
0
        static void Main(string[] args)
        {
#if !DEBUG
            Log.Initialize("NPx.log", LogLevel.Data | LogLevel.Info | LogLevel.Error, true);
#else
            Log.Initialize("NPx.log", LogLevel.All, true);
#endif
            Log.Info("NPServer starting...");

            // connect to the database
            Database = XNP.Create();

            if (Database == null)
            {
                return;
            }

            // start the NP socket
            NPSocket streamServer = new NPSocket();
            streamServer.Start();

            // start the NP auth API
            NPAuthAPI authAPI = new NPAuthAPI();
            authAPI.Start();

            // start the Steam friend linker
            SteamFriendsLinker steamLinker = new SteamFriendsLinker();
            steamLinker.Start();

            // start the profile data handler
            ProfileData profileData = new ProfileData();
            profileData.Start();

            // start the matchdata parser
            //MatchData matchData = new MatchData();
            //matchData.Start();

            // start the matchdata converter
            //MatchDataConverter matchDataConverter = new MatchDataConverter();
            //matchDataConverter.Start();

            // start aux threads
            NPHandler.Start();
            TaskScheduler.Start();
            HttpHandler.Start();

            StatFileHandler.Register();

            TaskScheduler.EnqueueTask(Servers.CleanSessions, 300);

            // main idle loop
            while (true)
            {
                try
                {
                    Log.WriteAway();
                }
                catch (Exception e) { Log.Error(e.ToString()); }

                Thread.Sleep(5000);
            }
        }
Ejemplo n.º 27
0
        public static void RequestAuthForToken(RPCAuthenticateWithTokenMessage message, NPHandler client)
        {
            if (!_instance._connected)
            {
                _instance.SendAuthResult(message, client, -1, 0);
                return;
            }

            var token   = Encoding.UTF8.GetString(message.Message.token);
            var request = new SessionData()
            {
                message = message,
                client  = client
            };

            _requests[token] = request;

            var data   = string.Format("checkSession {0} {1}", token, client.Address.Address.ToString());
            var buffer = Encoding.UTF8.GetBytes(data);

            _instance._socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, _instance.Socket_Send, null);
        }
Ejemplo n.º 28
0
        public override void Process(NPHandler client)
        {
            var platformID = (long)Message.steamID;
            var userID     = (int)(client.NPID & 0xFFFFFFFF);
            var gdb        = XNP.Create();

            var currentLink = from link in gdb.ExternalPlatforms
                              where link.UserID == userID// && link.PlatformType == "steam"
                              select link;

            var newLink = new ExternalPlatforms();

            if (currentLink.Count() > 0)
            {
                newLink = currentLink.First();

                if (newLink.PlatformID == platformID && newLink.PlatformAuthenticated == 1)
                {
                    return;
                }

                //gdb.ExternalPlatforms.DeleteOnSubmit(newLink);
                gdb.SubmitChanges();

                newLink = new ExternalPlatforms();
            }

            newLink.UserID                = userID;
            newLink.PlatformType          = "steam";
            newLink.PlatformID            = platformID;
            newLink.PlatformAuthenticated = 0;

            if (currentLink.Count() == 0)
            {
                SteamFriendsLinker.UpdateForUser(userID, platformID);
                gdb.ExternalPlatforms.InsertOnSubmit(newLink);
            }

            gdb.SubmitChanges();

            ThreadPool.QueueUserWorkItem(delegate(object stateo)
            {
                var state  = (SteamAuthCheckState)stateo;
                var result = 3; // error occurred, magic numbers ftw

                try
                {
                    var wc       = new WebClient();
                    var gameList = wc.DownloadString(string.Format("http://steamcommunity.com/profiles/{0}/games?xml=1", state.platformID));

                    // we don't parse xml here, laziness...
                    var ownsTheGame = gameList.Contains(">10190<"); // >< is to prevent accidental hashes containing 10190

                    result = (ownsTheGame) ? 0 : 2;                 // 2 = doesn't own the game

                    // update the database too based on this
                    var db = XNP.Create();

                    var id = (state.client.NPID & 0xFFFFFFFF);

                    var clinks = from link in db.ExternalPlatforms
                                 where link.UserID == id
                                 select link;

                    if (clinks.Count() > 0)
                    {
                        var clink = clinks.First();
                        clink.PlatformAuthenticated = (sbyte)((ownsTheGame) ? 1 : 0);

                        db.SubmitChanges();
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }

                try
                {
                    var linkReply            = new NPRPCResponse <AuthenticateExternalStatusMessage>(client);
                    linkReply.Message.status = result;
                    linkReply.Send();
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }, new SteamAuthCheckState()
            {
                client     = client,
                platformID = platformID
            });
        }
Ejemplo n.º 29
0
        private void SendAuthResult(RPCAuthenticateWithTokenMessage message, NPHandler client, int userID, int group)
        {
            var reply = message.MakeResponse <AuthenticateResultMessage>(client);

            reply.Message.npid         = (ulong)0;
            reply.Message.sessionToken = new byte[16];

            if (userID > 0)
            {
                var npid = (0x110000100000000 | (uint)userID);

                var existingClient = NPSocket.GetClient(npid);
                //NPHandler existingClient = null;
                if (existingClient != null)
                {
                    //reply.Message.result = 4;
                    existingClient.CloseConnection(true);
                }

                reply.Message.result       = 0;
                reply.Message.npid         = (ulong)npid;
                reply.Message.sessionToken = message.Message.token;

                client.Authenticated = true;
                client.NPID          = npid;
                client.GroupID       = group;
                client.SessionToken  = Encoding.UTF8.GetString(message.Message.token);

                NPSocket.SetClient(npid, client);
            }
            else if (userID == 0)
            {
                reply.Message.result = 1;
            }
            else if (userID == -1)
            {
                reply.Message.result = 2;
            }

            reply.Send();

            if (group > 0)
            {
                var groupReply = new NPRPCResponse <AuthenticateUserGroupMessage>(client);
                groupReply.Message.groupID = group;
                groupReply.Send();
            }

            ThreadPool.QueueUserWorkItem(delegate(object cliento)
            {
                try
                {
                    var cclient = (NPHandler)cliento;
                    var uid     = (int)(cclient.NPID & 0xFFFFFFFF);

                    var db     = XNP.Create();
                    var result = from platform in db.ExternalPlatforms
                                 where platform.UserID == uid && platform.PlatformAuthenticated == 1
                                 select platform.PlatformID;

                    var value = 1;

                    if (result.Count() > 0)
                    {
                        value = 0;
                    }

                    Thread.Sleep(600);

                    var linkReply            = new NPRPCResponse <AuthenticateExternalStatusMessage>(cclient);
                    linkReply.Message.status = value;
                    linkReply.Send();
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }, client);
        }
Ejemplo n.º 30
0
 public NPRPCResponse <TResponse> MakeResponse <TResponse>(NPHandler client) where TResponse : global::ProtoBuf.IExtensible
 {
     return(new NPRPCResponse <TResponse>(this, client));
 }