sábado, 27 de setembro de 2014

Corrigindo vulnerabilidade no bash do OS X

Salve galera,

Me deparei com um probleminha de bash no linux, após ler o post sobre falha de segurança grave no bash de máquinas com Linux e OS X.
Segue o link do post:
https://tecnoblog.net/166271/shellshock-falha-grave-bash/

Loguei no pc da empresa, onde estou usando o Xubuntu 14.04 LTS e tudo ok com ele, mas ao tentar rodar os comandos no mac....

Cara, meu Mac estava vulnerável..... Vou postar o passo-a-passo pra quem tem mac......
Existe duas vulnerabilidade no bash do mac, uma é o que o post mostra, e a outra é essa aqui:
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo

Se a data postar, ferrou....

Para verificar se os auto-imported functions estão habilitados, rode o comando: env ls="() { echo 'Game over'; }" bash -c ls

Se printar Game over..... Aí é porque eles ainda estão habilitados....

Provavelmente a versão do seu bash deve ser igual ao do comando abaixo:

$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

Bom, vamos as correções....

O seu bash pode ser corrigido pra quem tem o xcode instalado, aí é só abrir o terminal e realizar os comandos abaixo:

$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ cd ..
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.53(1)-release
$ build/Release/sh --version   # GNU bash, version 3.2.53(1)-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin

Para verificar se o seu bash mudou, segue o comando abaixo:

$ bash --version
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

E para desabilitar que as versões antigas não tenham mais permissões:

$ sudo chmod a-x /bin/bash.old /bin/sh.old

Pronto, tente rodar os comandos de vulnerabilidade agora....
Seu bash agora está seguro.....

Espero ter ajudado....

Segue o link ensinando como fazer o passo-a-passo em inglês:

https://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-shellshock-the-remote-exploit-cve-2014-6271-an/146851#146851

sábado, 21 de dezembro de 2013

Tutorial de como criar um server em C e um client em Java através de sockets

Salve galera! Depois de muito tempo, vou postar um trabalho que fiz na faculdade em linguagem de programação I, que é um conversor de medidas, feito em C e Java.

Para isso, fiz um server em C, uma linguagem de programação estruturada se comunicar com um client feito em Java, uma linguagem Orientada a Objeto.

O propósito deste projeto foi mostrar como é possível fazer duas linguagens de programação se comunicarem.
Toda comunicação foi feita através de sockets, tanto do lado servidor como do lado cliente. Os sockets são os programas responsáveis pela comunicação ou interligação de outros programas pelo protocolo declarado, que no caso foi usado o TCP / IP

O que é TCP/IP?
TCP / IP (TRANSMISSION CONTROL PROTOCOL / INTERNET PROTOCOL) é um padrão de comunicação que reúne um conjunto de protocolos tais como TCP, IP, FTP (FILE TRANSFER PROTOCOL), TELNET, entre outros.
As informações que trafegam na  rede necessitam do TCP/IP, por isso ele é utilizado como protocolo primário da rede na internet. Este protocolo foi dividido em “camadas” bem definidas,  cada uma realizando sua parte na tarefa de comunicação (aplicação, transporte,  rede, e enlace/físico). Este modelo tem a seguinte vantagem: por ter os processos  de comunicação bem definidos e divididos em cada camada, qualquer alteração poderá  ser feita isoladamente, não precisando reescrever todo o protocolo. O TCP/IP tem  como principal característica a transmissão de dados em máquinas que diferem em suas arquiteturas . 

O que é sockets?
Especificamente em computação, um soquete pode ser usado em ligações de redes  de computadores para um fim de um elo bidirecional de comunicação entre dois programas. A interface padronizada de soquetes surgiu originalmente no sistema operacional Unix BSD (Berkeley Software Distribution); portanto, eles são muitas vezes chamados de Berkeley  Sockets. É também uma abstração computacional que mapeia diretamente a uma porta de  transporte (TCP ou UDP) e mais um endereço de rede. Com esse conceito é possível identificar  unicamente um aplicativo ou servidor na rede de comunicação IP.

