En este artículo veremos cómo corregir el problema en la aplicación sync\_app (nombre predeterminado) sin necesidad de recrear el módulo de seguridad.

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

Esta corrección se aplica a un módulo de seguridad creado en una versión anterior a la 9.12.021 y que utilice los siguientes tipos:

1. **Grupo**
2. **Aplicación**
3. **Ldap/Aplicación**

## El problema

Al eliminar una aplicación del sistema en la lista de aplicaciones y utilizar la opción de sincronizar aplicaciones para actualizar la base de datos, algunas tablas no se actualizaban y las aplicaciones eliminadas seguían apareciendo.

## Cómo corregir

Para solucionar el problema de sincronización de aplicaciones en el módulo de seguridad, será necesario editar el código de los eventos *onValidate*y *onValidateSuccess*en la aplicación *sync\_apps* (nombre predeterminado).

## Paso a paso

Siga los pasos a continuación. En caso de dudas, comuníquese con nuestro soporte a través de los canales oficiales.

### 1. Localizar la aplicación

Independientemente del prefijo utilizado durante la creación del módulo de seguridad, el nombre predeterminado de la aplicación es **sync\_apps.** En la página inicial de su proyecto, busque por **sync\_apps.**

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

### 2. Código para onValidate

Después de abrir la aplicación, acceda al evento ***onValidate***, **comente el código actual** y agregue el siguiente código.

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

El código a continuación utiliza los nombres predeterminados de las tablas, campos y aplicaciones. Antes de aplicar cambios definitivos, verifique los nombres reales de las tablas en su sistema y ajústelos si es necesario.

A continuación se muestra la lista de comandos SQL utilizados en este 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(); // >>> Nuevo <<<*
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(); // >>> Nuevo <<<*
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); // >>> Nuevo <<<*
28. *foreach($arr\_apps\_deleted\_dir as $k => $app){ // >>> Nuevo <<<*
29. *if(substr($app, 0, 8) == 'https://' || substr($app, 0, 7) == 'http://'){ // >>> Nuevo <<<*
30. *continue; // >>> Nuevo <<<*
31. *}*
32. *$arr\_apps\_deleted[] = $app; // >>> Nuevo <<<*
33. *sc\_exec\_sql("DELETE FROM sec\_groups\_apps WHERE app\_name = " . sc\_sql\_injection($app)); // >>> Nuevo <<<*
34. *sc\_exec\_sql("DELETE FROM sec\_apps WHERE app\_name = " . sc\_sql\_injection($app)); // >>> Nuevo <<<*
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; // >>> Nuevo <<<*
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 para *onValidateSuccess*

Después de realizar los cambios necesarios en *onValidate*, acceda al evento ***onValidateSuccess*.**

En este evento los cambios son visuales, únicamente para mejorar el retorno al usar la opción de sincronizar aplicación.

Comente el código actual y agregue el siguiente código.

***onValidateSuccess***

1. *$html = '

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

    ---

    " . $html; // >>> Nuevo <<<*
34. *}*

**​**

### **4. Prueba y publicación**

Después de realizar los cambios, compile el código fuente de la aplicación y realice pruebas para verificar si los cambios fueron exitosos.

Si todo funciona correctamente en las pruebas, simplemente publique la aplicación para aplicar la corrección en su sistema en producción.

**Si tiene alguna duda o problema con el cambio, consulte con nuestro soporte a través de los canales oficiales.**