Phishing do Orkut

March 30th, 2009 by rafaelliu 1 comment »

Acabei de receber um scrap de uma amiga com com o seguinte conteúdo:

add esse aki
http://www.orkut.com.br/Main#Profile.aspx?uid=81020294310883490

A autora era minha amiga mesmo, o host do email era realmente do orkut, o scrap realmente estava no meu scrapbook. Quando cliquei no link, abriu a tela de login do Orkut. Digitei usuário e senha, dei Enter e ai caiu numa página de erro. Foi só ai olhei o endereço, que estava:

http://0rkvlservicelogins.freehostia.com/Main-Community-aspx-cmm-8348041.html

Droga! Phishing! Entrei logo a conta do Google e mudei minha senha. Já entrei em contato com a freehostia que está hospedando esse site, espero que eles venham a bloquear o banco de dados dele antes que ele venha a resgatar as senhas.

Pensando em como isso poderia ter vindo a ocorrer só me veio uma coisa à cabeça: os Applications. Vendo no profile da minha amiga vi uma aplicação estranha:

Chat Alegria - Salas de Bate Papo

Isso me fez pensar algumas coisas em relação a segurança:

  1. Sobre a Web 2.0. Quando abrimos espaço para usuários criarem conteúdo nos portais estamos abrindo uma grande brecha na segurança: emprestamos o nome do portal junto com toda sua credibilidade para qualquer usuário usar. Esse caso específico (em que o usuário pôs um link com o conteúdo diferente de seu href para direcionar o atacado a outro domínio) foi endereçado pela Wiki pondo-se um simples simbolozinho do lado de links apontando para domínios externos. Isso é uma forma da Wiki lavar as mãos e consequentemente fazer o usuário ficar mais medroso (leia-se atento).
  2. Sistemas de SSO. Uso a conta do Google para várias coisas: blog, feed reader, calendário, documentos e email e tenho muita coisa importante, se de algum lado minha senha vazar pode ir tudo pro espaço. Um sistema de SSO deveria ter mecanismos de contenção de danos. Talvez identificação de padrões de uso, identificação de ações típicas de ataques ou simplesmente (e o Google não faz!!) verificar se a conta do usuário já possui sessão aberta, e possisvelmente combinações desses mecanismos.
  3. Padronização. Os applications do Orkut são construidos com a API OpenSocial que é uma tentativa da Google de criar uma interface comum para desenvolvimento de aplicações para redes sociais. Padronizações são importantes acontecem em todas as áreas de TI, mas geram também esse outro lado. A partir do momento que um padrão se difunde, uma aplicação que venha a ser construida com fins maléficos tem seu impacto maximizado através de todos os aderentes ao padrão.



Cuidado a todos!

EDIT:

O freehostia já me respondeu:

Hello,

We have suspended the reported account immediately. Thank you for the assistance.

Best Regards,
Miles
support@freehostia.com
http://www.freehostia.com

Wow! Que rápido!!

REST com RESTEasy – JAXB e RESTEasy Client

February 5th, 2009 by rafaelliu 3 comments »

Uma ótima apresentação sobre REST me fez querer escrever um pouco sobre. Mais especificamente sobre o RESTEasy, implemetação certificada JAX-RS da JBoss. No projeto que fiz para certificação JBoss Certified SOA Developer o usei bastante e quero falar de algumas interessantes funcionalidades dele. Primeiro algumas considerações sobre REST:

  1. RESTEasy é um framework para criação de RESTful Web Services, o que em algum senso já é uma desvirtuação de REST (tal como Roy Fielding definiu), que trata de recursos. O que tem haver um serviço RESTful que loga o usuário? (O que aliás abre uma sedutora brecha para quebrar outro conceito REST: o de statelessness) De agora em diante irei usar REST e RESTful Web Services indistintamente.
  2. REST não é uma alternativa a SOA! Na verdade podemos usar REST para implementar SOA com WOA. Confuso? REST é uma alternativa ao WS-*, podendo ser usado no lugar dele para implementar SOA. A implementação RESTful de SOA é chamada WOA, ou ROA (veja a página de TLAs), que é um subconjunto de SOA.

JAXB binding

RESTEasy possui suporte a marshalling/unmarshalling de classes usando JAXB. Sou péssimo para dar exemplos mas vamos lá…:

@Path("/")
public class Servico {
 
	@GET @Path("/tempo")
	@Produces("text/xml")
	public Tempo getTempo() {
		return new Tempo("Parcialmente nublado", 20.3);
	}
 
