Commit d28a65a3 authored by Renato Figueiro Maia's avatar Renato Figueiro Maia
Browse files

[OPENBUS-2545] (Lua) Incluir funcionalidade de construção de cadeia a partir...

[OPENBUS-2545] (Lua) Incluir funcionalidade de construção de cadeia a partir de prova externa ao OpenBus no núcleo
- Alteração na API do validador de tokens para permitir criar cadeias com login IDs distintos.



git-svn-id: https://subversion.tecgraf.puc-rio.br/engdist/openbus/core/trunk@165927 ae0415b3-e90b-0410-900d-d0be9363c56b
parent 9454bb97
......@@ -232,15 +232,19 @@ ldap_timeout = 10
\end{verbatim}
\end{description}
\subsection{Validadores de autenticação externa}\label{subsec:valtoken}
Um validador de autenticação externa deve ser implementado segundo as mesmas regras de um validador de senha, descrito na seção ~\ref{subsec:valsenha}. A única diferença é que a função \texttt{validator} recebe como parâmetro o identificador de login, o nome da entidade e o token a ser validado.
Um validador de autenticação externa é implementado de forma similar a um validador de senha, descrito na seção ~\ref{subsec:valsenha}. Contudo, a função \texttt{validator} do validador de autenticação externa recebe os seguintes parâmetros:
\begin{itemize}
\item Uma string contendo o identificador de login.
\item Uma string contendo o nome da entidade
\item Uma string contendo o token a ser validado.
\item Um objeto a ser usado para construção da cadeia.
Esse objeto apresenta o método \texttt{push} que recebe como parâmetro um nome de entidade a ser adicionado na cadeia.
O método devolve como valor de retorno o login ID que essa entidade assume na cadeia sendo criada.
\end{itemize}
O validador deve utilizar algum serviço externo para validar o token recebido e retornar verdadeiro ou falso de acordo com o sucesso ou falha da operação.
\section{O executável \emph{busservices}}\label{sec:busservices}
O barramento e os serviços núcleo são distribuídos em um mesmo programa, o \emph{busservices}. Logo, para disparar o barramento, basta executar o programa passando as suas configurações por linha de comando ou por arquivo de configuração.
......
......@@ -481,6 +481,13 @@ function AccessControl:signChainFor(target)
return self:encodeChain(self.access:getCallerChain(), target)
end
local ImportedChain = class()
function ImportedChain:push(entity)
local id = newid("time")
self[#self+1] = {id=id, entity=entity}
return id
end
function AccessControl:signChainByToken(encrypted, domain)
local access = self.access
local caller = access:getCallerChain().caller
......@@ -491,18 +498,22 @@ function AccessControl:signChainByToken(encrypted, domain)
end
local validator = self.tokenValidators[domain]
if validator ~= nil then
local entities, errmsg = validator.validate(caller.id, caller.entity, decrypted)
if entities then
local count = #entities
local originators = {}
for i = 1, count-1 do
originators[i] = {id="<unknown>",entity=entities[i]}
local imported = ImportedChain()
local ok, errmsg = validator.validate(caller.id, caller.entity, decrypted, imported)
if ok then
local count = #imported
if count > 0 then
local last = imported[count]
imported[count] = nil
local chain = {
originators = imported,
caller = last,
}
return self:encodeChain(chain, caller.entity)
end
local chain = {
originators = originators,
caller = {id="<unknown>",entity=entities[count]}
ServiceFailure{
message = msg.ImportedChainWasEmpty:tag{ validator = validator.name },
}
return self:encodeChain(chain, caller.entity)
elseif errmsg ~= nil then
log:exception(msg.FailedTokenValidation:tag{
validator = validator.name,
......
return function (configs)
return function (login, entity, token)
return function (login, entity, token, imported)
local tokenentity, tokenlogin, originators = string.match(token, "^([^@]+)@([^:]+):(.-)$")
if tokenentity == entity and tokenlogin == login then
local entities = {}
for entity in string.gmatch(originators, "([^, ]+)") do
entities[#entities+1] = entity
imported:push(entity)
end
return entities
return true
end
return nil, "malformed test token"
end
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment