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.