Ejemplo n.º 1
0
        private void initTask(PowerTaskArgs taskArgs, NetworkStream stream, User user)
        {
            if (!AvailableTasks.ContainsKey(taskArgs.taskName))
            {
                new PowerMessage(MessageType.TaskInitResult, taskArgs.taskId, Details.NoSuchTask).Serialize(stream);
                return;
            }

            Action <PowerTaskProgress> progressCallback = (taskpower) =>
            {
                new PowerMessage(MessageType.TaskProgress, taskpower).Serialize(stream);
            };
            Action <PowerTaskResult> resultCallback = (taskpower) =>
            {
                //runningTasks.Remove(taskpower.taskId);
                new PowerMessage(MessageType.TaskResult, taskpower).Serialize(stream);
            };
            Action <PowerTaskResult> completeCallback = (taskpower) =>
            {
                runningTasks.Remove(taskpower.taskId);
                usersTasks[user.publicKey].Remove(taskpower.taskId);
                new PowerMessage(MessageType.TaskComplete, taskpower).Serialize(stream);
            };
            Action <PowerTaskError> errorCallback = (taskpower) =>
            {
                if (taskpower.fatal)
                {
                    runningTasks.Remove(taskpower.taskId);
                    usersTasks[user.publicKey].Remove(taskpower.taskId);
                }
                new PowerMessage(MessageType.TaskError, taskpower).Serialize(stream);
            };

            int id = 0;

            while (runningTasks.ContainsKey(id))
            {
                id++;
            }

            PowerTaskThread powerThread = new PowerTaskThread(id, taskArgs.taskName, new Thread(() =>
            {
                PowerTaskFunc powerTaskFunc = AvailableTasks[taskArgs.taskName];
                try
                {
                    powerTaskFunc.func(taskArgs, progressCallback, resultCallback, completeCallback, errorCallback);
                }
                catch (Exception e)
                {
                    errorCallback(new PowerTaskError(id, taskArgs.taskName, true, e));
                }
            }));

            runningTasks[id] = powerThread;
            usersTasks[user.publicKey][powerThread.taskId] = powerThread;
            powerThread.thread.Start();

            //new int[] {task.taskId, id} - here we put 1st is ClientTaskId and 2nd is ServerTaskId
            new PowerMessage(MessageType.TaskInitResult, new PowerTaskIds(id, taskArgs.taskName, taskArgs.taskId), Details.Accepted).Serialize(stream);
        }
Ejemplo n.º 2
0
        private void clientProccessing(TcpClient client)
        {
            Byte[] bytes = new Byte[256];

            Console.WriteLine("Connected!");

            // Get a stream object for reading and writing
            NetworkStream stream = client.GetStream();

            bool       sessionActive          = true;
            bool       authorized             = false;
            IPEndPoint clientIp               = (IPEndPoint)client.Client.RemoteEndPoint;
            User       user                   = null;
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider(512);

            byte[] token = new byte[0];
            while (sessionActive)
            {
                try
                {
                    PowerMessage mess;
                    try
                    {
                        mess = PowerMessage.Deserialize(stream);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Message deserialize error. Connection was shut down");
                        client.Close();
                        stream.Close();
                        return;
                    }
                    switch (mess.messType)
                    {
                    case MessageType.Greeting:
                        new PowerMessage(MessageType.Greeting).Serialize(stream);
                        break;

                    case MessageType.EndSession:
                        Console.WriteLine(clientIp.ToString() + " disconnected");
                        sessionActive = false;
                        break;

                    case MessageType.AuthInit:
                        //checking if user registered
                        string publicKeyXML = (string)mess.value;

                        PowerMessage resMess = new PowerMessage(MessageType.AuthInitResult, Details.NoSuchUser);
                        if (users.ContainsKey(publicKeyXML))
                        {
                            provider.FromXmlString(publicKeyXML);
                            user            = users[publicKeyXML];
                            resMess.details = Details.UserExists;

                            //sending token
                            token = Guid.NewGuid().ToByteArray();
                            new PowerMessage(MessageType.AuthToken, token).Serialize(stream);
                        }
                        resMess.Serialize(stream);
                        break;

                    case MessageType.AuthToken:
                        //verify token
                        byte[] sign    = (byte[])mess.value;
                        bool   success = authorized = provider.VerifyData(token, "SHA256", sign);

                        Details details = (success) ? Details.Authorised : Details.AuthFailed;
                        new PowerMessage(MessageType.AuthTokenResult, 0, details).Serialize(stream);
                        break;

                    case MessageType.RegistrationRequest:
                        string pkey = (string)mess.value;
                        if (users.ContainsKey(pkey))
                        {
                            new PowerMessage(MessageType.RegistrationResult, Details.AlreadyRegistered).Serialize(stream);
                            break;
                        }

                        bool toRegistrate = registrate(pkey, clientIp.ToString());
                        if (toRegistrate)
                        {
                            provider.FromXmlString(pkey);
                            users[pkey]      = new User(pkey);
                            usersTasks[pkey] = new Dictionary <int, PowerTaskThread>();
                            new PowerMessage(MessageType.RegistrationResult, Details.Success).Serialize(stream);

                            OnUserRegisteredFinished(this, users[pkey]);
                            saveConfiguration();
                        }
                        else
                        {
                            new PowerMessage(MessageType.RegistrationResult, Details.AccessDenied).Serialize(stream);
                        }

                        break;

                    case MessageType.TaskInit:
                        //task searching
                        PowerTaskArgs taskArgs = (PowerTaskArgs)mess.value;
                        initTask(taskArgs, stream, user);

                        break;

                    case MessageType.TasksList:
                        if (!authorized)
                        {
                            new PowerMessage(MessageType.TasksList, Details.AccessDenied).Serialize(stream);
                            break;
                        }

                        new PowerMessage(MessageType.TasksList, AvailableTasks, Details.OK).Serialize(stream);
                        break;
                    }
                }
                catch (Exception e)
                {
                    new PowerMessage(MessageType.Error, e).Serialize(stream);
                    continue;
                }
            }

            client.Close();
        }