Tipo de socket usado:
SOCK_STREAM:   Fornece sequencial, seguro, e em ambos os sentidos, conexões baseadas  em "byte streams". Dados "out-of-band" do mecanismo de transmissão devem ser suportados.  O protocolo TCP é baseado neste tipo de socket.

Bom, mas chega de teoria e vamos ao código.

Abaixo vou postar o código feito em C:

server.C

#include <stdio.h>
#include <conio.h>
#include <winsock.h>
#include <malloc.h>
#include <string.h>
#include <windows.h> //Repara que utilzaremos este header para utilizarmos a função Sleep();
WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;

//Declaração global de variáveis
char comando[1024];
char *escolha;
char *valor;

//Função para converter para litro
float to_litro(char *valor)
{
    float ml = 0;
    ml = atof(valor);
    float litro = ml / 1000;
    return litro;
}

//Função para converter para mililitro
float to_ml(char *valor)
{
    float l = 0;
    l = atof(valor);
    float mili = l * 1000;
    return mili;
}

//Função para converter para grama
float to_grama(char *valor)
{
    float k = 0;
    k = atof(valor);
    float kg = k * 1000;
    return kg;
}

//Função para converter para quilo
float to_kg(char *valor)
{
    float k = 0;
    k = atof(valor);
    float kg = k / 1000;
    return kg;
}

//Função para converter para farenheit
float to_farenheit(char *valor)
{
    float c = 0;
    c = atof(valor);
    float farenheit = (c *9)/5 + 32;
    return farenheit;
}

//Função para converter para celsius
float to_celsius(char *valor)
{
    float f = 0;
    f = atof(valor);
    float celsius = (f - 32)/1.8;
    return celsius;
}

