Commit 62a5ec43 authored by Renato Figueiro Maia's avatar Renato Figueiro Maia
Browse files

[OPENBUS-2304] (Lua) Permitir fazer chamadas dentro de cadeias (join)...

[OPENBUS-2304] (Lua) Permitir fazer chamadas dentro de cadeias (join) recebidas com um login diferente, mas da mesma entidade

- Desfazendo alterações do commit r142237 e aplicando novas alterações (sugestão do Cassino):
  - Campo 'CallChain.target' passa a conter o 'EntityName' ao invés do 'LoginId'.
  - A operação 'AccessControl:signChainFor(target)' passa a verificar o login indicado pelo parâmetro 'target' colocando a entidade correspondente no valor no campo 'CallChain.target' da cadeia gerada.
    - Caso o login informado no parâmetro 'target' seja inválido (desconhecido) então essa operação lança a exceção 'InvalidLogins' informando o login inválido.
      - Quando a operação 'AccessControl:signChainFor(target)' chamada pela biblioteca de acesso (OpenBusLib) lança a exceção 'InvalidLogins', essa deve ser capturada e traduzida para uma exceção 'CORBA::NO_PERMISSION' com um novo minor code 'InvalidTargetCode'.

- Correção de bug devido ao cache de 'profile2login' da biblioteca de acesso (Lua) a ser mantida por ORB ao invés de pra cada conexão.