	@POST @Path("/literal")
	@Consumes("text/xml")
	public void setTempo(Tempo tempo) {
		System.out.format("Descrição: %s%n", tempo.getDescricao());
		System.out.format("Temperatura: %d%n", tempo.getTemperatura());
	}
}
 
// classe anotada com JAXB
@XmlRootElement
class Tempo {
	private String descricao;
	private Double temperatura;
 
	public Tempo() {}
 
	public Tempo(String nome, Double preco) {
		this.descricao = nome;
		this.temperatura = preco;
	}
 
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String nome) {
		this.descricao = nome;
	}
	public Double getTemperatura() {
		return temperatura;
	}
	public void setTemperatura(Double preco) {
		this.temperatura = preco;
	}
 
}

Na invocação de getTempo() RESTEasy vai ver que o tipo de retorno é o objeto Tempo e que ele está anotado com @XmlRootElement e vai fazer um marshalling dele. A anotação @Produces(“text/xml”) diz que a representação gerada deve ser XML. Quer que seja em JSON? Basta mudar para @Produces(“application/json”)!

Do mesmo jeito funciona o setTempo(). O parâmetro passados sem nenhuma anotação é interpretado como o corpo da requisição HTTP, que no caso é um objeto.

RESTEasy Client

Algo muito interessante que não é da especificação JAX-RS é o suporte a clients. Esses clients são proxies que transformam invocações Java em requisições HTTP. Para isso devemos criar uma interface com as mesmas assinaturas do nosso serviço e anotá-las:

public class Main {
	static {
		// precisa ser chamo uma única vez para registrar providers RESTEasy, scanear classes, etc
		 RegisterBuiltin.register(ResteasyProviderFactory.getInstance()); // precisa ser chamado uma única vez para
	}
 
	public static void main(String args[]) {
 		 IServico client = ProxyFactory.create(IServico.class, "http://localhost:8080/<Context>");
 
		 Tempo tempo = client.getTempo();
		 tempo.setTemperatura(tempo.getTemperatura() + 5.0);
		 client.setTempo(tempo);
	}
}
 
interface IServico {
 
	@GET @Path("/tempo")
	@Produces("text/xml")
	public abstract Tempo getTempo();
 
	@POST @Path("/literal")
	@Consumes("text/xml")
	public abstract void setTempo(Tempo tempo);
}
 
// classe anotada com JAXB
@XmlRootElement
class Tempo {
	private String descricao;
	private Double temperatura;
 
	public Tempo() {}
 
	public Tempo(String nome, Double preco) {
		this.descricao = nome;
		this.temperatura = preco;
	}
 
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String nome) {
		this.descricao = nome;
	}
	public Double getTemperatura() {
		return temperatura;
	}
	public void setTemperatura(Double preco) {
		this.temperatura = preco;
	}
 
}

Agora você deve ver no console:

Descrição: Parcialmente nublado
Temperatura: 34.000000

Precisamos a classe Tempo também apenas porque estamos usando JAXB. Tudo transparente, muito fácil agora fazer teste unitários de serviços RESTful!

Lançamento do JBossBrasil.ORG

January 19th, 2009 by rafaelliu No comments »

Para quem nunca reparou, na minha sessão de links tem um badge do JBossBrasil. Já sou membro há um tempo e a comunidade já tem mais de 400 usuários mas o lançamento oficial será feito só agora, dia 21 de janeiro, em São Paulo. Para acompanhar o evento online o João Paulo detalhou no seu blog o que fazer.

Usa algum produto JBoss? Quer saber de eventos ou participar dos fóruns? Dê uma conferida: http://www.jbossbrasil.org.

Two components with the same name and precedence

January 8th, 2009 by rafaelliu No comments »

Há um tempo atrás me pediram ajuda com a seguinte exceção:

java.lang.IllegalStateException: Two components with the same name and precedence - component name: authenticator, component classes: com.app.security.Authenticator, com.app.security.Authenticator
at org.jboss.seam.init.Initialization.addComponentDescriptor(Initialization.java:596)
at org.jboss.seam.init.Initialization.installScannedComponentAndRoles(Initialization.java:949)
at org.jboss.seam.init.Initialization.scanForComponents(Initialization.java:889)
at org.jboss.seam.init.Initialization.init(Initialization.java:701)
at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:35)

Essa exceção pode ocorrer, claro, quando existirem duas classes com o mesmo @Name, ou pode ocorrer num caso mais sutil. O Seam possui um modo de debug em que ele faz hot deploy de páginas Facelets e pages.xml’s. Projetos criados pelo seam-gen já vêm com esse modo habilitado:

<core:init debug="true"/>

