Corrigir sincronização de aplicações no módulo de segurança | Scriptcase

Corrigindo sincronizar aplicação no módulo de segurança

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.
InfoEsta 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 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.

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
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'));

  4. foreach($_arr_apps as $k => $v)
  5. {
  6.     if(substr($v, -12) != "_mob_ini.php")
  7.     {
  8.         $arr_apps[] = substr($v, 0, -8);
  9.     }
  10. }

  11. sc_select(rs, "SELECT app_name FROM sec_apps");

  12. $arr_apps_deleted = array(); // >>> NOVO <<<
  13. $arr_apps_db = array();

  14. while(!$rs->EOF)
  15. {
  16.     $arr_apps_db[] = $rs->fields[0];
  17.     $rs->MoveNext();
  18. }
  19. $rs->Close();

  20. if({check_deleted} == 'Y')
  21. {
  22.     $arr_apps_deleted_dir = array_diff($arr_apps_db, $arr_apps); // >>> NOVO <<<
  23.     foreach($arr_apps_deleted_dir as $k => $app){ // >>> NOVO <<<
  24.         if(substr($app, 0, 8) == 'https://' || substr($app, 0, 7) == 'http://'){ // >>> NOVO <<<
  25.             continue; // >>> NOVO <<<
  26.         }
  27.         $arr_apps_deleted[] = $app; // >>> NOVO <<<
  28.         sc_exec_sql("DELETE FROM sec_groups_apps WHERE app_name = " . sc_sql_injection($app)); // >>> NOVO <<<
  29.         sc_exec_sql("DELETE FROM sec_apps WHERE app_name = " . sc_sql_injection($app)); // >>> NOVO <<<
  30.     }

  31.     foreach($arr_apps as $k => $app)
  32.     {
  33.         require($this->Ini->path_aplicacao . "../_lib/_app_data/". $app . '_ini.php');
  34.         
  35.         $app = (isset($arr_data['friendly_url']) && !empty($arr_data['friendly_url']))?$arr_data['friendly_url']:$app;
  36.         
  37.         if( !is_dir($this->Ini->path_aplicacao . "../" . $app) )
  38.         {
  39.             unset($arr_apps[$k]);
  40.         }
  41.     }
  42. }

  43. $arr_apps = array_diff($arr_apps, $arr_apps_db);

  44. //========= Groups =========
  45. $arr_grp = array();
  46. sc_select(rs, "SELECT group_id FROM sec_groups");
  47. while(!$rs->EOF)
  48. {
  49.     $arr_grp[] = $rs->fields[0];
  50.     $rs->MoveNext();
  51. }
  52. $rs->Close();

  53. foreach($arr_apps as $k => $app)
  54. {
  55.     require($this->Ini->path_aplicacao . "../_lib/_app_data/". $app . '_ini.php');
  56.     $app_type = isset($arr_data['type'])? $arr_data['type'] : '';
  57.     $app_desc = isset($arr_data['description']) ? $arr_data['description'] : '';
  58.     $arr_app_desc[ $app ] = $app_desc; // >>> NOVO <<<
  59.     
  60.     $sql = "SELECT count(*) FROM sec_apps WHERE app_name = '". $app ."' ";
  61.     sc_lookup(rs, $sql);
  62.     if({rs[0][0]} == 0)
  63.     {
  64.         $sql = "INSERT INTO sec_apps(app_name, app_type, description) VALUES ('". $app ."', '".$app_type."', '".$app_desc."')";
  65.         sc_exec_sql( $sql );
  66.         foreach($arr_grp as $grp)
  67.         {
  68.             $sql = "INSERT INTO sec_groups_apps(app_name, group_id) VALUES ('". $app ."', '". $grp ."')";
  69.             sc_exec_sql( $sql );
  70.         }
  71.     }
  72. }

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 = '<table class="scFormTable sc-ui-100perc-table" cellspacing=5 cellpadding=5 style="width: 700px;">'; // >>> NOVO <<<
  2. $html .= '<thead><tr><th>'.{lang_sec_app_name}.'</th><th>'.{lang_sec_description}.'</th></tr></thead><tbody>'; // >>> NOVO <<<

  3. if(is_array($arr_apps))
  4. {
  5.     $total_apps = count($arr_apps);
  6.     foreach($arr_apps as $app)
  7.     {
  8.         $html .= "<tr>"; // >>> NOVO <<<
  9.         $html .=     "<td>". $app .'</td>'; // >>> NOVO <<<
  10.         $html .=     '<td>'. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . "</td>"; // >>> NOVO <<<
  11.         $html .= "</tr>"; // >>> NOVO <<<
  12.     }
  13. }

  14. if(is_array($arr_apps_deleted)) // >>> NOVO <<<
  15. {
  16.     $total_apps_deleted = count($arr_apps_deleted); // >>> NOVO <<<
  17.     foreach($arr_apps_deleted as $app) // >>> NOVO <<<
  18.     {
  19.         $html .= "<tr>"; // >>> NOVO <<<
  20.         $html .=     "<td>". $app .'</td>'; // >>> NOVO <<<
  21.         $html .=     '<td>'. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . "  <strong>".{lang_sec_deleted}."</strong></td>"; // >>> NOVO <<<
  22.         $html .= "</tr>"; // >>> NOVO <<<
  23.     }
  24. }

  25. $html .= "</tbody></table>"; // >>> NOVO <<<

  26. {sync}  = "<br/><b>". $total_apps. " ". {lang_syncronized_apps} . "</b>"; // >>> NOVO <<<
  27. {sync} .= "<br/><b>". $total_apps_deleted. " ". {lang_sec_deleted_apps} . "</b>"; // >>> NOVO <<<
  28. if($total_apps > 0 || $total_apps_deleted > 0){ // >>> NOVO <<<
  29.     {sync} .= "<hr/>" . $html; // >>> NOVO <<<
  30. }


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.