int main(){

    //Verifica se deu erro ao inicializar o winsock
    if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR)
    {
        printf("Erro ao inicializar o winsock");
        return 0;
    }

    //Verifica se deu erro ao criar o socket
    if((winsock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
    {
        printf("Erro ao criar socket\n");
        return 0;
    }

    //Atribui uma família ao sock do tipo AF_INET
    sock.sin_family=AF_INET;

    //Atribui uma porta ao sock
    sock.sin_port=htons(4321);

    //Verifica se foi possível fazer um bind do endereço IP ao sock
    if(bind(winsock,(SOCKADDR*)&sock,sizeof(sock))==SOCKET_ERROR)
    {
        printf("Erro ao tentar utilizar a funcao BIND\n");
        return 0;
    }

    //Essa função fica ouvindo até obter um conexão
    listen(winsock,1);

    //Esse laço verifica se a função accept não obteve erro
    while((winsock = accept(winsock,0,0))==SOCKET_ERROR)
    {
        Sleep(1);
    }
    printf("Cliente conectado!\n");

    //Nesse laço, após obter a conexão com o cliente, aguarda os comandos para começar a conversão
    while(1)
    {
        //Declaração das variáveis
        int bytes;
        int choice;
        float celsius, farenheit, kg, grama, ml, litro;
        char result[1024];

        //Aguarda um segundo
        Sleep(1);

        //Recebe do cliente a string e aloca o resultado no vetor comando
        memset(comando,0,1024);

        //O método recv recebe um valor inteiro e com isso, consigo verificar
        //caso o método receba o valor -1, indicando que perdeu a conexão
        bytes=recv(winsock,comando,1024,0);
        if(bytes==-1)
        {
            printf("\nConexao perdida\n");
            return 0;
        }

        //Atribui a variável valor o que estiver antes do TOKEN ">"
        valor = strtok(comando,">");

        //Atribui a variável valor o que estiver depois do TOKEN ">"
        escolha = strtok(NULL,">");

        //converto escolha que é uma string em int e atribui a choice
        choice = atoi(escolha);

        switch(choice)
        {
            case 1:
                printf("Tipo Celsius:\n");
                printf("Valor obtido: %s\n", valor);
                celsius = to_celsius(valor);
                sprintf(result, "%.3f", celsius);
                strcat(result," C\r\n");
                printf("Valor convertido para Celsius: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;

            case 2:
                printf("Tipo Farenheit:\n");
                printf("Valor obtido: %s\n", valor);
                farenheit = to_farenheit(valor);
                sprintf(result, "%.3f", farenheit);
                strcat(result," F\r\n");
                printf("Valor convertido para Farenheit: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;

            case 3:
                printf("Tipo grama:\n");
                printf("Valor obtido: %s\n", valor);
                grama = to_grama(valor);
                sprintf(result, "%.f", grama);
                strcat(result," g\r\n");
                printf("Valor convertido para grama: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;

            case 4:
                printf("Tipo Kg:\n");
                printf("Valor obtido: %s\n", valor);
                kg = to_kg(valor);
                sprintf(result, "%.3f", kg);
                strcat(result," Kg\r\n");
                printf("Valor convertido para Kg: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;

            case 5:
                printf("Tipo Litro:\n");
                printf("Valor obtido: %s\n", valor);
                litro = to_litro(valor);
                sprintf(result, "%.3f", litro);
                strcat(result," L\r\n");
                printf("Valor convertido para litro: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;

            case 6:
                printf("Tipo ml:\n");
                printf("Valor obtido: %s\n", valor);
                ml = to_ml(valor);
                sprintf(result, "%.f", ml);
                strcat(result," ml\r\n");
                printf("Valor convertido para L: %s\n",result);
                send(winsock,result,strlen(result),0);
                break;
        }
    }
    getch();

    //Fecha a conexão
    closesocket(winsock);
    WSACleanup();
    return 0;
}

Como o código está todo comentado, não irei ficar explicando o que cada método ou variável faz.

Agora, segue as classes Java:

Fiz duas classes, uma chamada Reader.java, que estende a classe Thread e a outra que a classe ClientConverter.java.

Reader.java

import java.awt.TextField;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Reader extends Thread {
  //Declaração de variáveis
  protected ClientConverter cliente;
  private TextField output;
  
  public Reader(ClientConverter c, TextField output)
  {
    super("reader");
    this.cliente=c;
    this.output=output;
  }

  public void run()
  {
    String line;
    try
    {
//Recebe o valor enviado pelo server através do socket 
    BufferedReader in = new BufferedReader(new InputStreamReader(cliente.clisoc.getInputStream()));
while(true)
{
//Atribui a variável line o conteúdo recebido
line=in.readLine();
//Adiciona o valor convertido no OutputArea
output.setText(line);
}
    }
    catch(IOException e)
    {
      System.out.println("Reader:"+e);
    }
  }

}

Segue a classe client:


ClientConverter.java

import java.applet.Applet;
import java.awt.Choice;
import java.awt.Event;
import java.awt.Label;
import java.awt.TextField;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JOptionPane;


public class ClientConverter extends Applet
{
    //Declaração de variáveis
private static final long serialVersionUID = 1500488503654718075L;
public static final int DEFAULT_PORT=4321;
public Socket clisoc;
private Thread reader;
public TextField outputArea;
public TextField inputArea;
public TextField inputText;
public PrintStream out;
public Choice combobox;
public String address = "127.0.0.1";
public String inLine;

//Descricao para a caixa comboBox
private String[] description = {
"Escolha o tipo de conversão:",
"Farenheit >>>> Celsius",
"Celsius >>>> Farenheit",
"Kg >>>> gramas",
   "gramas >>>> Kg",
   "mililitro >>>> Litro",
   "Litro >>>> mililitro"};


  //Cria as linhas de leitura e escrita e as inicia.
  public void init()
  {
    outputArea = new TextField(35);
    inputArea = new TextField(35);
    inputText = new TextField(35);
    combobox=new Choice();

    //Inseri os valores para o combobox
    for(int i=0;i<description.length;i++){
    combobox.addItem(description[i]);
    }

    //Tela da Applet
    add(new Label("Converter usando conexão (Socket TCP)\n"));
    add(new Label("Selecione o tipo de conversão:"));
    add(combobox);
    add(new Label("Digite um valor e pressione Enter para converter:\n"));
    add(inputArea);
    add(new Label("Valor digitado:"));
    add(inputText);
    add(new Label("Resultado:"));
    add(outputArea);
    resize(300,350);
    try
    {
      //Cria um socket cliente passando o endereco e a porta do servidor
      clisoc=new Socket(address,DEFAULT_PORT);
      reader=new Reader(this, outputArea);
      out=new PrintStream(clisoc.getOutputStream());
      //Define prioridades desiguais para que o console seja compartilhado
      //de forma efetiva.
      reader.setPriority(3);
      reader.start();
    }
    catch(IOException e)
    {
      System.err.println(e);
      System.exit(0);
    }
  }

  public boolean handleEvent(Event evt)
  {
    if (evt.target==inputArea)
    {
      char c=(char)evt.key;

      //Verifica de o usuário pressionou a tecla ENTER sem ao menos ter selecionado um tipo
      if(c=='\n' && combobox.getSelectedIndex()==0){
     combobox.getFocusListeners();
     inputArea.setText("");
     JOptionPane.showMessageDialog(null, "Selecione um tipo para converter!");
      }
      //Vigia se o usuario pressiona a tecla ENTER.
      //Isso permite saber a mensagem esta pronta para ser enviada!
      if (c=='\n')
      {
        inLine=inputArea.getText();
     
        out.println(inLine+">"+combobox.getSelectedIndex());
        inputArea.setText("");
     
        //Envia a mensagem, passando o valor e o tipo de conversao como parametro.
        return true;
      }
      inputText.setText(inLine);
    }
    return false;
  }

}


Para que dê certo, você irá precisar compactar o projeto, criando um jar e colocá-lo na mesma pasta que o html criado abaixo.

Segue a classe clientConverter.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en-US">
  <head>
    <title>Converter Java Applet</title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
  </head>
  <body>
    <h1>Converter Java Applet</h1>
    <applet code="ClientConverter.class" archive="ClientConvert.jar" width="300" height="350" />
  </body>
</html>

Por ser um applet, você irá precisar mudar a segurança do certificado ou criar uma assinatura (que irei abordar em outro tópico).

Caso queira apenas mudar a segurança, vá em painel de controle --> Java --> Na aba de segurança, alterar para médio e aplicar.

Para inicializar a aplicação, inicialize o server.c primeiro.

Ao clicar no clientConverter.html, irá aparecer um alerta de segurança, avisando que uma aplicação não assinada está tentando ser executada. Clique em executar e seu converter irá ser inicializado.

Pronto, agora é só selecionar o tipo de conversão e pressionar ENTER para que o server converta e envie ao client o resultado.

E é isso, espero que tenha ajudado e até a próxima!!!

Um grande abraço;

Daniel Hideki.

Referências 
http://www-usr.inf.ufsm.br/~giovani/sockets/sockets.txt,
http://reality.sgi.com/employees/jam_sb/mocap/MoCapWP_v2.0.html, 
http://www2.unoeste.br/~chico/comunicacao_socket/,
http://www.forum-invaders.com.br/vb/showthread.php/8249-Tutorial-de-Sockets-para-iniciantes-C,

http://devio.us/~cooler/artigo_socket_em_C/index.html

segunda-feira, 8 de outubro de 2012

Configuração Jetty required full java sdk

Olá galera, fiquei um tempo sumido, mas estou aqui de novo, postando mais uma solução pra quem está tentando colocar o Jetty 8 como serviço de Windows e está obtendo o erro abaixo:

HTTP ERROR 500

Problem accessing /Exemple/iniciar. Reason:
    PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required

Caused by:

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required
 at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
 at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
 at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:119)
 at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:208)
 at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384)
 at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
 at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
 at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
 at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
 at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:542)
 at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
 at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
 at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
 at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
 at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
 at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:271)
 at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
 at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:154)
 at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
 at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266)
 at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
 at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at br.com.simova.bob.system.interceptor.ApplicationSecurityInterceptor.intercept(ApplicationSecurityInterceptor.java:39)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
 at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
 at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1338)
 at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
 at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:499)
 at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
 at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
 at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
 at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
 at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
 at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
 at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
 at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
 at org.eclipse.jetty.server.Server.handle(Server.java:350)
 at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
 at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
 at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
 at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
 at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
 at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
 at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620)
 at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
 at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
 at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
 at java.lang.Thread.run(Unknown Source)

