Como fazer para que a senha de um usuário nunca expire no Protheus | Ti Responde 0180

No vídeo de hoje, vamos demonstrar em como configurar para um usuário nunca expirar a senha no Protheus.

A dúvida de hoje, nos perguntaram, se era possível criar alguma parametrização para um usuário em específico nunca expirar a senha (por exemplo, algum usuário de integração com API ou agendamentos).

 

Pensando nisso, montamos um exemplo, onde vamos mostrar em como usar um ExecAuto para resetar a senha do usuário, sendo possível agendar todo o dia, assim a senha nunca expirará.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"
#Include "FWMVCDef.ch"
 
/*/{Protheus.doc} User Function zAtuSenha
Função para resetar senha de usuários
@type  Function
@author Atilio
@since 02/06/2022
@see https://terminaldeinformacao.com/2023/11/17/conheca-brechas-de-seguranca-do-protheus-e-como-preveni-las/
/*/
 
User Function zAtuSenha(cLoginUsr, cSenhaUsr)
    Local cAliasUsr := "MPUSR_USR"
    Local lDeuCerto := .F.
 
    //Abre a tabela de usuários e posiciona
    DbSelectArea(cAliasUsr)
    (cAliasUsr)->(DbSetOrder(2)) // USR_CODIGO
     
    If (cAliasUsr)->(MsSeek(cLoginUsr))

        QOut("[RESET USER][B01] Encontrou o Login")
 
        //Se não usar o filtro ou tentar usar DbSetFilter no lugar de Set Filter To, ocasiona erro atualizando sempre o primeiro registro
        Set Filter To &("USR_CODIGO = '" + cLoginUsr + "'")
 
        //Ativa o modelo como alteração (CFGA510)
        oModel := FWLoadModel("FWUSERACCOUNTDATA")
        oModel:SetOperation(MODEL_OPERATION_UPDATE)
        oModel:Activate()
 
        //Define o campo de senha (nome do campo real é USR_SENHA, mas no model é os abaixo)
        oModel:SetValue("DATAUSER", "USR_PSW",    cSenhaUsr)
        oModel:SetValue("DATAUSER", "USR_PSWCMP", cSenhaUsr)

        QOut("[RESET USER][B02] Após setar o user")
 
        //Se conseguir validar os dados e realizar o commit
        If oModel:VldData() .And. oModel:CommitData()
            lDeuCerto := .T.

            QOut("[RESET USER][B03] Deu certo a alteração")
 
        //Se não, houve erro, incrementa a mensagem
        Else
            //Busca o Erro do Modelo de Dados
            aErro := oModel:GetErrorMessage()
 
            //Monta o Texto que será mostrado na tela
            AutoGrLog("Id do formulário de origem:"  + ' [' + AllToChar(aErro[01]) + ']')
            AutoGrLog("Id do campo de origem: "      + ' [' + AllToChar(aErro[02]) + ']')
            AutoGrLog("Id do formulário de erro: "   + ' [' + AllToChar(aErro[03]) + ']')
            AutoGrLog("Id do campo de erro: "        + ' [' + AllToChar(aErro[04]) + ']')
            AutoGrLog("Id do erro: "                 + ' [' + AllToChar(aErro[05]) + ']')
            AutoGrLog("Mensagem do erro: "           + ' [' + AllToChar(aErro[06]) + ']')
            AutoGrLog("Mensagem da solução: "        + ' [' + AllToChar(aErro[07]) + ']')
            AutoGrLog("Valor atribuído: "            + ' [' + AllToChar(aErro[08]) + ']')
            AutoGrLog("Valor anterior: "             + ' [' + AllToChar(aErro[09]) + ']')
 
            //Mostra a mensagem de Erro
            MostraErro()

            QOut("[RESET USER][B04] Falha na atualização: " + aErro[06])
        EndIf
 
        //Desativa o modelo da memória
        oModel:DeActivate()
        FreeObj(oModel)
 
        DbSelectArea(cAliasUsr)
        Set Filter To
        QOut("[RESET USER][B05] Após limpar filtro")
    EndIf
Return lDeuCerto
 
 
/*/{Protheus.doc} User Function zVid0180
Função para resetar o usuário para não expirar a senha (agendar no Schedule para rodar todo dia)
@type  Function
@author Atilio
@since 01/07/2024
/*/
 
User Function zVid0180()
    Local cLogin     := "daniel.atilio"
    Local cPass      := Decode64("dHN0MTIz")
    Local cEmpresAux := "99"
    Local cFilialAux := "01"

    If Select("SX2") <= 0
        RPCSetEnv(cEmpresAux, cFilialAux, cLogin, cPass, "", "")
    EndIf

    QOut("[RESET USER][A01] Antes do zAtuSenha")
 
    u_zAtuSenha(cLogin, cPass)

    QOut("[RESET USER][A02] Depois do zAtuSenha")
 
Return

Obs.: Recomendamos a leitura desse link do TDN – https://tdn.totvs.com/pages/releaseview.action?pageId=307846436

 

 

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação