BlackTDN Search

terça-feira, 25 de novembro de 2008

Protheus :: Desvendando o sigapss.spf

Atendendo a uma reivindicação antiga, começarei a postar neste blog algumas dicas à respeito dos segredos do Protheus. E o primeiro artigo não poderia ser outro, senão sobre o misterioso sigapss.spf ( o arquivo de senhas do protheus ).

O sigapss.spf é a tabela que armazena os usuários do protheus e suas configurações. Não é um a tabela comum e, em função dessa característica, não pode ser aberta com a função dbUseArea(). Ela é um ctree SuperFile e, para que seja possível manipula-la ( incluir, excluir, alterar ou pesquisar registros ) faz-se necessário utilizar funções específicas para esse fim.

As funções a serem utilizadas são:

Internal Functions (Funcões da API ):

SPF_CanOpen(cSPFFile)->0||-1
SPF_Close(cSPFFile)
SPF_CopyTo(cSPFSource,cSPFTarget)
SPF_Delete(cSPFFile,nSPFRec)
SPF_GetFields(cSPFFile,SPFRec,@SPFId,@cSPFName,@cSPFPwd,@SPFDet)->0||-1
SPF_GoTop(cPswFile,nSPFOrder)
SPF_Insert(cSPFFile,cSPFId,cSPFuser,cSPFPassword,cSpFDet)
SPF_RecCount(cSPFFile,nSPFOrder)
SPF_Seek(cSPFFile,cSPFKeySeek,nSPFOrder) -> nSPFRec
SPF_Skip(cSPFFile,nSPFSkip,nSPFOrder)
SPF_Update(cSPFFile,@nSPFRec,cSPFId,cSPFName,cSPFPwd,cSPFDet)


Advpl Functions (Funções em ADVPL ):

PswEncript(cStrEncrypt,nType) -> cStrEncrypt || cStrDecrypt
Str2Array(cSPFDet,lEncrypt) -> aSPFDet
Array2Str(aSPFDet,lEncrypt) -> cSPFDet
PswOrder(nPswOrder)
PswSeek(cPswKey) -> lFound
PswRet(nType) -> aPswDet
PswRecno() -> nPswRecno
AllGroups() -> aPswGroups
AllUsers() -> aPswUsers
PswUsrGrp(cPswUserId,cPswGroupId) -> lPswUserInPswGroup


dentre outras...

Nosso primeiro exemplo será a inclusão de um novo usuário herdando as características de um usuário pré-existente. Então o primeiro passo é incluir um usuário no siga usando o módulo SIGACFG ( configurador ). Faz-se necessário, para que esse exemplo funcione, que o arquivo de senhas (sigapss.spf) esteja criado e pelo menos um usuário ( que não o Administrador ) esteja cadastrado. É altamente recomendado que todas as características do novo usuário sejam preenchidas, isso facilitará identificar cada uma delas dentro do Array com as configurações do usuário que iremos manipular.

Obs.: Utilizaremos o Protheus 10.2

Então mãos à obra.

Incluindo um usuário no Protheus:

No módulo SIGACFG acesse a opção conforme figura abaixo:

Programa: CFGX021 - Menu:SIGACFG.XNU
Opção do Menu: &Ambiente->&Usuário->Senhas->Senhas de Usuario


Inclua o usuário base. No nosso exemplo: Usuario.000001:


Defina as "Restrições" do usuário:

Defina as "Outras Informações" do usuário:


Defina o "Vínculo Funcional" do usuário:

Defina o "Grupo" do usuário:

Defina as "Empresas/Filiais" e os "Módulos" aos quais o usuário terá acesso:

Defina as "Restrições de Acesso" e os "Acessos":


Defina as "Preferências de Impressão":

E assim por diante. Quanto mais detalhes forem configurados para o Usuário base, mais detalhes poderemos identificar e Manipular no sigapss.spf.

Nesse exemplo, iremos utilizar como base as características do Usuario.000001 que, no nosso caso, por ser o primeiro usuário cadastrado, também possuirá o ID 000001. Incluiremos os usuários seqüencialmente e alteraremos algumas das características.

Agora vamos ao código:

Utilizaremos a IDE do Protheus para desenvolve-lo:


Definindo constantes com o Mapeamento
das Informações do usuário
(clique na imagem para ampliá-la)


Inserindo um novo usuário no sigapss.spf
(clique na imagem para ampliá-la)

Função para Obter um usuário válido
(clique na imagem para ampliá-la)

Para executar e depurar o programa utilize a IDE do Protheus conforme imagem abaixo:


Detalhes das informações do usuário retornado do sigapss.spf:

Para obter o código de exemplo completo clique aqui

32 comentários:

  1. Boa tarde Naldo.

    Excelente Post... há tempos venho pensando em escrever um blog sobre Tecnologia Protheus.

    Um Abraço,


    Hélio Costa
    Infra/Materiais

    ResponderExcluir
  2. Muito bom!!!! Fantastico consegui descobrir a senha de todo mundo.

    ResponderExcluir
  3. Ola Naldo,
    Tenho uma dúvida apartir desta sua diga seria possivel criar um algoritimo que mudasse a senha do usuario automaticamente.
    Exemplo:
    Toda 00:00hs ele mudaria a senha de um determinado usuario baseado-se no logaritimo simples(data * 2) só um exemplo.
    Obrigado.

    Alex Seabra

    ResponderExcluir
  4. É possível descobrir a senha do admin com isso tudo ?

    ResponderExcluir
  5. Naldo,

    Já testou isso na versão 11 do Protheus? pois acredito que mudaram o arquivo de senhas, e não consegui utilizá-lo na versão 11.

    Vc tem algum que funcione para 11?

    Obrigado,

    Marcos

    ResponderExcluir
  6. Houve atualização no arquivo ou nas funções, após atualização do p10 no momento do update ou insert, esta dando um erro: invalid protected call in file: ctreefair\cpp

    Alguem ja viu esse erro?

    ResponderExcluir
  7. Recentemente, ao fazer a atualização do meu ambiente, comecei a receber esta mesma mensagem ao chamar a função SPF_GETFIELDS().
    Para contornar isto apenas mudei a minha função de User Function para Static Function, pois aparentemente foi inserida alguma trava para a chamadas destas funções de API via User Function.


    Att.,


    Tiago Bandeira Brasiliano

    ResponderExcluir
  8. Naldo, boa tarde.
    Acredito que na versão 10 a função "Str2array" está retornando um array diferente do que era quando você criou o fonte acima.

    Você tem uma atualização do retorno da str2array ??

    Abraços,

    Gilberto

    ResponderExcluir
  9. Parece que várias funções relativas ao .SPF foram alteradas pela TOTVs e pararam de funcionar no Protheus 11.

    Muito bom o blog. Sempre passo por aqui. Outro muito interessante: http://microsigadvpl.blogspot.com

    ResponderExcluir
  10. Naldo,

    Estou utilizando a função PswEncript(variavel, 1) e a mesma não está retornado a senha decriptando a senha. Você tem idéia do que pode está acontecendo?.

    Muito obrigado,
    Manoel

    ResponderExcluir
  11. Manoel,

    A Totvs/Microsiga alterou o comportamento das funções de manipulação do "SuperFile" de senhas. Então, as dicas apresentadas neste "post", se estiver com uma versão atualizada do Protheus, não irão funcionar.

    É uma pena, a Totvs/Microsiga, ao invés de impor bloqueio deveria criar facilitadores para automatizar o processo de inclusão, bloqueio e/ou exclusão de usuários no protheus. Qualquer bom sistema tem isso. Conseguimos fazer isso fácilmente no Linux, em qualquer aplicação do Windows (inclusive no próprio SO) nos SGBDs, etc. Mas, infelizmente, tem algumas pessoas com pensamentos retrógrados... Querem proteger o sistema de quem/de que? (rs).

    []s
    иαldσ dj

    ResponderExcluir
  12. Naldo, desculpe reviver o post mas estou com algumas duvidas qnto as senhas do protheus.
    Voce acha que eh possivel ou conhece alguma funcao para alterar senha de usuario?

    Obrigado :)

    ResponderExcluir
  13. Ferne$,

    O que posso te responder....

    Se hoje fosse: terça-feira, 25 de novembro de 2008 eu diria que sim, mas, após essa data várias mudanças foram feitas no protheus.

    Preciso pesquisar.

    Ótimo seria se a totvs já tivesse implementado a função UsrChgPwd(cUserId,cNewPwd).

    []s
    иαldσ dj

    ResponderExcluir
  14. ..eai? A Totvs impos um limite e venceu?


    ..acho que nao!

    ResponderExcluir
  15. Naldo. Boa tarde. Tudo bem? Estou criando uma rotina para alteração de usuários.
    Estou mudando os usuários cadastrados na empresa 01 e filial 01 para empresa 03 e filial 03.

    Ao finalizar a rotina ele corrompe o arquivo, não deixando abrir os detalhes dos usuários.

    Poderia passar um exemplo?

    Abraços,

    ResponderExcluir
  16. Anônimo,

    Observe a data do post: terça-feira, 25 de novembro de 2008

    de lá pra cá muitas coisas foram alteradas e várias restrições adicionadas na manipulação do sigapss.spf.

    Sugestão: Entre em contato com o suporte da totvs.

    []s

    ResponderExcluir
  17. Naldo.
    Obrigado por responder. Solicitei apoio junto a Totvs e a mesma não tem nenhuma documentação. Não sugere manipular o arquivo.

    Ainda assim acredito que é possível. Porem como você disse. Muita coisa mudou. Preciso descobrir o que.
    Para tratar o problema acima.

    Anônimo(Anderson)

    Abraços,

    ResponderExcluir
  18. Estou com a versão 10

    ResponderExcluir
  19. Naldo, conforme o Tiago Ribeiro comentou,
    se jogar tudo pra dentro de uma Static Function está funcionando tudo perfeitamente...

    ResponderExcluir
  20. Rsrs, Tiago Bandeira, não Ribeiro...

    ResponderExcluir
  21. Naldo boa tarde!

    Aproveitando o tópico, sabe dizer se existe um procedimento para migrar os dados contidos em um sigapss antigo para um criado em branco?
    Só pra voce entender, existem uma funcioalidade no portal do rh que só funciona quando deleto o arquivo sigapss e deixo o sistema criar em branco, ou seja, se eu quiser utilizar terei que recadastrar todas as senhas na mão no novo arquivo, o que é praticamente inviável devido a quantidade.

    Se souber de algum procedimento por favor me fale.

    abraços

    ResponderExcluir
  22. Bom dia,

    Utilizei o exemplo acima no Protheus 10 e funcionou. Porém, ao utilizar o mesmo exemplo no Protheus 11, não funcionou, para ser mais exato, o problema ocorre na função spf_seek que só retorna -1. Será que a Totvs descontinuou esta função no Protheus 11?

    Atenciosamente,
    Flavio Valentin

    ResponderExcluir
  23. Bom dia,

    Utilizei o exemplo acima no Protheus 10 e funcionou. Porém, ao utilizar o mesmo exemplo no Protheus 11, não funcionou, para ser mais exato, o problema ocorre na função spf_seek que só retorna -1. Será que a Totvs descontinuou esta função no Protheus 11?

    Atenciosamente,
    Flavio Valentin

    ResponderExcluir
  24. Bom dia,

    ainda nao ha uma descriçao para utilizar a funçao allusers() e saver qual é o dado de cada posiçao do array?

    Muito obrigado.

    Atenciosamente,


    Sergio

    ResponderExcluir
  25. Bom dia,

    ainda nao ha uma descriçao para utilizar a funçao allusers() na versao Protheus11 e saver qual é o dado de cada posiçao do array?

    Muito obrigado.

    Atenciosamente,


    Sergio

    ResponderExcluir
  26. Pessoal, alguem conseguiu resolver o sigapss.spf no protheus 11?

    att

    Celso Martins

    ResponderExcluir
  27. No Configurador do Protheus 11 é possivel configurar uma validação de senhas, quando o usuario for trocar a senha de acesso ao Protheus. Em Regras de Senhas -> Regras de Preenchimento. Lá é possivel configurar o tamanho da senha, se é obrigatório ter numeros e letras, etc. (rotina CFGA500).
    Gostaria de usar essa mesma validação para acesso ao RH On Line, ou seja, quando o funcionário for alterar a senha de acesso, a rotina deve criticar a senha digitada, baseada na Regra de Senhas do Configurador.
    Naldo, isso é possivel ?

    ResponderExcluir
    Respostas
    1. Grande "pequeno" amigo Isamu. O "RH OnLine" permite várias personalizações, inclusive no que diz respeito a validações de senhas. Será que a rotina CFGA500 está disponível para uso que não seja apenas pena CFGA500, se sim, a resposta é: Sim é possível. Caso contrário, mesmo que CFGA500 não esteja disponível para uso "externo" a forma de validação e configuração de senha no RH OnLine é passível de validação e de acordo com customização do "usuário". Isso foi previsto para toda e qualquer rotina do RH OnLine.

      PS.: A não ser que os novos implementadores e mantenedores das "rotinas/programas" do RH OnLine tenham modificado o conceito, é fácil customizar, alterar e manter, ao gosto do cliente.

      Att.:
      иαldσ dj

      Excluir
  28. Boa tarde Naldo!

    Sabe se é possivel varrer todos os usuários em um laço para realizar a alteração de um campo?

    No caso seria o e-mail do usuario está em branco e necessitarmos adicionar todos, como os usuarios são iguais ao e-mail era so realizar esse update concatenando com @email

    Agradeço desde já.

    ResponderExcluir