Powered by Jetty://



Estava eu, vendo no site do Jetty a última atualização do Jetty-8. Resolvi então colocá-lo no ar, quando de repente o erro acima me veio à tona... Pesquisando sobre o erro, descobri que esse erro acontece por que para compilar  arquivos jsp em classes Java, você precisa de um compilador. Você pode adquirir um compilador Java da JVM se você estiver usando um JDK completo, ou a partir de um Jar de terceiros.
Em versões anteriores a 7.5.0, a infra-estrutura JSP fez uso do Java Eclipse Compiler (ecj.jar), que é fornecido em $ JETTY_HOME / lib / jsp.  Para o Jetty-7.5.0, foi atualizado a versão do JSP para jsp-impl-2.1.3.b10 (do Glassfish). Em versões acima, a infra-estrutura JSP SEMPRE tenta adquirir um compilador Java da JVM se a versão do Java é de 1,6 ou acima. Portanto, se você estiver usando um JRE, JSPs não são capazes de compilar e por  isso você deve usar um JDK completo. Alternativamente, você pode pré-compilar JSPs (que é preferível em uma implantação de produção em qualquer caso). 

Se usar o Jetty-7.5.5 ou acima (incluindo versões Jetty-8.x), você pode usar um JDK completo ou um JRE em combinação com um terceiro compilador Java (como ecj que é distribuído em $ JETTY_HOME / lib / jsp ). Para usar o compilador ecj, você precisa definir um SystemProperty. Você pode fazer isso em seu código ou em um arquivo de configuração. 