Nesse modo o Seam usa um classloader próprio ao invés do classloader do container para carregar as classes. Ele faz isso criando um pasta WEB-INF/dev de onde carrega as classes. Isso não vale para EJB3 (então sem hot deploy de entity beans..) e as classes não serão visíveis para o container ou para outros projetos Seam (já que o Seam usa uma instância própria de classloader).

O problema é que de algum jeito o Seam (na verdade deve ser o JBoss Tools) se confunde em algumas situações e tenta fazer um novo deploy do componente, ao invés de fazer um redeploy. Com isso há um conflito de @Name. Não consegui identificar em que casos exatamente isso ocorre. Fazer um Clean, Build, etc não adianta porque a pasta dev não é mexida.

Bom, para resumir, basta apagar a pasta WEB-INF/dev ;)

Novidades

December 13th, 2008 by rafaelliu 1 comment »

Como devem ter percebido, mudei o para um novo layout, mudei também para um host free PHP, o 000webhost. Sobre o host, gostei muito, várias opções, limites altos, ótimo suporte. O único problema é que ele reinicia os bancos MySQL de hora em hora (cheiro de gambi??) retornando um erro de conexão PHP. Demora apenas alguns segundos, então uns refreshes no browser dão conta.

Agora posso mudar temas livremente, instalar plugins, usar meu domínio não só como um redirecionador. Estou também usando o FeedBurner, então vai ser necessário atualizar seus feed readers.

Os mais atentos ainda perceberam o novo bonequinho do lado direito. Cortei o cabelo =)

VIII Semana de Extensão

September 10th, 2008 by rafaelliu No comments »

Saiu! Da divulgação oficial:

1 DE OUTUBRO

17h às 18h – Palestra
INTRODUÇÃO AO SELINUX
Área Temática: Tecnologia e Produção
Objetivo: Mostrar ao público uma solução de segurança Open Source. Motivar a preocupação com segurança da informação e despertar interesse em software livre.
Coordenação: Carla Maria Chagas e Cavalcante Koike
Executor: Departamento de Ciências da Computação
Local: Departamento de Ciências da Computação – sala CONF 2
Informações: 3307 2022
Público-Alvo: Universitários da área de Informática.

19h às 20h – Palestra
ENTENDENDO O SOA
Área Temática: Tecnologia e Produção
Objetivo: Dar uma visão ampla do que é SOA: o que ela vem resolver, que meios usa, a disciplina pregada e conceitos. Mostrar sua importância no mercado, como vem crescendo, os grandes players que estão apostando na idéia e as ferramentas.
Coordenação: Carla Maria Chagas e Cavalcante Koike
Executor: Departamento de Ciências da Computação
Local: Departamento de Ciências da Computação – sala CONF 2
Informações: 3307- 2022
Público-Alvo: Estudantes da UnB e público externo iniciante em TI.

Estrutura de um projeto Seam

August 30th, 2008 by rafaelliu 8 comments »

O seam-gen é um gerador de scaffolding muito útil para quem programa em Seam. O seam-gen em si é uma ferramenta CLI, mas o JBoss Tools nos dá uma GUI para facilitar nossa vida. Bom, então o primeiro passo é instalar o plugin do JBoss Tools. É só baixar do site deles e descompactar no diretório do Eclipse, nada de mais.

Você notará que serão adicionadas várias perspectivas, entre elas, a Seam. Vamos selecionar essa perspectiva e criar um novo Seam Project. Com isso já temos um projeto funcional com segurança, apresentação de erros, e conexão com banco de dados. Também é criado um projeto <projeto>-Test para testes. Vamos entender um pouco do que nos foi gerado.

  1. classe usada pelo Seam para autenticaçãoseam-gen-structure
  2. arquivo chave. Indica ao Seam que ele deve procurar nesse diretório por componentes
  3. persistence.xml do JPA
  4. arquivo com algumas propriedados a serem substituidas pelo Ant no components.xml
  5. import.sql do Hibernate
  6. mensagens para internacionalização
  7. arquivo Drools com regras de autorização
  8. datasource gerado para o JBoss
  9. arquivo de configuração do Seam (componentes, integração)
  10. arquivo de configuração WAR do JBoss
  11. arquivo de configuração do Seam (regras de fluxo, segurança, controle de conversação)
  12. similar ao arquivo pages.xml, mas específico para o login.xhtml
  13. arquivo de configuração do plugin Hibernate Console

Vamos ver por alto algumas configurações interessantes. Na parte de segurança temos no components.xml:

<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}"/>
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}"/>
</event>

