Neste artigo veremos como corrigir o problema na aplicação de sync\_app (nome padrão) sem a necessidade de recriar o módulo de segurança.

![Info](https://static.zohocdn.com/zoho-desk-editor/static/images/info.png/)Esta correção se aplica para um módulo de segurança **criado em uma release anterior a 9.12.021** e que seja dos **tipos**:

- **Grupo**
- **Aplicação**
- **Ldap/Aplicação**

## O problema

Ao apagar uma aplicação do sistema, na lista de aplicações, e utilizar a opção sincronizar aplicações para atualizar as bases algumas tabelas não estavam sendo atualizadas e as aplicações deletaras continuavam sendo exibidas.

## Como corrigir

Para corrigir o problema no sincronizar aplicações do módulo de segurança, será necessário alterar os códigos dos eventos *onValidate*e *onValidateSuccess*na aplicação *sync\_apps*(nome padrão).

## Passo a passo

Siga os passos a baixo, em caso de dúvida entre em contato com nosso suporte através dos canais oficiais.

### 1. Encontrado a aplicação

Independente do prefixo utilizado na criação do módulo de segurança o nome padrão da aplicação é **sync\_apps.** Na home do seu projeto pesquisa por **sync\_apps.**

![](https://help.scriptcase.net/galleryDocuments/edbsn3d8fd1cddac986eeab1acd0694285670e1686e82d8d5b8c8b3bbafc5d1907f8ec409fc8bd2291b0372d4a3b425f286e2?inline=true)

### 2. Código do onValidate

Ao abrir a aplicação acesse o evento ***onValidate*** **comente o código atual** e adicione o código abaixo.

![Alert](https://static.zohocdn.com/zoho-desk-editor/static/images/exclamation.png/)

O código abaixo utiliza os nomes padrão das tabelas, campos e aplicações. Antes de realizar a alteração definitiva, verifique os nomes das tabelas utilizadas em seu sistema e altere os nomes no código se necessário.

Abaixo segue a lista de comandos SQL utilizados neste código.

- sc\_select(rs, "SELECT app\_name FROM sec\_apps");
- sc\_exec\_sql("DELETE FROM sec\_groups\_apps WHERE app\_name = " . sc\_sql\_injection($app));
- sc\_exec\_sql("DELETE FROM sec\_apps WHERE app\_name = " . sc\_sql\_injection($app));
- sc\_select(rs, "SELECT group\_id FROM sec\_groups");
- "SELECT count(\*) FROM sec\_apps WHERE app\_name = '". $app ."' ";
- "INSERT INTO sec\_apps(app\_name, app\_type, description) VALUES ('". $app ."', '".$app\_type."', '".$app\_desc."')";
- "INSERT INTO sec\_groups\_apps(app\_name, group\_id) VALUES ('". $app ."', '". $grp ."')";

***onValidate***

1. $arr\_apps  = array();
2. $arr\_app\_desc = array(); // >>> NOVO <<<
3. $\_arr\_apps = array\_diff(scandir($this->Ini->path\_aplicacao . "../\_lib/\_app\_data/"), array('.','..', 'index.php', 'index.html'));
5. foreach($\_arr\_apps as $k => $v)
6. {
7. if(substr($v, -12) != "\_mob\_ini.php")
8. {
9. $arr\_apps[] = substr($v, 0, -8);
10. }
11. }
13. sc\_select(rs, "SELECT app\_name FROM sec\_apps");
15. $arr\_apps\_deleted = array(); // >>> NOVO <<<
16. $arr\_apps\_db = array();
18. while(!$rs->EOF)
19. {
20. $arr\_apps\_db[] = $rs->fields[0];
21. $rs->MoveNext();
22. }
23. $rs->Close();
25. if({check\_deleted} == 'Y')
26. {
27. $arr\_apps\_deleted\_dir = array\_diff($arr\_apps\_db, $arr\_apps); // >>> NOVO <<<
28. foreach($arr\_apps\_deleted\_dir as $k => $app){ // >>> NOVO <<<
29. if(substr($app, 0, 8) == 'https://' || substr($app, 0, 7) == 'http://'){ // >>> NOVO <<<
30. continue; // >>> NOVO <<<
31. }
32. $arr\_apps\_deleted[] = $app; // >>> NOVO <<<
33. sc\_exec\_sql("DELETE FROM sec\_groups\_apps WHERE app\_name = " . sc\_sql\_injection($app)); // >>> NOVO <<<
34. sc\_exec\_sql("DELETE FROM sec\_apps WHERE app\_name = " . sc\_sql\_injection($app)); // >>> NOVO <<<
35. }
37. foreach($arr\_apps as $k => $app)
38. {
39. require($this->Ini->path\_aplicacao . "../\_lib/\_app\_data/". $app . '\_ini.php');
41. $app = (isset($arr\_data['friendly\_url']) && !empty($arr\_data['friendly\_url']))?$arr\_data['friendly\_url']:$app;
43. if( !is\_dir($this->Ini->path\_aplicacao . "../" . $app) )
44. {
45. unset($arr\_apps[$k]);
46. }
47. }
48. }
50. $arr\_apps = array\_diff($arr\_apps, $arr\_apps\_db);
52. //========= Groups =========
53. $arr\_grp = array();
54. sc\_select(rs, "SELECT group\_id FROM sec\_groups");
55. while(!$rs->EOF)
56. {
57. $arr\_grp[] = $rs->fields[0];
58. $rs->MoveNext();
59. }
60. $rs->Close();
62. foreach($arr\_apps as $k => $app)
63. {
64. require($this->Ini->path\_aplicacao . "../\_lib/\_app\_data/". $app . '\_ini.php');
65. $app\_type = isset($arr\_data['type'])? $arr\_data['type'] : '';
66. $app\_desc = isset($arr\_data['description']) ? $arr\_data['description'] : '';
67. $arr\_app\_desc[ $app ] = $app\_desc; // >>> NOVO <<<
69. $sql = "SELECT count(\*) FROM sec\_apps WHERE app\_name = '". $app ."' ";
70. sc\_lookup(rs, $sql);
71. if({rs[0][0]} == 0)
72. {
73. $sql = "INSERT INTO sec\_apps(app\_name, app\_type, description) VALUES ('". $app ."', '".$app\_type."', '".$app\_desc."')";
74. sc\_exec\_sql( $sql );
75. foreach($arr\_grp as $grp)
76. {
77. $sql = "INSERT INTO sec\_groups\_apps(app\_name, group\_id) VALUES ('". $app ."', '". $grp ."')";
78. sc\_exec\_sql( $sql );
79. }
80. }
81. }

### 3. Código do onValidateSuccess

Após realizar as mudanças necessárias no *onValidate*, acesse o evento ***onValidateSuccess*.**

Neste evento as mudanças são visuais, apenas para melhorar o retorno ao utilizar a opção de sincronizar aplicação.

Comente o código atual e adicione o código abaixo.

***onValidateSuccess***

1. $html = '

   '; // >>> NOVO <<<
2. $html .= '| '.{lang\_sec\_app\_name}.' | '.{lang\_sec\_description}.' |
   | --- | --- |
   '; // >>> NOVO <<<
4. if(is\_array($arr\_apps))
5. {
6. $total\_apps = count($arr\_apps);
7. foreach($arr\_apps as $app)
8. {
9. $html .= "|"; // >>> NOVO <<<
   |  |
10. $html .=     " ". $app .' |'; // >>> NOVO <<<
11. $html .=     ' '. ( isset($arr\_app\_desc[ $app ]) ? $arr\_app\_desc[$app] : '') . " |"; // >>> NOVO <<<
12. $html .= ""; // >>> NOVO <<<
13. }
14. }
16. if(is\_array($arr\_apps\_deleted)) // >>> NOVO <<<
17. {
18. $total\_apps\_deleted = count($arr\_apps\_deleted); // >>> NOVO <<<
19. foreach($arr\_apps\_deleted as $app) // >>> NOVO <<<
20. {
21. $html .= "|"; // >>> NOVO <<<
    |  |
22. $html .=     " ". $app .' |'; // >>> NOVO <<<
23. $html .=     ' '. ( isset($arr\_app\_desc[ $app ]) ? $arr\_app\_desc[$app] : '') . "  **".{lang\_sec\_deleted}."** |"; // >>> NOVO <<<
24. $html .= ""; // >>> NOVO <<<
25. }
26. }
28. $html .= ""; // >>> NOVO <<<
30. {sync}  = "  
    **". $total\_apps. " ". {lang\_syncronized\_apps} . "**"; // >>> NOVO <<<
31. {sync} .= "  
    **". $total\_apps\_deleted. " ". {lang\_sec\_deleted\_apps} . "**"; // >>> NOVO <<<
32. if($total\_apps > 0 || $total\_apps\_deleted > 0){ // >>> NOVO <<<
33. {sync} .= "

    ---

    " . $html; // >>> NOVO <<<
34. }

### **4. Teste e publicação**

Após as alterações compile o fonte da aplicação e realize testes para verificar se as alterações no código foram bem sucedidas.

Se tudo ocorrer bem nos testes, basta realizar a publicação da aplicação para que a correção seja aplicada a seu sistema em produção.

**Caso tenha alguma dúvida ou problema com a mudança consulte nosso suporte através dos canais oficiais.**