Coloque este trecho em  seu wrapper.conf:

# Java Additional Parameters
wrapper.java.additional.1=-Dorg.apache.jasper.compiler.disablejsr199=true

Pronto, com isso, seu Jetty irá subir sem problemas!
Espero ter ajudado e até mais!
Daniel Hideki.

sexta-feira, 15 de junho de 2012

Erro no Jetty de "Form too large"

Salve galera!
Hoje deparei com um erro em minha aplicação que ao rodar, dava o erro abaixo:


HTTP ERROR: 500
Form too large339783>200000
Caused by:


java.lang.IllegalStateException: Form too large339783>200000
 at org.eclipse.jetty.server.Request.extractParameters(Request.java:1476)
 at org.eclipse.jetty.server.Request.getParameterMap(Request.java:785)
 at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:177)
 at org.apache.struts2.dispatcher.mapper.DefaultActionMapper.handleSpecialParameters(DefaultActionMapper.java:351)
 at org.apache.struts2.dispatcher.mapper.DefaultActionMapper.getMapping(DefaultActionMapper.java:311)
 at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:370)
 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139)

Esse erro acontece porque o Jetty vem configurado para que o form tenha o tamanho de até 200000. E quando ultrapassa esse valor, estoura o erro de HTTP 500.
E pra variar, fiquei horas tentando descobrir o que fazer....
Mas, depois de muitas e muitas tentativas, consegui tirar a limitação do form. Mas chega de blablabla e
vamos ao que interessa.
Vá até o diretório em que você instalou o seu Jetty
Abra o arquivo Jetty.xml que se encontra dentro da pasta 'etc'.
Insira o código abaixo:


    <!-- ======================================================================= -->
    <!--             Set max form context size default is 200000 and -1 is undefined size                                --> 
    <!-- ======================================================================= -->
<Call class="java.lang.System" name="setProperty"> 
  <Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>  
  <Arg>-1</Arg>  
</Call>

Eu tirei a limitação setando no Arg -1, mas se você preferir que seu form tenha um tamanho específico (alguns dizem que não é seguro deixar um valor indefinido) , é só setar o valor que você quiser dentro do Arg.
Pronto! Só reiniciar o seu Jetty e ele vai rodar legal.
Espero que tenha ajudado e até a próxima!
Um grande abraço;
Daniel Hideki...



