Index: branches/2.2.0.1/security/ExpressoCertLogin/src/LoginApplet.java
===================================================================
--- branches/2.2.0.1/security/ExpressoCertLogin/src/LoginApplet.java	(revision 3633)
+++ branches/2.2.0.1/security/ExpressoCertLogin/src/LoginApplet.java	(revision 4123)
@@ -43,4 +43,96 @@
         this.setup.addLanguageResource("ExpressoCertLoginMessages");
     }
+    
+    private boolean parseVercert(String[] answer){
+        boolean tryAgain = false;
+        // Faz o login
+        if (setup.getParameter("debug").equalsIgnoreCase("true") && answer != null) {
+            System.out.println("Código de retorno: " + answer[0].trim());
+        }
+
+        if (answer == null){ // Ação cancelada
+            tryAgain = false;
+            String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost()
+                    + ":" + this.getCodeBase().getPort() + "/login.php";
+            try {
+                this.getAppletContext().showDocument(new URL(redirect));
+            } catch (MalformedURLException e) {
+                // TODO Bloco catch gerado automaticamente
+                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        else if (Integer.parseInt(answer[0].trim()) == 0) {
+
+            tryAgain = false;
+            // Pega usuário e senha de credentials[1] e credentials[2], respectivamente
+            // adiciona na página e faz o submit.
+            JSObject document = (JSObject) JSObject.getWindow(this).getMember("document");
+            JSObject loginForm = (JSObject) document.getMember("flogin");
+            JSObject loginField = (JSObject) loginForm.getMember("user");
+            loginField.setMember("value", answer[1].trim());
+
+            JSObject passwdField = (JSObject) loginForm.getMember("passwd");
+            passwdField.setMember("value", answer[2].trim());
+
+            loginForm.call("submit", null);
+            Thread.yield();
+
+        } else if (Integer.parseInt(answer[0].trim()) == 6) {
+
+            tryAgain = false;
+
+            if (setup.getParameter("debug").equalsIgnoreCase("true")) {
+                System.out.println("Mensagem de retorno: " + answer[1].trim());
+            }
+
+            DialogBuilder.showMessageDialog((Frame) SwingUtilities.getAncestorOfClass(Frame.class, this), answer[1].trim(), this.setup);
+
+            String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost()
+                    + ":" + this.getCodeBase().getPort() + "/login.php?cd=98&ts=202";
+            try {
+                this.getAppletContext().showDocument(new URL(redirect));
+            } catch (MalformedURLException e) {
+                // TODO Bloco catch gerado automaticamente
+                if (this.setup.getParameter("debug").equalsIgnoreCase("true")) {
+                    e.printStackTrace();
+                }
+            }
+        } else {
+            tryAgain = true;
+            dc.destroy();
+            System.gc();
+
+            if (setup.getParameter("debug").equalsIgnoreCase("true")) {
+                System.out.println("Mensagem de retorno: " + answer[1].trim());
+            }
+
+            // Mostra mensagem de erro para o usuário
+            DialogBuilder.showMessageDialog((Frame) SwingUtilities.getAncestorOfClass(Frame.class, this), answer[1].trim(), this.setup);
+            Thread.yield();
+        }
+
+        return tryAgain;
+    }
+
+    private boolean parseHandleCertificateResponse(String certificate){
+        
+        // Envia certificado
+        
+        JSObject document = (JSObject) JSObject.getWindow(this).getMember("document");
+        JSObject certificateForm = (JSObject) document.getMember("certificateForm");
+        JSObject certificateField = (JSObject) certificateForm.getMember("certificado");
+        certificateField.setMember("value", certificate);
+
+        // submit e cai fora
+        certificateForm.call("submit", null);
+       
+        dc.destroy();
+        System.gc();
+        Thread.yield();
+
+        return false;
+    }
 
     /* (non-Javadoc)
@@ -57,89 +149,45 @@
 
             // Cria uma instância de DigitalCertificate e a inicializa
+            // Aqui pega document base e verifica em que aplicação estamos.
+
             this.dc = new DigitalCertificate(this.getDocumentBase(), setup);
             useCertificate = dc.init();
-            String[] returnCode = null;
 
             try {
+
+                String redirect = "";
+
+                // Testa em qual aplicação estamos.
+                URL documentURL = this.getDocumentBase();
+
+                if (documentURL.getPath().matches(".*login.php$")){
+                    redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost()
+                        + ":" + this.getCodeBase().getPort() + "/login.php";
+                }
+                else {
+                    redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost()
+                        + ":" + this.getCodeBase().getPort() + "/preferences/index.php";
+                }
+
                 switch (useCertificate) {
                     case DigitalCertificate.KEYSTORE_DETECTED:
                         // Mostra PinNeedeDialog.
                         String pin = DialogBuilder.showPinDialog((Frame) SwingUtilities.getAncestorOfClass(Frame.class, this), this.setup);
+                        
                         if (pin != null) {
                             dc.openKeyStore(pin.toCharArray());
-                            returnCode = dc.getCredentials(pin);
-
-                            // Faz o login
-                            if (setup.getParameter("debug").equalsIgnoreCase("true")) {
-                                System.out.println("Código de retorno: " + returnCode[0].trim());
+                            if (documentURL.getPath().matches(".*login.php$")){
+                                tryAgain = parseVercert(dc.getCredentials(pin, new URL(this.getCodeBase().getProtocol()+"://" +
+                                    this.getCodeBase().getHost() + ":" + this.getCodeBase().getPort() +
+                                    "/security/vercert.php")));
                             }
-
-                            if (returnCode == null){ // Ação cancelada
-                                tryAgain = false;
-                                String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost() + "/login.php";
-                                try {
-                                    this.getAppletContext().showDocument(new URL(redirect));
-                                } catch (MalformedURLException e) {
-                                    // TODO Bloco catch gerado automaticamente
-                                    if (setup.getParameter("debug").equalsIgnoreCase("true")) {
-                                        e.printStackTrace();
-                                    }
-                                }
+                            else {
+                                tryAgain = parseHandleCertificateResponse(dc.getPEMCertificate());
                             }
-                            else if (Integer.parseInt(returnCode[0].trim()) == 0) {
-
-                                tryAgain = false;
-                                // Pega usuário e senha de credentials[1] e credentials[2], respectivamente
-                                // adiciona na página e faz o submit.
-                                JSObject document = (JSObject) JSObject.getWindow(this).getMember("document");
-                                JSObject loginForm = (JSObject) document.getMember("flogin");
-                                JSObject loginField = (JSObject) loginForm.getMember("user");
-                                loginField.setMember("value", returnCode[1].trim());
-
-                                JSObject passwdField = (JSObject) loginForm.getMember("passwd");
-                                passwdField.setMember("value", returnCode[2].trim());
-
-                                loginForm.call("submit", null);
-                                Thread.yield();
-
-                            } else if (Integer.parseInt(returnCode[0].trim()) == 6) {
-
-                                tryAgain = false;
-
-                                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
-                                    System.out.println("Mensagem de retorno: " + returnCode[1].trim());
-                                }
-
-                                DialogBuilder.showMessageDialog((Frame) SwingUtilities.getAncestorOfClass(Frame.class, this), returnCode[1].trim(), this.setup);
-
-
-
-                                String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost() + "/login.php?cd=98&ts=202";
-                                try {
-                                    this.getAppletContext().showDocument(new URL(redirect));
-                                } catch (MalformedURLException e) {
-                                    // TODO Bloco catch gerado automaticamente
-                                    if (this.setup.getParameter("debug").equalsIgnoreCase("true")) {
-                                        e.printStackTrace();
-                                    }
-                                }
-                            } else {
-                                tryAgain = true;
-                                dc.destroy();
-                                System.gc();
-
-                                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
-                                    System.out.println("Mensagem de retorno: " + returnCode[1].trim());
-                                }
-
-                                // Mostra mensagem de erro para o usuário
-                                DialogBuilder.showMessageDialog((Frame) SwingUtilities.getAncestorOfClass(Frame.class, this), returnCode[1].trim(), this.setup);
-                                Thread.yield();
-                            }
 
                         } else {
 
+                            // TODO: Notifica usuário
                             tryAgain = false;
-                            String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost() + "/login.php";
                             try {
                                 this.getAppletContext().showDocument(new URL(redirect));
@@ -155,5 +203,5 @@
                     default:
 
-                        // Mostra Diálogo dizendo que token não foi encontrado
+                        // TODO: notifica usuário que token não foi encontrado
                         // ou repositório de chaves públicas não foi configurado.
                         // Tentar carregar token/keystore novamente? / Logon sem certificado digital?
@@ -167,5 +215,4 @@
                         System.gc();
 
-                        String redirect = this.getCodeBase().getProtocol() + "://" + this.getCodeBase().getHost() + "/login.php";
                         try {
                             this.getAppletContext().showDocument(new URL(redirect));
Index: branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java
===================================================================
--- branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java	(revision 3633)
+++ branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java	(revision 4123)
@@ -58,4 +58,5 @@
 import java.io.OutputStreamWriter;
 import java.security.AlgorithmParameters;
+import java.security.cert.CertificateEncodingException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -89,5 +90,5 @@
     private FileInputStream pkcs12Input; // stream da KeyStore pkcs12. Pode ser nulo.
     private String providerName; // Nome do SecurityProvider pkcs11 carregado. Pode ser nulo.
-    private String hostAddress; // Endereço do host, onde a página principal do
+    private URL pageAddress; // Endereço do host, onde a página principal do
     private static final String HOME_SUBDIR; // Subdiretório dentro do diretório home do usuário. Dependente de SO.
     private static final String EPASS_2000; // Caminho da biblioteca do token ePass2000. Dependente de SO.
@@ -164,5 +165,5 @@
      */
     public DigitalCertificate() {
-	this.hostAddress = null;
+	this.pageAddress = null;
 	this.parentFrame = null;
     }
@@ -173,10 +174,10 @@
      */
     private DigitalCertificate(URL pageAddress) {
-	this.hostAddress = pageAddress.getHost();
+	this.pageAddress = pageAddress;
 	this.parentFrame = null;
     }
 
     private DigitalCertificate(Frame parent) {
-	this.hostAddress = null;
+	this.pageAddress = null;
 	this.parentFrame = parent;
     }
@@ -236,5 +237,4 @@
         this.selectedCertificateAlias = null;
 	this.keyStore = null;
-	this.hostAddress = null;
 	this.pkcs12Input = null;
 	this.providerName = null;
@@ -647,4 +647,5 @@
      * Pega as credenciais de login do dono do certificado do serviço de verificação de certificados
      * @param	pin			pin para acessar o token
+     * @param   where                   URL que será acessada para recuperar as credenciais
      * @return	resposta	Array de Strings em que:
      * 						Indice 0: código de retorno;
@@ -656,5 +657,6 @@
      * @throws GeneralSecurityException
      */
-    public String[] getCredentials(String pin) throws SSLHandshakeException, HttpException, IOException, GeneralSecurityException {
+
+    public String[] getCredentials(String pin, URL where) throws SSLHandshakeException, HttpException, IOException, GeneralSecurityException {
 
 	String[] resposta = null;
@@ -679,6 +681,7 @@
 		    Integer.parseInt(System.getProperty("http.proxyPort")));
 	}
-	PostMethod httppost = new PostMethod("https://" + hostAddress + "/security/vercert.php");
-
+
+        PostMethod httppost = new PostMethod(where.toExternalForm());
+	
 	try {
 	    // Adiciona parâmetro certificado no método post, executa o método, pega a resposta do servidor
@@ -800,4 +803,13 @@
 
     /**
+     * Get a PEM encoded instance of the user certificate
+     * @return PEM encoded Certificate
+     * @throws CertificateEncodingException
+     */
+    public String getPEMCertificate() throws CertificateEncodingException {
+	return Base64Utils.der2pem(this.cert.getEncoded());
+    }
+
+    /**
      * @param cert the cert to set
      */
