Index: trunk/expressoMail1_2/inc/class.imap_functions.inc.php
===================================================================
--- trunk/expressoMail1_2/inc/class.imap_functions.inc.php	(revision 1012)
+++ trunk/expressoMail1_2/inc/class.imap_functions.inc.php	(revision 1035)
@@ -404,9 +404,18 @@
 		$body = ereg_replace("<a[^>]*href=[\'\"]mailto:([^\"\']+)[\'\"]>([^<]+)</a>","<a href=\"javascript:new_message_to('\\1')\">\\2</a>",$return_get_body['body']);
 
-		$return['body'] 		= $body;
-		$return['attachments'] 	= $return_get_body['attachments'];
-		$return['thumbs'] 		= $return_get_body['thumbs'];
-		$return['signature']	= $return_get_body['signature'];
-
+		if($return_get_body['body']=='isCripted'){
+			$exporteml = new ExportEml();
+			$return['source']=$exporteml->export_msg_data($msg_number,$msg_folder);
+			$return['body'] 		= "";
+			$return['attachments'] 	=  "";
+			$return['thumbs'] 		=  "";
+			$return['signature']	=  "";
+			//return $return;
+		}else{
+            $return['body'] 		= $body;
+            $return['attachments'] 	= $return_get_body['attachments'];
+            $return['thumbs'] 		= $return_get_body['thumbs'];
+            $return['signature']	= $return_get_body['signature'];
+        }
 		$pattern = '/^[ \t]*Disposition-Notification-To(^:)*:(.+)*@(.+)*$/isUm';
 		if (preg_match($pattern, $header_, $fields))