segunda-feira, 4 de junho de 2012

Erro de Utf8Appendable$NotUtf8Exception: !UTF-8

Salve galera!
Depois de muitas noites sem dormir, achamos uma solução pra esse problema chato de UTF-8.
Aqui na empresa, migramos do servidor Tomcat para o Jetty, inclusive escrevi aqui de como instalá-lo como serviço de Windows.
Bom, ao migrarmos para o Jetty, tivemos alguns probleminhas, e um deles foi esse erro:

HTTP ERROR 500 

Problem accessing /ProdutoBoB/Equipamento/salvar.action. Reason: 

!UTF-8 
Caused by: 

org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: !UTF-8 
at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:73) 
at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:23) 
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:470) 
at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:521) 
at org.eclipse.jetty.server.Request.extractParameters(Request.java:259) 
at org.eclipse.jetty.server.Request.getParameter(Request.java:662) 
at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:11
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1326) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:940) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:874) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110) 
at org.eclipse.jetty.server.Server.handle(Server.java:349) 
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) 
at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:921) 
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:784) 
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:223) 
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:59
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533) 
at java.lang.Thread.run(Unknown Source) 
Powered by Jetty:// 


Esse é um problema que ocorre por que em meu form, foi inserido em um campo algum caracter do tipo ISO-8859-1 e o Jetty é por default configurado em UTF-8. Tentei mudar essa configuração de várias maneiras, mas todas sem sucesso. Esse erro persistiu bastante, e posso dizer que durante um bom tempo fiquei horrorizado com ele....
Mas, como também somos persistentes, achamos como arrumá-lo e ser feliz!


A nossa primeira tentativa, foi o meu grande companheiro de trabalho Ricardo Yudi (PROGRAMADOR ARRETADO!!!) que descobriu um jeito de arrumar esse erro. Ele descobriu que havia um bug no IE (Internet Explorer) e que com o procedimento abaixo resolve os nossos problemas. Como fazer isso?
Simples, é só seguir a descrição abaixo:


Setar o atributo do formulário com accept-charset="'UTF-8,ISO-8859-1" 

Criar os campos : 

<input type="hidden" value="&#153;" name="bugIE"


E com isso, uma boa parte de nossos problemas resolveram. 
Infelizmente, como eu disse, uma parte apenas se resolveu....
O tão temido erro Utf8Appendable apareceu novamente para azucrinar os meus neurônios....
E depois de estudar e pesquisar muito, (Santo Google!!!) , achei mais alguns ajustes para que ficasse tudo em perfeita harmonia!
Para configurá-lo, siga os passos abaixo:

Bom, antes de mais nada, precisamos começar pela meta tag.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

No form, temos que setar o atributo accept-charset que meu grande companheiro Ricardo ensinou.
<s:form id="fr_principal" name="name" namespace="/NomedoSeuNameSpace" action="nomeDaAction" acceptcharset="UTF-8">    

E claro, não esquecer de colocar o input:
<input type="hidden" value="&#153;" name="bugIE">

Com essa configuração, as suas páginas podem ter caracteres especiais, e não terão mais o problema de UTF-8Appendable.
Fica aí mais uma dica para esse maravilhoso servidor.
Espero que ajude você, que estava passando pelo mesmo problema!
Um grande abraço;
Daniel Hideki...


segunda-feira, 9 de janeiro de 2012

Teclas de Atalho para a IDE Eclipse

Salve galera!

Em meu trabalho, uso a IDE Eclipse, e no dia a dia, senti uma diferença muito grande em utilizar as teclas de atalho.
Com certeza as teclas de atalho tornam a nossa vida um pouquinho mais rápido, tornando nosso dia mais produtivo. Após pesquisar em vários sites, e claro, com uma grande ajuda de meu amigo Rafael Jesus (que considero meu mestre em teclas de atalho dessa maravilhosa IDE), resolvi postar aqui algumas teclas de atalho que uso no meu dia a dia e algumas que venho anotando de sites!
São elas :