O Seam possui o conceito de eventos. Eventos são mensagens que podem ser capturadas ou lançadas, no estilo broadcast. O Seam em si lança vários eventos e podemos capturar esses eventos através de XML, como no exemplo acima. O trecho acima está invocando métodos do componente built-in #{redirect} quando eventos de segurança forem lançados. Ele especifica que a view id JSF deve ser salva quando o usuário não-logado tentar acessar uma página restrita e que essa view id deve ser restaurada uma vez que ele se autentique.
Um outro trecho especifica que componente é responsável pela autenticação:

<security:identity authenticate-method="#{authenticator.authenticate}"
security-rules="#{securityRules}"
remember-me="true"/>

E no pages.xml dizemos que página deve ser utilizada para login:

<exception class="org.jboss.seam.security.NotLoggedInException">
<redirect view-id="/login.xhtml">
<message>Please log in first</message>
</redirect>
</exception>

Aqui temos um tratamento de exceção bem parecido com o de servlets que definimos no web.xml. O usuário será redirecionado para a página login.xhtml e uma mensagem JSF será adicionada.
Se olharmos no login.pages.xml vemos ainda:

<navigation from-action="#{identity.login}">
<rule if="#{identity.loggedIn}">
<redirect view-id="/home.xhtml"/>
</rule>
</navigation>

O que nos lembra bastante as navigation rules JSF. De fato parecem muito, mas as extendem em funcionalidade, podendo não só enviar o usuário para outra página como também lançar um evento, executar um método para avaliar qual será a próxima página, e algumas coisas mais avançadas.

O objetivo desse post é apenas nos familiarizar mais com o Seam e dar uma visão sobre o scaffold que nos foi gerado de base e que iremos usar para desenvolver nossa aplicação. Ainda vamos falar com mais detalhes de eventos, componentes e configurações.

Parte I: O que é Seam?

August 12th, 2008 by rafaelliu 1 comment »

Como recebo vários hints no post JBoss Seam no Tomcat, resolvi escrever mais sobre Seam. Esse post abre uma série de tutoriais de Seam.

Seam é um framework muito amplo. Pegue alguns dos frameworks mais representativos, ponha algumas práticas de desenvolvimento e misture: assim que vejo o Seam. O Seam em sua plenitude usa os frameworks: EJB3, JSF, Facelets, Hibernate, Hibernate Validations, Richfaces, Ajax4JSF, jBPM, Drools (qualquer associação ao nome JBoss é mera coincidência). É muita coisa. Mas ele não só usa esses frameworks, ele também provê uma integração entre eles, disponibiliza componentes built-in (à la Spring, cujo qual inclusive pode-se integrar) e introduz algumas melhorias sobre eles. Além disso ele apregoa algumas práticas como desenvolvimento orientado a componentes e desencoraja outras, como desenvolvimento em camadas.

Vou deixar de lado o que cada framework faz, pois não entra no mérito do que o Seam tem a oferecer. Dando um enfoque bem prático, o Seam:

  • Reduz plumbing code do JSF. Quem já programou com JSF sabe do que estou falando (Não? FacesContext? faces-config.xml?).
  • Resolve o infame problema do “back button” em JSF. E reload, e bookmarking, e …
  • Facilita o uso de JPA. Tem um código cheio de merges()? Usa uma long-running transaction num page flow?
  • Possibilita page flows usando o jBPM.
  • Permite aplicações multi-windows. E finalmente poder clicar “Abrir em nova janela” nos links!
  • Permite o uso de workspaces. Como no Linux.
  • Faz uso extensivo de anotações. Mas também permiti o uso de XML.
  • Possui uma penca de tags JSF. Uns muito úteis, uns bem exóticos…
  • E muito mais!

Dada essa introdução, vou detalhar nos próximos posts cada um desses itens dizendo como realizamos eles com o uso so Seam. Esse blog não é sobre Seam, então esperem outros posts no meio. Até mais!

referência: http://docs.jboss.com/seam/latest/reference/en-US/html/Book-Preface.html

Contribuam com o projeto Fedora Brasil!

August 4th, 2008 by rafaelliu No comments »

Foi aberta a campanha para comprarmos uma Impressora/Duplicadora de CDs/DVDS, fazendo parte do projeto de embaixadores e representando Brasília vim convocar no blog toda comunidade Fedora, e Open Source em geral, a contribuir. O Rodrigo Padula, Fedora LATAM Ambassadors Administrator, está tomando conta da campanha e o equipamento será usado para distribuição de mídias no Brasil pelo projeto Free Media.

