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.

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.
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.
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
- $arr_apps = array();
- $arr_app_desc = array(); // >>> NOVO <<<
- $_arr_apps = array_diff(scandir($this->Ini->path_aplicacao . "../_lib/_app_data/"), array('.','..', 'index.php', 'index.html'));
- foreach($_arr_apps as $k => $v)
- {
- if(substr($v, -12) != "_mob_ini.php")
- {
- $arr_apps[] = substr($v, 0, -8);
- }
- }
- sc_select(rs, "SELECT app_name FROM sec_apps");
- $arr_apps_deleted = array(); // >>> NOVO <<<
- $arr_apps_db = array();
- while(!$rs->EOF)
- {
- $arr_apps_db[] = $rs->fields[0];
- $rs->MoveNext();
- }
- $rs->Close();
- if({check_deleted} == 'Y')
- {
- $arr_apps_deleted_dir = array_diff($arr_apps_db, $arr_apps); // >>> NOVO <<<
- foreach($arr_apps_deleted_dir as $k => $app){ // >>> NOVO <<<
- if(substr($app, 0, 8) == 'https://' || substr($app, 0, 7) == 'http://'){ // >>> NOVO <<<
- continue; // >>> NOVO <<<
- }
- $arr_apps_deleted[] = $app; // >>> NOVO <<<
- sc_exec_sql("DELETE FROM sec_groups_apps WHERE app_name = " . sc_sql_injection($app)); // >>> NOVO <<<
- sc_exec_sql("DELETE FROM sec_apps WHERE app_name = " . sc_sql_injection($app)); // >>> NOVO <<<
- }
- foreach($arr_apps as $k => $app)
- {
- require($this->Ini->path_aplicacao . "../_lib/_app_data/". $app . '_ini.php');
-
- $app = (isset($arr_data['friendly_url']) && !empty($arr_data['friendly_url']))?$arr_data['friendly_url']:$app;
-
- if( !is_dir($this->Ini->path_aplicacao . "../" . $app) )
- {
- unset($arr_apps[$k]);
- }
- }
- }
- $arr_apps = array_diff($arr_apps, $arr_apps_db);
- //========= Groups =========
- $arr_grp = array();
- sc_select(rs, "SELECT group_id FROM sec_groups");
- while(!$rs->EOF)
- {
- $arr_grp[] = $rs->fields[0];
- $rs->MoveNext();
- }
- $rs->Close();
- foreach($arr_apps as $k => $app)
- {
- require($this->Ini->path_aplicacao . "../_lib/_app_data/". $app . '_ini.php');
- $app_type = isset($arr_data['type'])? $arr_data['type'] : '';
- $app_desc = isset($arr_data['description']) ? $arr_data['description'] : '';
- $arr_app_desc[ $app ] = $app_desc; // >>> NOVO <<<
-
- $sql = "SELECT count(*) FROM sec_apps WHERE app_name = '". $app ."' ";
- sc_lookup(rs, $sql);
- if({rs[0][0]} == 0)
- {
- $sql = "INSERT INTO sec_apps(app_name, app_type, description) VALUES ('". $app ."', '".$app_type."', '".$app_desc."')";
- sc_exec_sql( $sql );
- foreach($arr_grp as $grp)
- {
- $sql = "INSERT INTO sec_groups_apps(app_name, group_id) VALUES ('". $app ."', '". $grp ."')";
- sc_exec_sql( $sql );
- }
- }
- }
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
- $html = '<table class="scFormTable sc-ui-100perc-table" cellspacing=5 cellpadding=5 style="width: 700px;">'; // >>> NOVO <<<
- $html .= '<thead><tr><th>'.{lang_sec_app_name}.'</th><th>'.{lang_sec_description}.'</th></tr></thead><tbody>'; // >>> NOVO <<<
- if(is_array($arr_apps))
- {
- $total_apps = count($arr_apps);
- foreach($arr_apps as $app)
- {
- $html .= "<tr>"; // >>> NOVO <<<
- $html .= "<td>". $app .'</td>'; // >>> NOVO <<<
- $html .= '<td>'. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . "</td>"; // >>> NOVO <<<
- $html .= "</tr>"; // >>> NOVO <<<
- }
- }
- if(is_array($arr_apps_deleted)) // >>> NOVO <<<
- {
- $total_apps_deleted = count($arr_apps_deleted); // >>> NOVO <<<
- foreach($arr_apps_deleted as $app) // >>> NOVO <<<
- {
- $html .= "<tr>"; // >>> NOVO <<<
- $html .= "<td>". $app .'</td>'; // >>> NOVO <<<
- $html .= '<td>'. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . " <strong>".{lang_sec_deleted}."</strong></td>"; // >>> NOVO <<<
- $html .= "</tr>"; // >>> NOVO <<<
- }
- }
- $html .= "</tbody></table>"; // >>> NOVO <<<
- {sync} = "<br/><b>". $total_apps. " ". {lang_syncronized_apps} . "</b>"; // >>> NOVO <<<
- {sync} .= "<br/><b>". $total_apps_deleted. " ". {lang_sec_deleted_apps} . "</b>"; // >>> NOVO <<<
- if($total_apps > 0 || $total_apps_deleted > 0){ // >>> NOVO <<<
- {sync} .= "<hr/>" . $html; // >>> NOVO <<<
- }
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.