@@ -661,6 +670,16 @@
 		if(!$msg->structure[$msg_number]->parts) //Simple message, only 1 piece
 		{
+            if(strtolower($msg->structure[$msg_number]->subtype) == 'x-pkcs7-mime'){
+                $return['body']='isCripted';
+                return $return;
+            }
+
 			$attachment = array(); //No attachments
-			
+
+            if(strtolower($msg->structure[$msg_number]->subtype) == 'x-pkcs7-mime'){
+					$return['body']='isCripted';
+					return $return;
+			}
+
 			$content = '';
 			if (strtolower($msg->structure[$msg_number]->subtype) == "plain")
@@ -1007,7 +1026,12 @@
 
 	function get_signature($msg, $msg_number, $msg_folder)
-	{ 
+	{
+        include_once("../seguranca/classes/CertificadoB.php");
+		include_once("class.db_functions.inc.php");
 		foreach ($msg->file_type[$msg_number] as $index => $file_type)
 		{
+            $sign = array();
+			$temp = $this->get_info_head_msg($msg_number);
+			if($temp['ContentType'] =='normal') return $sign;
 			$file_type = strtolower($file_type);
 			if(strtolower($msg->encoding[$msg_number][$index]) == 'base64') 
@@ -1015,25 +1039,123 @@
 				if ($file_type == 'application/x-pkcs7-signature' || $file_type == 'application/pkcs7-signature') 
 				{
-					$export_mail = new ExportEml();
-					$params['folder'] = $msg_folder;
-					$params['msgs_to_export'] = $msg_number;
-				    $tempDir = ini_get("session.save_path");
-					$cert_file = $tempDir."/certificate_".base_convert(microtime(), 10, 36).".crt";					
-					$result = openssl_pkcs7_verify($export_mail->export_msg($params),PKCS7_NOVERIFY,$cert_file);
-					if (file_exists($cert_file))
+					if(!$this->mbox || !is_resource($this->mbox))
+					$this->mbox = $this->open_mbox($msg_folder);
+
+					$header = @imap_headerinfo($this->mbox, imap_msgno($this->mbox, $msg_number), 80, 255);
+
+					$imap_msg	 	= @imap_fetchheader($this->mbox, $msg_number, FT_UID);
+					$imap_msg		.= @imap_body($this->mbox, $msg_number, FT_UID);
+
+					$certificado = new certificadoB();
+					$validade = $certificado->verificar($imap_msg);
+
+					if ($certificado->apresentado)
 					{
-						$handle = fopen ($cert_file,"r");
-						$pemout = fread($handle,filesize($cert_file));
-						fclose($handle);
-						$cert=openssl_x509_parse($pemout);
-						$temp = "\\nSigned by: ".$cert[subject][CN];
-						$temp .= "\\nEmail Address: ".$cert[subject][emailAddress];
-						$temp .= "\\nCertificate issued by: ".$cert[issuer][CN]."\\n";
+						$from = $header->from;
+						foreach ($from as $id => $object) {
+							$fromname = $object->personal;
+						    $fromaddress = $object->mailbox . "@" . $object->host;
 					}
-				    /* Message verified */
-				    if ($result === true)
-					    $sign = $temp;
+						$sign_alert = '';
+						foreach ($certificado->erros_ssl as $item)
+						{
+							$check_error_msg = $this->functions->getLang($item);
+							/*
+							 * Desabilite o teste abaixo para mostrar todas as mensagem
+							 * de erro.
+							 */
+							//if (!strpos($check_error_msg,'*',strlen($check_error_msg-1)))
+							//{
+							$sign[] = "<span style=color:red>" . $check_error_msg . " </span>";
+							//}
+						}
+						if (count($certificado->erros_ssl) < 1)
+						{
+							$check_msg = $this->functions->getLang('Message untouched') . " ";
+							if($fromaddress == $certificado->dados['EMAIL'])
+							{
+								$check_msg .= $this->functions->getLang('and') . " ";
+								$check_msg .= $this->functions->getLang('authentic');
+							}
+							$sign[] = "<strong>".$check_msg."</strong>";
+						}
+						if($fromaddress != $certificado->dados['EMAIL'])
+						{
+							$sign[] = 	"<span style=color:red>" .
+										$this->functions->getLang('message') . " " .
+							        	$this->functions->getLang('with signer different from sender') .
+							        	" </span>";
+						}
+						$sign[] = "<strong>" . $this->functions->getLang('Message signed by: ') . "</strong>" . $certificado->dados['NOME'];
+						$sign[] = "<strong>" . $this->functions->getLang('Certificate email: ') . "</strong>" . $certificado->dados['EMAIL'];
+						$sign[] = "<strong>" . $this->functions->getLang('Mail from: ') . "</strong>" . $fromaddress;
+						$sign[] = "<strong>" . $this->functions->getLang('Certificate Authority: ') . "</strong>" . $certificado->dados['EMISSOR'];
+						$sign[] = "<strong>" . $this->functions->getLang('Validity of certificate: ') . "</strong>" . gmdate('r',openssl_to_timestamp($certificado->dados['FIM_VALIDADE']));
+						$sign[] = "<strong>" . $this->functions->getLang('Message date: ') . "</strong>" . $header->Date;
+
+					    $cert = openssl_x509_parse($certificado->cert_assinante);
+						/*
+						$sign[] = '<table>';
+						$sign[] = '<tr><td colspan=1><b>Expedido para:</b></td></tr>';
+						$sign[] = '<tr><td>Nome Comum (CN) </td><td>' . $cert[subject]['CN'] .  '</td></tr>';
+						$X = substr($certificado->dados['NASCIMENTO'] ,0,2) . '-' . substr($certificado->dados['NASCIMENTO'] ,2,2) . '-'  . substr($certificado->dados['NASCIMENTO'] ,4,4);
+						$sign[] = '<tr><td>Data de nascimento </td><td>' . $certificado->dados['NASCIMENTO'] .  '</td></tr>';
+						$sign[] = '<tr><td>CPF </td><td>' . $certificado->dados['CPF'] .  '</td></tr>';
+						$sign[] = '<tr><td>Documento identidade </td><td>' . $certificado->dados['RG'] .  '</td></tr>';
+						$sign[] = '<tr><td>Empresa (O) </td><td>' . $cert[subject]['O'] .  '</td></tr>';
+						$sign[] = '<tr><td>Unidade Organizacional (OU) </td><td>' . $cert[subject]['OU'][0] .  '</td></tr>';
+						//$sign[] = '<tr><td>Numero de serie </td><td>' . $cert['serialNumber'] .  '</td></tr>';
+						$sign[] = '<tr><td colspan=1> </td></tr>';
+						$sign[] = '<tr><td colspan=1><b>Expedido por:</b></td></tr>';
+						$sign[] = '<tr><td>Nome Comum (CN) </td><td>' . $cert[issuer]['CN'] .  '</td></tr>';
+						$sign[] = '<tr><td>Empresa (O) </td><td>' . $cert[issuer]['O'] .  '</td></tr>';
+						$sign[] = '<tr><td>Unidade Organizacional (OU) </td><td>' . $cert[issuer]['OU'][0] .  '</td></tr>';
+						$sign[] = '<tr><td colspan=1> </td></tr>';
+						$sign[] = '<tr><td colspan=1><b>Validade:</b></td></tr>';
+						$H = data_hora($cert[validFrom]);
+						$X = substr($H,6,2) . '-' . substr($H,4,2) . '-'  . substr($H,0,4);
+						$sign[] = '<tr><td>Expedido em </td><td>' . $X .  '</td></tr>';
+						$H = data_hora($cert[validTo]);
+						$X = substr($H,6,2) . '-' . substr($H,4,2) . '-'  . substr($H,0,4);
+						$sign[] = '<tr><td>Valido ate </td><td>' . $X .  '</td></tr>';
+						$sign[] = '<tr><td colspan=1> </td></tr>';
+						$sign[] = '</table>';
+						*/
+						$sign_alert .= 'Expedido para:\n';
+						$sign_alert .= 'Nome Comum (CN)  ' . $cert[subject]['CN'] .  '\n';
+						$X = substr($certificado->dados['NASCIMENTO'] ,0,2) . '-' . substr($certificado->dados['NASCIMENTO'] ,2,2) . '-'  . substr($certificado->dados['NASCIMENTO'] ,4,4);
+						$sign_alert .= 'Data de nascimento ' . $X .  '\n';
+						$sign_alert .= 'CPF ' . $certificado->dados['CPF'] .  '\n';
+						$sign_alert .= 'Documento identidade ' . $certificado->dados['RG'] .  '\n';
+						$sign_alert .= 'Empresa (O)  ' . $cert[subject]['O'] .  '\n';
+						$sign_alert .= 'Unidade Organizacional (OU) ' . $cert[subject]['OU'][0] .  '\n';
+						//$sign_alert[] = '<tr><td>Numero de serie </td><td>' . $cert['serialNumber'] .  '</td></tr>';
+						$sign_alert .= '\n';
+						$sign_alert .= 'Expedido por:\n';
+						$sign_alert .= 'Nome Comum (CN) ' . $cert[issuer]['CN'] . '\n';
+						$sign_alert .= 'Empresa (O)  ' . $cert[issuer]['O'] .  '\n';
+						$sign_alert .= 'Unidade Organizacional (OU) ' . $cert[issuer]['OU'][0] .  '\n';
+						$sign_alert .= '\n';
+						$sign_alert .= 'Validade:\n';
+						$H = data_hora($cert[validFrom]);
+						$X = substr($H,6,2) . '-' . substr($H,4,2) . '-'  . substr($H,0,4);
+						$sign_alert .= 'Expedido em ' . $X .  '\n';
+						$H = data_hora($cert[validTo]);
+						$X = substr($H,6,2) . '-' . substr($H,4,2) . '-'  . substr($H,0,4);
+						$sign_alert .= 'Valido ate ' . $X .  '\n';
+
+						$sign[] = "<a onclick=\"javascript:alert('" . $sign_alert . "')\"><b><font color=\"#0000FF\">".$this->functions->getLang("More")."...</font></b></a>";
+						$this->db = new db_functions();
+
+						// TODO: testar se existe um certificado no banco e verificar qual ï¿œ o mais atual.
+                        if(!$certificado->dados['EXPIRADO'] && !$certificado->dados['REVOGADO'] && count($certificado->erros_ssl) < 1)
+                            $this->db->insert_certificate(strtolower($certificado->dados['EMAIL']), $certificado->cert_assinante, $certificado->dados['SERIALNUMBER'], $certificado->dados['AUTHORITYKEYIDENTIFIER']);
+					}
 				     else
-					    $sign = "void";
+				    {
+				    	$sign[] = "<span style=color:red>" . $this->functions->getLang('Invalid signature') . "</span>";
+				    	foreach($certificado->erros_ssl as $item)
+				    	$sign[] = "<span style=color:red>" . $this->functions->getLang($item) . "</span>";
+                    }
 				}
 			}
@@ -1173,7 +1295,6 @@
 			* a perda em performance é insignificante.
 			*/
-			$flag = preg_match('/importance *: *(.*)\r/i',
-					@imap_fetchheader($this->mbox, imap_msgno($this->mbox, $msg_number))
-					,$importance);		
+            $tempHeader = @imap_fetchheader($this->mbox, imap_msgno($this->mbox, $msg_number));
+			$flag = preg_match('/importance *: *(.*)\r/i', $tempHeader, $importance);
 			$return[$i]['Importance'] = $flag==0?"Normal":$importance[1];
 			
@@ -1186,4 +1307,6 @@
 			
 			$return[$i]['msg_folder']	= $folder;
+            // Atribui o tipo (normal, signature ou cipher) ao campo Content-Type
+            $return[$i]['ContentType']  = $this->getMessageType($msg_number, $tempHeader);
 			$return[$i]['Recent']		= $header->Recent;
 			$return[$i]['Unseen']		= $header->Unseen;
@@ -1236,4 +1359,28 @@
 	}
 
+     /**
+     * Método que faz a verificação do Content-Type do e-mail e verifica se é um e-mail normal,
+     * assinado ou cifrado.
+     * @author Mário César Kolling <mario.kolling@serpro.gov.br>
+     * @param $headers Uma String contendo os Headers do e-mail retornados pela função imap_imap_fetchheader
+     * @param $msg_number O número da mesagem
+     * @return Retorna o tipo da mensagem (normal, signature, cipher).
+     */
+    function getMessageType($msg_number, $headers = false){
+
+            $contentType = "normal";
+            if (!$headers){
+                $headers = imap_fetchheader($this->mbox, imap_msgno($this->mbox, $msg_number));
+            }
+            //$header2 = imap_fetchheader($this->mbox, imap_msgno($this->mbox, $msg_number));
+            if (preg_match("/Content-Type:.*pkcs7-signature/i", $headers) == 1){
+                $contentType = "signature";
+            } else if (preg_match("/Content-Type:.*x-pkcs7-mime/i", $headers) == 1){
+                $contentType = "cipher";
+            }
+
+            return $contentType;
+    }
+
 	function get_folders_list($params = null)
 	{
@@ -1248,12 +1395,18 @@
 		if (is_array($folders_list)) {
   			reset($folders_list);
+            $this->ldap = new ldap_functions();
 			
 			$i = 0;
   			while (list($key, $val) = each($folders_list)) {
   				$status = imap_status($mbox_stream, $val->name, SA_UNSEEN);
-  				$result[$i]['folder_unseen'] = $status->unseen;
-			
+
   				//$tmp_folder_id = explode("}", imap_utf7_decode($val->name));
   				$tmp_folder_id = explode("}", mb_convert_encoding($val->name, "ISO_8859-1", "UTF7-IMAP" ));
+                if($tmp_folder_id[1]=='INBOX'.$this->imap_delimiter.'decifradas'){
+                    //error_log('passou', 3,'/tmp/imap_get_list.log');
+                    //imap_deletemailbox($mbox_stream,imap_utf7_encode("{".$this->imap_server."}".'INBOX/decifradas'));
+                    continue;
+                }
+                $result[$i]['folder_unseen'] = $status->unseen;
   				$folder_id = $tmp_folder_id[1];
 				$result[$i]['folder_id'] = $folder_id;
@@ -1263,5 +1416,5 @@
 				$result[$i]['folder_name'] = $result[$i]['folder_name'] == 'INBOX' ? 'Inbox' : $result[$i]['folder_name'];
 				if (is_numeric($result[$i]['folder_name']))	{
-					$this->ldap = new ldap_functions();
+					//$this->ldap = new ldap_functions();
 					if ($cn = $this->ldap->uid2cn($result[$i]['folder_name'])){
 						$result[$i]['folder_name'] = $cn;
@@ -1428,5 +1581,47 @@
 		$return_receipt = $params['input_return_receipt'];
 		$is_important = $params['input_important_message'];
-		$body = $params['body'];
+        $encrypt = $params['input_return_cripto'];
+		$signed = $params['input_return_digital'];
+
+		if($params['smime'])
+        {
+            $body = $params['smime'];
+            $mail->SMIME = true;
+            // A MSG assinada deve ser testada neste ponto.
+            // Testar o certificado e a integridade da msg....
+            include_once("../seguranca/classes/CertificadoB.php");
+            $erros_acumulados = '';
+            $certificado = new certificadoB();
+            $validade = $certificado->verificar($body);
+            if(!$validade)
+            {
+                foreach($certificado->erros_ssl as $linha_erro)
+                {
+                    $erros_acumulados .= $linha_erro;
+                }
+            }
+            else
+            {
+                // Testa o CERTIFICADO: se o CPF  he o do usuario logado, se  pode assinar msgs e se  nao esta expirado...
+                if ($certificado->apresentado)
+                {
+                    if($certificado->dados['EXPIRADO']) $erros_acumulados .='Certificado expirado.';
+                    if($certificado->dados['CPF'] != $this->username) $erros_acumulados .=' CPF no certificado diferente do logado no expresso.';
+                    if(!($certificado->dados['KEYUSAGE']['digitalSignature'] && $certificado->dados['EXTKEYUSAGE']['emailProtection'])) $erros_acumulados .=' Certificado nao permite assinar mensagens.';
+                }
+                else
+                {
+                    $$erros_acumulados .= 'Nao foi possivel usar o certificado para assinar a msg';
+                }
+            }
+            if(!$erros_acumulados =='')
+            {
+                return $erros_acumulados;
+            }
+        }
+        else
+        {
+            $body = $params['body'];
+        }
 		//echo "<script language=\"javascript\">javascript:alert('".$body."');</script>";
 		$attachments = $params['FILES'];
@@ -1447,6 +1642,13 @@
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 		$mail->SMTPDebug = false;
-				
-		$mail->IsSMTP();
+
+		if($signed && !$params['smime'])
+		{
+            $mail->Mailer = "smime";
+			$mail->SignedBody = true;
+		}
+		else
+            $mail->IsSMTP();
+            
 		$mail->Host = $_SESSION['phpgw_info']['expressomail']['email_server']['smtpServer'];
 		$mail->Port = $_SESSION['phpgw_info']['expressomail']['email_server']['smtpPort'];
@@ -1465,5 +1667,97 @@
 		$mail->Subject = $subject;
 		$mail->IsHTML(true);
-		$mail->Body = $params['body'];
+		$mail->Body = $body;
+
+        if (($encrypt && $signed && $params['smime']) || ($encrypt && !$signed))	// a msg deve ser enviada cifrada...
+		{
+			$email = $this->add_recipients_cert($toaddress . ',' . $ccaddress. ',' .$ccoaddress);
+            $email = explode(",",$email);
+            // Deve ser testado se foram obtidos os certificados de todos os destinatarios.
+            // Deve ser verificado um numero limite de destinatarios.
+            // Deve ser verificado se os certificados sao validos.
+            // Se uma das verificacoes falhar, nao enviar o e-mail e avisar o usuario.
+            // O array $mail->Certs_crypt soh deve ser preenchido se os certificados passarem nas verificacoes.
+            $numero_maximo = $_SESSION['phpgw_info']['user']['preferences']['expressoMail']['num_max_certs_to_cipher'];  // Este valor dever ser configurado pelo administrador do site ....
+            $erros_acumulados = "";
+            $aux_mails = array();
+            $mail_list = array();
+            if(count($email) > $numero_maximo)
+            {
+                $erros_acumulados .= "Excedido o numero maximo (" . $numero_maximo . ") de destinatarios para uma msg cifrada...." . chr(0x0A);
+                return $erros_acumulados;
+            }
+            // adiciona o email do remetente. eh para cifrar a msg para ele tambem. Assim vai poder visualizar a msg na pasta enviados..
+            $email[] = $_SESSION['phpgw_info']['expressomail']['user']['email'];
+            foreach($email as $item)
+            {
+                $certificate = $db->get_certificate(strtolower($item));
+                if(!$certificate)
+                {
+                    $erros_acumulados .= "Chamada com parametro invalido.  e-Mail nao pode ser vazio." . chr(0x0A);
+                    return $erros_acumulados;
+                }
+
+                if (array_key_exists("dberr1", $certificate))
+                {
+
+                    $erros_acumulados .= "Ocorreu um erro quando pesquisava certificados dos destinatarios para cifrar a msg." . chr(0x0A);
+                    return $erros_acumulados;
+				}
+                if (array_key_exists("dberr2", $certificate))
+                {
+                    $erros_acumulados .=  $item . ' : Nao  pode cifrar a msg. Certificado nao localizado.' . chr(0x0A);
+                    //continue;
+                }
+			/*  Retirado este teste para evitar mensagem de erro duplicada.
+                if (!array_key_exists("certs", $certificate))
+              	{
+               		$erros_acumulados .=  $item . ' : Nao  pode cifrar a msg. Certificado nao localizado.' . chr(0x0A);
+                    continue;
+                }
+            */
+                include_once("../seguranca/classes/CertificadoB.php");
+
+                foreach ($certificate['certs'] as $registro)
+                {
+                    $c1 = new certificadoB();
+                    $c1->certificado($registro['chave_publica']);
+                    if ($c1->apresentado)
+                    {
+                        $c2 = new Verifica_Certificado($c1->dados,$registro['chave_publica']);
+                        if (!$c1->dados['EXPIRADO'] && !$c2->revogado && $c2->status)
+                        {
+                            $aux_mails[] = $registro['chave_publica'];
+                            $mail_list[] = strtolower($item);
+                        }
+                        else
+                        {
+                            if ($c1->dados['EXPIRADO'] || $c2->revogado)
+                            {
+                                $db->update_certificate($c1->dados['SERIALNUMBER'],$c1->dados['EMAIL'],$c1->dados['AUTHORITYKEYIDENTIFIER'],
+                                    $c1->dados['EXPIRADO'],$c2->revogado);
+                            }
+
+                            $erros_acumulados .= $item . ':  ' . $c2->msgerro . chr(0x0A);
+                            foreach($c2->erros_ssl as $linha)
+                            {
+                                $erros_acumulados .=  $linha . chr(0x0A);
+                            }
+                            $erros_acumulados .=  'Emissor: ' . $c1->dados['EMISSOR'] . chr(0x0A);
+                            $erros_acumulados .=  $c1->dados['CRLDISTRIBUTIONPOINTS'] . chr(0x0A);
+                        }
+                    }
+                    else
+                    {
+                        $erros_acumulados .= $item . ' : Nao  pode cifrar a msg. Certificado invalido.' . chr(0x0A);
+                    }
+                }
+            	if(!(in_array(strtolower($item),$mail_list)) && !empty($erros_acumulados))
+				{
+					return $erros_acumulados;
+        		}
+            }
+
+            $mail->Certs_crypt = $aux_mails;
+        }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1589,4 +1883,8 @@
 		else
 		{
+            if ($signed && !$params['smime'])
+			{
+				return $sent;
+			}
 			if($_SESSION['phpgw_info']['server']['expressomail']['expressoMail_enable_log_messages'] == "True") 
 			{
@@ -1606,4 +1904,24 @@
    			return array("success" => true);
 		}
+	}
+
+    function add_recipients_cert($full_address)
+	{
+		$result = "";
+		$parse_address = imap_rfc822_parse_adrlist($full_address, "");
+		foreach ($parse_address as $val)
+		{
+			//echo "<script language=\"javascript\">javascript:alert('".$val->mailbox."@".$val->host."');</script>";
+			if ($val->mailbox == "INVALID_ADDRESS")
+				continue;
+			if ($val->mailbox == "UNEXPECTED_DATA_AFTER_ADDRESS")
+				continue;
+			if (empty($val->personal))
+				$result .= $val->mailbox."@".$val->host . ",";
+			else
+				$result .= $val->mailbox."@".$val->host . ",";
+		}
+
+		return substr($result,0,-1);
 	}
 
@@ -2367,5 +2685,5 @@
 			$folder_id = "INBOX";
 		
-		if(!$this->mbox)
+		if(!$this->mbox || !is_resource($this->mbox))
 			$this->mbox = $this->open_mbox();
 
@@ -2958,4 +3276,51 @@
     }
 
+    function show_decript($params){
+        $source = $params['source'];
+        //error_log("source: $source\nversao: " . PHP_VERSION, 3, '/tmp/teste.log');
+        $source = str_replace(" ", "+", $source,$i);
+        
+        if (version_compare(PHP_VERSION, '5.2.0', '>=')){
+            if(!$source = base64_decode($source,true))
+                return "error ".$source."Espaços ".$i;
+
+        }
+        else {
+            if(!$source = base64_decode($source))
+                return "error ".$source."Espaços ".$i;
+        }
+
+        $insert = $this->insert_email($source,'INBOX'.$this->imap_delimiter.'decifradas');
+
+		$get['msg_number'] = $insert['msg_no'];
+		$get['msg_folder'] = 'INBOX'.$this->imap_delimiter.'decifradas';
+		$return = $this->get_info_msg($get);
+		$get['msg_number'] = $params['ID'];
+		$get['msg_folder'] = $params['folder'];
+		$tmp = $this->get_info_msg($get);
+		if(!$tmp['status_get_msg_info'])
+		{
+			$return['msg_day']=$tmp['msg_day'];
+			$return['msg_hour']=$tmp['msg_hour'];
+			$return['fulldate']=$tmp['fulldate'];
+			$return['smalldate']=$tmp['smalldate'];
+		}
+		else
+		{
+			$return['msg_day']='';
+			$return['msg_hour']='';
+			$return['fulldate']='';
+			$return['smalldate']='';
+		}
+        $return['msg_no'] =$insert['msg_no'];
+        $return['error'] = $insert['error'];
+        $return['folder'] = $params['folder'];
+        //$return['acls'] = $insert['acls'];
+        $return['original_ID'] =  $params['ID'];
+
+        return $return;
+
+    }
+    
 //Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Trata fontes de emails enviados via POST para o servidor por um xmlhttprequest, as partes codificados com
 //Base64 os "+" são substituidos por " " no envio e essa função arruma esse efeito.