São distribuidos prêmios dependendo da contribuição dada, inclusive para empresas, que também podem contribuir. Contribui com R$ 60,00 (e ganhei uma camiseta Fedora). Contribuam também!

JBoss Seam no Tomcat

July 28th, 2008 by rafaelliu 24 comments »

Quem está começando a aprender JBoss Seam pode ter a impressão que ele roda apenas no JBoss AS, o que não é verdade. Devido à maioria da documentação ser provida pelo pessoal do JBoss é claro que tudo é feito tendo-se em mente o AS deles. Mesmo quem sabe ser possível rodar sobre outros ASs, muitas vezes não tem idéia de como fazê-lo.

O Seam em si não é um serviço no JBoss, mas sim um framework, o que possibilita sua utilização em vários ASs. Caso não seja usada nenhuma facilidade EE (ou mesmo algumas que o Seam cobre), é possível fazer o deploy de uma aplicação Seam até mesmo sobre um simples container web como o Tomcat e esse post sobre esse caso.

Sendo o Seam uma biblioteca, dificuldades em fazer deploy em containers se limitam a conflitos e dependências. Mas quem já usou Seam sabe da grande mão na roda que é o seam-gen para geração de scaffold (inclusa no JBoss Tools). O problema é que o scaffold gerado é feito para o JBoss.

Então nossos esforços serão basicamente mudar configurações do JBoss para o Tomcat e passar para o Seam o tratamento de features enterprise. As instruções são para o seguinte ambiente:

  • Eclipse 3.3.2 com JBoss Tools 2.1.1.GA
  • JBoss Seam 2.0.3.CR1
  • Apache Tomcat 6.0.16

Vamos lá:

  1. Já que estamos rodando num container web não temos o controle transacional provido pelo AS, então devemos passá-lo para o Seam.
  2. No persistence.xml alteramos o transaction-type da persistence-unit para RESOURCE_LOCAL e removemos a property hibernate.transaction.manager_lookup_class. Vamos mudar também a linha do data source, para utilizar ENC. Ela deve refletir:

    <non-jta-data-source>java:comp/env/jdbc/meuDatasource</non-jta-data-source>

    Note que aqui perdemos a possibilidade de transações distribuídas.

  3. Vamos definir agora no components.xml que o Seam será responsável pelo controle transcional. Adicionamos a seguinte linha:
  4. <transaction:entity-transaction entity-manager="#{entityManager}"/>

    Onde #{entityManager} é o nome da managed-persistence-context, que é o persistence context que será usado pelo Seam nas conversações. A definição do namespace:

    xmlns:transaction="http://jboss.com/products/seam/transaction"
    xsi:schemaLocation="http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.0.xsd"
  5. Para finalizarmos com essa parte de persistência falta apenas criar o próprio datasource. Quem usa o Sysdeo deve ir nas propriedades do Tomcat Project fazer isso, mas quem usa o WTP (usem!) não tem essa opção. Ao invés disso podemos usar o esquema de deploy de contexto do Tomcat. Crie um arquivo context.xml em seu WEB-INF/META-INF contendo seu data source. No meu caso:
  6. <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <Resource name="jdbc/meuDatasource" type="javax.sql.DataSource" driverClassName="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:meuBD" username="sa" password="" auth="Container" maxActive="20" maxIdle="5" maxWait="10000"/>
    </Context>
  7. Por último temos que adicionar as seguintes bibliotecas que não vêm no Tomcat:
  8. persistence-api.jar
    hibernate.jar
    hibernate-entitymanager.jar
    hibernate-validator.jar
    hibernate-annotations.jar
    dom4j.jar
    jta.jar
    hibernate-commons-annotations.jar
    cglib-nodep.jar
    antlr.jar
    jboss-common-core.jar

    jsf-api.jar
    jsf-impl.jar

    commons-logging-1.1.1.jar
    commons-collections-3.2.1.jar
    javassist.jar

    A maioria delas pode ser achada na pasta lib do Seam. No meu caso criei uma User Libraries e as marquei como dependência para a Web Library, assim organizo meus jars e torno mais fácil a adição desses frameworks em projetos futuros.

Assumi que se sabe somo criar um projeto Seam. Deixei a idéia de um tutorial básico de lado, quero ainda falar do uso do JBoss Tools para geração de código e um pouco da integração com o Drools e com o jBPM (muito interessante!!).

Dêem o feedback sobre o que querem ler! Que se houver muita manifestação de interesse faço um post, até se for o caso, sobre o gorado tutorial ou o passo-a-passo para a criação de um projeto Seam.

referência: Edem Morny’s Tech Blog