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 onValidatee onValidateSuccessna 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 = '
'; // >>> NOVO <<<
-
$html .= '| '.{lang_sec_app_name}.' | '.{lang_sec_description}.' | | --- | --- | '; // >>> NOVO <<<
-
if(is_array($arr_apps))
-
{
-
$total_apps = count($arr_apps);
-
foreach($arr_apps as $app)
-
{
-
$html .= "|"; // >>> NOVO <<< | |
-
$html .= " ". $app .' |'; // >>> NOVO <<<
-
$html .= ' '. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . " |"; // >>> NOVO <<<
-
$html .= ""; // >>> NOVO <<<
-
}
-
}
-
if(is_array($arr_apps_deleted)) // >>> NOVO <<<
-
{
-
$total_apps_deleted = count($arr_apps_deleted); // >>> NOVO <<<
-
foreach($arr_apps_deleted as $app) // >>> NOVO <<<
-
{
-
$html .= "|"; // >>> NOVO <<< | |
-
$html .= " ". $app .' |'; // >>> NOVO <<<
-
$html .= ' '. ( isset($arr_app_desc[ $app ]) ? $arr_app_desc[$app] : '') . " ".{lang_sec_deleted}." |"; // >>> NOVO <<<
-
$html .= ""; // >>> NOVO <<<
-
}
-
}
-
$html .= ""; // >>> NOVO <<<
-
{sync} = "
". $total_apps. " ". {lang_syncronized_apps} . ""; // >>> NOVO <<< -
{sync} .= "
". $total_apps_deleted. " ". {lang_sec_deleted_apps} . ""; // >>> NOVO <<< -
if($total_apps > 0 || $total_apps_deleted > 0){ // >>> NOVO <<<
-
{sync} .= "
" . $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.