Beispiel #1
0
        public async Task <bool> HTML_AutenticarUsuario(Pacote_Auth Pacote_AuthWEB)
        {
            try
            {
                HttpClient URL = new HttpClient();
                List <KeyValuePair <string, string> > pairs = Pacote_AuthWEB.ListarAtributos();

                var content = new FormUrlEncodedContent(pairs);

                URL.Timeout = TimeSpan.FromSeconds(3);

                Task <HttpResponseMessage> Conteudo = URL.PostAsync(_Servidor, content);
                await Task.WhenAll(Conteudo);

                if (Conteudo.Result.IsSuccessStatusCode)
                {
                    string Dados = await Conteudo.Result.Content.ReadAsStringAsync();

                    Pacote_Base PB = JsonConvert.DeserializeObject <Pacote_Base>(Dados);
                    if (PB.Pacote != TipoPacote.Error)
                    {
                        Pacote_Autenticacao             = JsonConvert.DeserializeObject <Pacote_Auth>(PB.Conteudo);;
                        Pacote_Autenticacao.Autenticado = true;
                        Pacote_Autenticacao.Error       = false;


                        return(true);
                    }
                    else
                    {
                        Error = JsonConvert.DeserializeObject <Pacote_Error>(PB.Conteudo);
                        return(false);
                    }
                }
                else
                {
                    Pacote_AuthWEB.Autenticado = false;
                    Pacote_AuthWEB.Error       = true;
                    Error          = new Pacote_Error();
                    Error.Error    = true;
                    Error.Mensagem = "A conexão com o URi não foi estabelecida com sucesso!";

                    return(false);
                }
            }
            catch (Exception e)
            {
                TratadorErros(e, GetType().Name);
                //Classe Tratador de erros tem métodos para tratar erro a esse nível
                return(false);
            }
        }
        /**
         * Data: 27/03/2019
         * Método que recebe a requisição WEB do cliente, trata e a responde.
         */
        private void Receber_Dados_Responder(object Dados)
        {
            Pacote_Error P_Error;

            HttpListenerContext Conexao       = Dados as HttpListenerContext;
            HttpListenerRequest ObterConteudo = Conexao.Request;
            StreamReader        _Conteudo     = new StreamReader(ObterConteudo.InputStream);

            HttpListenerResponse ObterResposta = Conexao.Response;

            try
            {
                string __Conteudo = _Conteudo.ReadLine();
                /*-----------------------Processamento----------------------------*/



                dynamic QTP = DeserializarPacote(__Conteudo);
                switch (Base.Pacote)
                {
                case TipoPacote.Comando:
                    Pacote_Comando CMM = (Pacote_Comando)QTP;     //Transforma string em um objeto da classe Pacote_Auth

                    bool _Autenticado = (bool)_Auth.HTML_Autenticado(CMM.Chave);

                    if (!_Autenticado)
                    {
                        throw new Exception("Usuário não autenticado.");
                    }

                    _GerenciadorCliente?.ConectarCliente(Conexao.Request.RemoteEndPoint, _Autenticado);

                    string Executar = _ResponderRequisicao(CMM);

                    if (Excecao)
                    {
                        P_Error          = new Pacote_Error();
                        P_Error.Error    = Excecao;
                        P_Error.Mensagem = DadosExcecao.Message;
                        P_Error.Tracer   = DadosExcecao.StackTrace;

                        Executar     = SerializarPacote(P_Error);
                        Excecao      = false;
                        DadosExcecao = null;
                    }

                    Pacote_Comando PCT = new Pacote_Comando();
                    PCT.Resposta = Executar;
                    string DadosPacote = SerializarPacote(PCT);
                    //Obtém o Barramento de escrita com a cliente
                    ObterResposta.ContentLength64 = DadosPacote.Length;
                    ObterResposta.OutputStream.Write(ASCIIEncoding.UTF8.GetBytes(DadosPacote), 0, DadosPacote.Length);
                    ObterResposta.Close();

                    break;

                case TipoPacote.Echo:
                    Pacote_PingReplay RPY = new Pacote_PingReplay();
                    DadosPacote = SerializarPacote(RPY);
                    //Obtém o Barramento de escrita com a cliente
                    ObterResposta.ContentLength64 = DadosPacote.Length;
                    ObterResposta.OutputStream.Write(ASCIIEncoding.UTF8.GetBytes(DadosPacote), 0, DadosPacote.Length);
                    ObterResposta.Close();
                    break;


                default:
                    P_Error          = new Pacote_Error();
                    P_Error.Error    = true;
                    P_Error.Mensagem = "Esse tipo de pacote não existe.";
                    P_Error.Tracer   = "";

                    DadosPacote = SerializarPacote(P_Error);
                    ObterResposta.ContentLength64 = DadosPacote.Length;
                    ObterResposta.OutputStream.Write(ASCIIEncoding.UTF8.GetBytes(DadosPacote), 0, DadosPacote.Length);
                    ObterResposta.Close();
                    break;
                }
            }
            catch (Exception e)
            {
                TratadorErros(e, this.GetType().Name);

                P_Error          = new Pacote_Error();
                P_Error.Error    = Excecao;
                P_Error.Mensagem = DadosExcecao.Message;
                P_Error.Tracer   = DadosExcecao.StackTrace;

                string Erros = SerializarPacote(P_Error);
                ObterResposta.ContentLength64 = Erros.Length;
                ObterResposta.OutputStream.Write(ASCIIEncoding.UTF8.GetBytes(Erros), 0, Erros.Length);
                ObterResposta.Close();

                Excecao      = false;
                DadosExcecao = null;
            }
        }
        /**
         * Data: 27/02/2019
         * Método que cria os barramentos de leitura e escrita, dá início ao diálogo inicial com os clientes e
         * e dá início à conversa contínua com os cliente.
         * Return: void
         */
        private void Receber_Dados_Responder(object Dados)
        {
            StreamReader BarramentoLeitura;
            StreamWriter BarramentoEscrita;
            Pacote_Error P_Error;

            try
            {
                TcpClient Clients = (TcpClient)Dados;

                Func <string, bool> Falha = (G) => {
                    if (G == null)
                    {
                        EndPoint Fl = Clients.Client.RemoteEndPoint;
                        throw new Exception("Ocorreu uma falha no Servidor: " + Fl.ToString());
                    }
                    else
                    {
                        return(true);
                    }
                };

                using (NetworkStream Brrm = Clients.GetStream())
                {
                    //Barramento de Leitura, após a abertura do socket
                    BarramentoLeitura = new StreamReader(Brrm);
                    //Obtém o Barramento de escrita com a cliente
                    BarramentoEscrita = new StreamWriter(Brrm);

                    string DadosLidos = BarramentoLeitura.ReadLine();
                    Falha(DadosLidos);//Verifica se o barramento é nulo, caracterizando uma falha na comunicação.

                    Pacote_PingEcho Echo = DeserializarPacote(DadosLidos);
                    /*Verifica se, cliente e servidor estão em sintonia, ocorreu algum erro*/
                    if (Echo.GetTipoPacote() != TipoPacote.Echo)
                    {
                        Pacote_PingReplay Replay = new Pacote_PingReplay();
                        Replay.Validado = false;
                        Replay.ObterTempo();

                        /*Confirma o recebimento, do cliente, inicialização.*/
                        BarramentoEscrita.WriteLine(SerializarPacote(Replay));
                        BarramentoEscrita.Flush();

                        throw new Exception("Falha de comunicação inicial: Cliente");
                    }
                    else
                    {
                        Pacote_PingReplay Replay = new Pacote_PingReplay();
                        Replay.Validado = true;
                        Replay.ObterTempo();

                        /*Confirma o recebimento, do cliente, inicialização.*/
                        BarramentoEscrita.WriteLine(SerializarPacote(Replay));
                        BarramentoEscrita.Flush();
                    }

                    DadosLidos = BarramentoLeitura.ReadLine();
                    Falha(DadosLidos);//Verifica se o barramento é nulo, caracterizando uma falha na comunicação.

                    string EnviarDadosCliente = TratarInicializacao(DadosLidos);


                    /*Informa ao cliente que os parâmetros de inicialização foram recebidos com sucesso.*/
                    BarramentoEscrita.WriteLine(EnviarDadosCliente);
                    BarramentoEscrita.Flush();

                    /*Processo de leitura do pacote de autenticação.*/
                    DadosLidos = BarramentoLeitura.ReadLine();
                    Falha(DadosLidos);                                //Verifica se o barramento é nulo, caracterizando uma falha na comunicação.

                    Pacote_Auth PTC = DeserializarPacote(DadosLidos); //Transforma string em um objeto da classe Pacote_Auth
                    PTC.TEndPointServer = TEndPoint;
                    PTC.DominioServidor = EDominio;
                    Pacote_Auth _Autenticado = _Auth?.AutenticarUsuario(PTC);
                    if (_Autenticado != null)
                    {
                        _GerenciadorCliente?.ConectarCliente(Clients.Client.RemoteEndPoint, _Autenticado);
                        EnviarDadosCliente = SerializarPacote(_Autenticado);
                        BarramentoEscrita.WriteLine(EnviarDadosCliente);
                        BarramentoEscrita.Flush();


                        //Leitura do barramento de dados do próximo tipo de pacote
                        DadosLidos = BarramentoLeitura.ReadLine();
                        Falha(DadosLidos);//Verifica se o barramento é nulo, caracterizando uma falha na comunicação.

                        dynamic QTP = DeserializarPacote(DadosLidos);
                        switch (Base.Pacote)
                        {
                        case TipoPacote.Comando:
                            Pacote_Comando CMM      = (Pacote_Comando)QTP; //Transforma string em um objeto da classe Pacote_Auth
                            string         Executar = _ResponderRequisicao(CMM);

                            if (Excecao)
                            {
                                P_Error          = new Pacote_Error();
                                P_Error.Error    = Excecao;
                                P_Error.Mensagem = DadosExcecao.Message;
                                P_Error.Tracer   = DadosExcecao.StackTrace;

                                Executar     = SerializarPacote(P_Error);
                                Excecao      = false;
                                DadosExcecao = null;
                            }

                            Pacote_Comando PCT = new Pacote_Comando();
                            PCT.Resposta = Executar;
                            string DadosPacote = SerializarPacote(PCT);
                            //Obtém o Barramento de escrita com a cliente
                            BarramentoEscrita.WriteLine(DadosPacote);
                            BarramentoEscrita.Flush();

                            break;

                        case TipoPacote.Echo:
                            Pacote_PingReplay RPY = new Pacote_PingReplay();
                            DadosPacote = SerializarPacote(RPY);
                            //Obtém o Barramento de escrita com a cliente
                            BarramentoEscrita.WriteLine(DadosPacote);
                            BarramentoEscrita.Flush();
                            break;

                        case TipoPacote.File:
                            Pacote_File FILE     = (Pacote_File)QTP;
                            string      PathFile = FILE.Path;

                            int ReceiveBufferClienteSize = FILE.ReceiveBufferCLiente; //Armazena o tamanho do buffer de recepção do cliente;
                            int SendBufferClienteSize    = FILE.SendBufferCliente;    //Armazena o tamanho do buffer de envio do cliente;

                            int ReceiveBufferServerSize = Clients.ReceiveBufferSize;  //Armazena o tamanho do buffer de recepção do cliente;
                            int SendBufferServerSize    = Clients.SendBufferSize;     //Armazena o tamanho do buffer de envio do cliente;

                            //Enviando dados dos buffers do servidor
                            FILE.ReceiveBufferServidor = ReceiveBufferServerSize; //Envia para o server a capacidade de recepção
                            FILE.SendBufferServidor    = SendBufferServerSize;    //envia para o server capacidade o tamanho de envio;

                            int BufferTransmissao = ReceiveBufferClienteSize > SendBufferServerSize ? SendBufferServerSize : ReceiveBufferClienteSize;

                            FILE.Existe = File.Exists(PathFile);
                            if (FILE.Existe)
                            {
                                using (FileStream EnviarArquivo = new FileStream(FILE.Path, FileMode.Open))
                                {
                                    long TamanhoArquivoEnviar = EnviarArquivo.Length;
                                    FILE.Lenght = TamanhoArquivoEnviar;

                                    DadosPacote = SerializarPacote(FILE);
                                    BarramentoEscrita.WriteLine(DadosPacote);
                                    BarramentoEscrita.Flush();

                                    byte[] T = new byte[BufferTransmissao];
                                    using (BinaryWriter EVFILE = new BinaryWriter(Brrm))
                                    {
                                        int LoopEnvio = 0;
                                        do
                                        {
                                            int TotalEnviado = EnviarArquivo.Read(T, 0, BufferTransmissao);
                                            EVFILE.Write(T);
                                            LoopEnvio += TotalEnviado;
                                        } while (LoopEnvio <= TamanhoArquivoEnviar);

                                        EnviarArquivo.Close();
                                    }
                                }
                            }
                            else
                            {
                            }


                            break;

                        default:
                            P_Error          = new Pacote_Error();
                            P_Error.Error    = true;
                            P_Error.Mensagem = "Esse tipo de pacote não existe.";
                            P_Error.Tracer   = "";
                            BarramentoEscrita.WriteLine(SerializarPacote(P_Error));
                            BarramentoEscrita.Flush();
                            break;
                        }
                    }
                    else
                    {   //Não existe mecanismo de autenticação.
                        _Autenticado = new Pacote_Auth {
                            Autenticado = false,
                            Error       = true,
                            EMensagem   = "O servidor não está configurado com nenhum processo de autenticação."
                        };
                        EnviarDadosCliente = SerializarPacote(_Autenticado);
                        BarramentoEscrita.WriteLine(EnviarDadosCliente);
                        BarramentoEscrita.Flush();
                    }



                    BarramentoLeitura.Close();
                    BarramentoEscrita.Close();
                    //Desconectar_Cliente("10.56.34.222","80");
                    Clients.Close();
                }
            }
            catch (Exception e)
            {
                TratadorErros(e, this.GetType().Name);;
            }
        }