public void Execute()
        {
            string username;
            if (Authorize(out username))
            {
                while (true)
                {
                    Request request = this.Formatter.Deserialize(this.SocketStream) as Request;

                    Response response = new Response();
                    try
                    {
                        switch (request.RequestType)
                        {
                            case RequestType.Logout:
                                {
                                    response.Message = "Successfully logged out.";
                                    break;
                                }
                            case RequestType.RegisterToken:
                                {
                                    int rights = this.UsersService.GetRights(username);
                                    if ((rights & (int)Rights.CanRegisterToken) == 0)
                                    {
                                        throw new InvalidOperationException("You don't have rights to do that.");
                                    }

                                    string token;
                                    if (this.TokenizationService.RegisterToken(request.Data as string, out token))
                                    {
                                        response.Data = token;
                                        response.Message = "Successfully registered token.";
                                    }
                                    else
                                    {
                                        throw new ArgumentException("Invalid card number.");
                                    }
                                    break;
                                }
                            case RequestType.GetCardNumber:
                                {
                                    int rights = this.UsersService.GetRights(username);
                                    if ((rights & (int)Rights.CanGetCardNumber) == 0)
                                    {
                                        throw new InvalidOperationException("You don't have rights to do that.");
                                    }

                                    string cardNumber = this.TokenizationService.GetCardNumber(request.Data as string);
                                    response.Data = cardNumber;
                                    response.Message = "Successfully taken card number.";
                                    break;
                                }
                            case RequestType.Terminate:
                                {
                                    response.Message = "Successfully terminated.";
                                    break;
                                }
                            default:
                                {
                                    throw new InvalidOperationException(
                                        string.Format("Operation {0} is not supported.", request.RequestType));
                                }
                        }
                        response.ResponseType = ResponseType.Success;
                    }
                    catch (Exception e)
                    {
                        response.ResponseType = ResponseType.Error;
                        response.Message = e.Message;
                    }

                    this.Formatter.Serialize(this.SocketStream, response);

                    if (request.RequestType == RequestType.Logout)
                    {
                        if (!Authorize(out username))
                        {
                            break;
                        }
                    }

                    if (request.RequestType == RequestType.Terminate)
                    {
                        break;
                    }
                }
            }

            this.Dispose();
        }
        public bool Authorize(out string username)
        {
            username = null;
            while (true)
            {
                Request request = this.Formatter.Deserialize(this.SocketStream) as Request;

                Response response = new Response();
                try
                {
                    switch (request.RequestType)
                    {
                        case RequestType.Login:
                            {
                                var login = request.Data as Login;
                                this.UsersService.Login(login);
                                username = login.Username;
                                response.Message = "Successfully logged!";
                                break;
                            }
                        case RequestType.Terminate:
                            {
                                break;
                            }

                    }
                    response.ResponseType = ResponseType.Success;
                }
                catch (Exception e)
                {
                    response.ResponseType = ResponseType.Error;
                    response.Message = e.Message;
                }

                this.Formatter.Serialize(this.SocketStream, response);

                if (username != null)
                {
                    break;
                }

                if (request.RequestType == RequestType.Terminate)
                {
                    return false;
                }
            }

            return true;
        }