git-svn-id: https://subversion.tecgraf.puc-rio.br/engdist/openbus/core/branches/02_00_00@142520 ae0415b3-e90b-0410-900d-d0be9363c56b
parent 8238b175
......@@ -439,7 +439,7 @@ Ou seja,
Nesse sentido, para gerar uma cadeia nova que não seja uma extensão de outra cadeia previamente recebida, é necessário enviar uma cadeia nula na credencial da chamada de \code{signChainFor}, o que está em conformidade com a regra para geração de cadeias para o barramento, uma vez que a operação \code{signChainFor} é do barramento.
Como resultado da operação \code{signChainFor} é devolvida uma nova cadeia em que o campo \code{CallChain::caller} da cadeia original será adicionado à sequência do campo \code{CallChain::originators} e o campo \code{CallChain::caller} conterá informações do login de quem chamou a operação \code{signChainFor}.
Adicionalmente, o campo \code{CallChain::target} conterá o nome da entidade fornecido pelo parâmetro \code{target} da chamada de \code{signChainFor}.
Adicionalmente, o campo \code{CallChain::target} conterá o nome da entidade do identificador de login fornecido pelo parâmetro \code{target} da chamada de \code{signChainFor}.
Note que dessa forma é possível se adicionar a cadeias recebidas (processo denominado \term{join}), assim como gerar tais cadeias para quaisquer destinos para o qual seja necessário enviar credenciais.
......
......@@ -62,11 +62,10 @@ function BusInterceptor:__init()
retrieve = function(target)
local originators = { unpack(chain.originators) }
originators[#originators+1] = chain.caller
return self.AccessControl:encodeChain{
target = target,
return self.AccessControl:encodeChain({
originators = originators,
caller = self.login,
}
}, target)
end,
}
end, "k")
......@@ -127,7 +126,7 @@ function BusInterceptor:unmarshalCredential(...)
chain.caller = caller
local target = chain.target
if target ~= caller.entity then
chain.caller = {id="<unknown>",entity=target}
chain.caller = {id="<unknown>",entity=target} -- raises "InvalidChain"
end
chain.target = self.login.entity
end
......@@ -146,7 +145,7 @@ function BusInterceptor:receiverequest(request)
or op:find("_[gs]et_", 1) == 1 then -- not CORBA obj op
receiveBusRequest(self, request)
if request.success == nil then
local granted = self.context.grantedUsers[request.interface.repID][op]
local granted = self.grantedUsers[request.interface.repID][op]
local chain = self:getCallerChain()
if chain ~= nil then
local login = chain.caller
......
......@@ -172,7 +172,7 @@ end
local LoginRegistry -- forward declaration
local AccessControl = {
login = {id=nil, entity=idl.const.BusEntity},
login = {id=idl.const.BusLogin, entity=idl.const.BusEntity},
pendingChallenges = {}
}
......@@ -199,7 +199,6 @@ function AccessControl:__init(data)
-- initialize access
self.busid = busid
self.login.id = busid
local access = self.access
local encodedkey = assert(access.prvkey:encode("public"))
self.buskey = encodedkey
......@@ -275,7 +274,10 @@ function AccessControl:getLoginEntry(id)
return self.activeLogins:getLogin(id)
end
function AccessControl:encodeChain(chain)
function AccessControl:encodeChain(chain, target)
local login = self.activeLogins:getLogin(target)
if login == nil then throw.InvalidLogins{ loginIds = {target} } end
chain.target = login.entity
local access = self.access
local encoder = access.orb:newencoder()
encoder:put(chain, access.types.CallChain)
......@@ -377,9 +379,7 @@ function AccessControl:renew()
end
function AccessControl:signChainFor(target)
local chain = self.access:getCallerChain()
chain.target = target
return self:encodeChain(chain)
return self:encodeChain(self.access:getCallerChain(), target)
end
------------------------------------------------------------------------------
......
......@@ -15,6 +15,7 @@ local decodeprvkey = pubkey.decodeprivate
local idl = require "openbus.core.idl"
local loadIDL = idl.loadto
local BusLogin = idl.const.BusLogin
local EncryptedBlockSize = idl.const.EncryptedBlockSize
local CredentialContextId = idl.const.credential.CredentialContextId
local loginconst = idl.const.services.access_control
......@@ -149,7 +150,7 @@ do -- login successfull
assert(validid(login.id))
assert(login.entity == system)
assert(lease > 0)
logoutid = login.id -- this login will be invalidated by a logout
syslogin = login.id -- this login will be invalidated by a logout
end
do -- cancel login attempt
......@@ -158,6 +159,33 @@ do -- cancel login attempt
assert(attempt:_non_existent())
end
-- credentials -----------------------------------------------------------------
do
validlogin.prvkey = prvkey
validlogin.busSession = initBusSession(bus, validlogin)
local function greaterthanzero(value) assert(value > 0) end
testBusCall(bus, validlogin, otherkey, greaterthanzero, bus.AccessControl, "renew")
end
-- chain signature 1 -----------------------------------------------------------
do -- join chain targeted for other login
validlogin.busSession:newCred("signChainFor")
signed = ac:signChainFor(syslogin)
local chain = decodeChain(bus.key, signed)
assert(chain.target == system)
assert(chain.caller.id == validlogin.id)
assert(chain.caller.entity == user)
validlogin.busSession:newCred("signChainFor", signed)
local ok, ex = pcall(ac.signChainFor, ac, validlogin.id)
assert(ok == false)
assert(ex._repid == "IDL:omg.org/CORBA/NO_PERMISSION:1.0")
assert(ex.completed == "COMPLETED_NO")
assert(ex.minor == loginconst.InvalidChainCode)
end
-- logout ----------------------------------------------------------------------
do -- logout
......@@ -165,7 +193,7 @@ do -- logout
local credential = {
opname = "logout",
bus = bus.id,
login = logoutid,
login = syslogin,
session = 0,
ticket = 0,
secret = "",
......@@ -197,33 +225,14 @@ do -- logout
assert(ex.minor == loginconst.InvalidLoginCode)
end
-- credentials -----------------------------------------------------------------
do
validlogin.prvkey = prvkey
validlogin.busSession = initBusSession(bus, validlogin)
local function greaterthanzero(value) assert(value > 0) end
testBusCall(bus, validlogin, otherkey, greaterthanzero, bus.AccessControl, "renew")
end
-- chain signature -------------------------------------------------------------
-- chain signature 2 -----------------------------------------------------------
do -- sign chain for an invalid entity
do -- sign chain for an invalid login
validlogin.busSession:newCred("signChainFor")
signed = ac:signChainFor("invalid")
local chain = decodeChain(bus.key, signed)
assert(chain.target == "invalid")
assert(chain.caller.id == validlogin.id)
assert(chain.caller.entity == user)
end
do -- join chain targeted for other entity (an invalid one)
validlogin.busSession:newCred("signChainFor", signed)
local ok, ex = pcall(ac.signChainFor, ac, "invalid")
local ok, ex = pcall(ac.signChainFor, ac, syslogin)
assert(ok == false)
assert(ex._repid == "IDL:omg.org/CORBA/NO_PERMISSION:1.0")
assert(ex.completed == "COMPLETED_NO")
assert(ex.minor == loginconst.InvalidChainCode)
assert(ex._repid == logintypes.InvalidLogins)
assert(ex.loginIds[1] == syslogin)
end
-- login lease -----------------------------------------------------------------
......
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