Ctrl + Shift + L 
Para acessar um PopUp 
Obtém uma lista de atalhos do Eclipse.

Alt + Shift + S + R
Getters and Setters
Use esta opção para abrir a janela do getter e setter .

Ctrl + 1 
Correção automática
Correções quando há erros de compilação, para criar novas classes, ou mesmo se digitar new NomeDaClasse(); ele cria a variável pra você e até mesmo para criar os getters e setters de uma variável.

Ctrl + 3
Busca automática

Busca um comando ou uma opção de menu baseado no que você escreve.

Ctrl + Shift + T
Encontrar Tipo Java
Descobre onde estão as classes em um workspace mesmo que esteja dentro de um jar.

Ctrl + Shift + R
Encontrar recursos
Use esta opção para procurar arquivos XML, arquivos de texto ou arquivos de qualquer outro tipo que estão em sua área de trabalho.


Ctrl + E
Editor de abrir Suspensa
Apresenta uma janela pop-up e lista os arquivos abertos no momento. Comece a digitar para limitar a lista ou simplesmente usar a seta para baixo.

Ctrl + O
Esboço rápido
Use-o para encontrar um método ou uma variável de membro em uma classe. Comece a digitar para limitar as escolhas. Pressione Ctrl + O uma segunda vez para incluir métodos herdados.

Ctrl + Espaço
Content Assist
Auto-Complete: Completa conteúdo enquanto a edição de código Java.

Ctrl + Shift + Space
Informações de contexto
Se digitar uma chamada de método com vários parâmetros, use isto para mostrar os tipos de parâmetro aplicável. O parâmetro atual onde está o cursor será exibido em negrito.

Ctrl + Shift + O
Organize seus Imports
Após digitar uma classe, usar esse atalho para inserir uma declaração de importação. Isso funciona se várias classes não foram importados também.

F3
Declaração aberta
Desce para a declaração do tipo, método ou a variável de cursor está ligado. Isso funciona bem como um hyperlink browser.

F4
Hierarquia de tipos abertos
Mostrar a hierarquia de tipos (árvore para baixo) ou a hierarquia super tipo (árvore para cima).


Alt + Esquerda
Histórico para trás
Isso funciona como um botão Voltar do navegador.



Alt + Direita
Histórico para a frente
Isso funciona como um botão Avançar do navegador.

Ctrl + L
Ir para a Linha
Ir para um número de linha específica.

Ctrl + Alt + H
Abra Hierarquia de chamada
Mostrar onde um método é chamado. Mostra todas as ocorrência de um atributo ou método dentro de uma classe.

Ctrl + H
Diálogo Open Search
Abre uma janela de busca com opções de pesquisa extensa para os pacotes Java, tipos, métodos e campos.

Alt + Shift + R
Rename – Refactoring
Usar isso para renomear tipo, método ou campo. Todas as referências existentes será reformulado também.

Alt + Shift + L
Extract Local Variable
Use isso para criar uma variável local a partir da expressão selecionada. Isso é útil para dividir as expressões maiores para evitar longas filas.

Alt + Shift + M
Extract Method
Utilize esta opção para extrair um novo método a partir do código existente. A lista de parâmetros e tipo de retorno será criado automaticamente.

Alt + Shift + Up 
Selecione Enclosing Elemento 
Útil para a seleção sensível ao contexto blocos (por exemplo, em torno loop, método de classe, etc) 

Alt + Shift + Down
 
Restore última seleção 
Útil para a seleção sensível ao contexto blocos (por exemplo, em torno loop, método de classe, etc) 

Alt + Shift + Esquerda
 
Select elemento anterior 
Útil para a seleção sensível ao contexto blocos (por exemplo, em torno loop, método de classe, etc) 

Alt + Shift + Direita
Selecionar o próximo elemento
Útil para a seleção sensível ao contexto blocos (por exemplo, em torno loop, método de classe, etc)

Ctrl + Up
Linha de rolagem para cima da linha de deslocamento de classe
Muito útil se você deseja mudar de classe, sem alterar sua posição ou cursor usando o mouse.
 
Ctrl + Down
Linha de rolagem para baixo da linha de deslocamento de classe
Muito útil se você deseja  mudar de classe , sem alterar sua posição ou cursor usando o mouse.

Ctrl + Shift + U 
Ocorrências show em File 
Use para pesquisar dentro do mesmo arquivo – útil para ocorrências de campos privados e métodos.

Alt + Shift + U
Remover Anotações Ocorrências
Use para pesquisar dentro do mesmo arquivo – útil para ocorrências de campos privados e métodos.


Ctrl + Shift + P
Ir para Bracket Matching
Ajuda para encontrar o colchete de fechamento das declarações.

Ctrl + J 
Incremental Find 
A ocorrência de correspondência primeiro é mostrado com cada letra digitada. Pressione novamente e a ocorrência de correspondência seguinte é mostrado.

Ctrl + Shift + J
Reverse Incremental Find
A ocorrência de correspondência primeiro é mostrado com cada letra digitada. Pressione novamente ea ocorrência de correspondência seguinte é mostrado.

Shift + Enter 
Inserir Linha Abaixo  
Inserir uma linha abaixo da linha atual. 

Ctrl + Shift + Enter
Inserir Linha Acima
Inserir uma linha acima da linha atual.

Ctrl +Shift + / 
Adicionar bloco de comentários 
Comentar um grande bloco de código com /* */.

Ctrl + 
Shift + \
Remove comentário de bloco
Descomentar um grande bloco de código com /* */.

Ctrl + Shift + C , Ctrl + /   ou   Ctrl + \
Adicionar comentários 
Comenta ou descomenta o código com /.

Alt +Shift + J
Adicionar  comentários Javadoc
Adiciona um comentário Javadoc no código.

Ctrl + M
Maximize Ver Ativo ou editor
Maximizar a visão atual do editor ou à custa de todos os outros pontos de vista mostrados atualmente. Pressione novamente para restaurar a visão normal.

Ctrl + F6 
Arquivos 
Navegar entre os arquivos abertos. 

Ctrl + F7
 
Abas
Navegar entre as abas da perspectiva.

Ctrl + F8
Perspectiva
Navegar pelas perspectivas abertas.

Ctrl + Alt + Up 
Duplicate Lines
Não parece em um primeiro momento, mas é um grande atalho uma vez que você aprender a usá-lo. Em vez de selecionar, copiar ou colar, basta selecionar e duplicar sem afetar a área de transferência.

Ctrl + Alt + Down
Linhas Copiar
Não parece em um primeiro momento, mas é um grande atalho uma vez que você aprender a usá-lo. Em vez de selecionar, copiar ou colar basta selecionar e duplicar sem afetar a área de transferência.


Alt + /
Conclusão da palavra
Isto é excelente para edição de código ou escrever arquivos de ajuda simples com variáveis ​​e outras palavras que não tenham equivalentes no idioma Inglês. A conclusão da palavra é baseado no conjunto de palavras que já estão presentes no arquivo atual.

Ctrl + I
Indentação correta
Selecionar um bloco de código Java ou um arquivo de classe inteira e use esse atalho para corrigir o seu recuo.

Ctrl + Shift + F
Formatação correta
Selecionar um bloco de código Java ou um arquivo de classe inteira e use esse atalho para formatar o seu código.

Ctrl + Shift + W
Close tabs
Fecha todas as abas.

Ctrl + F11
Run
Roda a aplicação.

Ctrl + Shift + B
Breakpoint
Inserir ou excluir breakpoint na linha onde está o cursor.

Ctrl + 2 + L 
Para criar uma variável local 
Esse atalho é muito útil quando criamos métodos em JPA e que não temos muita certeza de qual é o tipo de variável que será retornada.

Ctrl + 2 + F
Para criar uma variável global 
A mesma funcionalidade acima, mas para criar uma variável global.

Espero que essas teclas de atalho ajudem no seu dia a dia!
Um grande abraço e até o próximo post!!!!

Daniel...

Referencias