Commit 55758d5a authored by Rodrigo Carneiro Henrique's avatar Rodrigo Carneiro Henrique
Browse files

Refatoração da biblioteca Java.

As alterações foram baseadas nas impressões obtidas pelo primeiro cliente da biblioteca: o Servidor de Arquivos da BIEP.


git-svn-id: https://subversion.tecgraf.puc-rio.br/engdist/openbus/trunk@84529 ae0415b3-e90b-0410-900d-d0be9363c56b
parent 95648d14
/*
* $Id$
*/
package openbus;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashSet;
import java.util.Set;
import openbus.common.LeaseExpiredCallback;
import openbus.common.LeaseRenewer;
import openbus.common.Utils;
import openbus.common.exception.ACSUnavailableException;
import openbus.exception.CORBAException;
import openbus.exception.InvalidCredentialException;
import openbus.exception.PKIException;
import openbusidl.acs.Credential;
import openbusidl.acs.CredentialHolder;
import openbusidl.acs.IAccessControlService;
import openbusidl.rs.IRegistryService;
import org.omg.CORBA.IntHolder;
import org.omg.CORBA.NO_PERMISSION;
import org.omg.CORBA.SystemException;
/**
* Encapsula o Servio de Controle de Acesso.
*
* @author Tecgraf/PUC-Rio
*/
public final class AccessControlServiceWrapper {
/**
* O Servio de Controle de Acesso real, encapsulado por este objeto.
*/
private IAccessControlService acs;
/**
* O Servio de Registro.
*/
private RegistryServiceWrapper rs;
/**
* O renovador do <i>lease</i>.
*/
private LeaseRenewer leaseRenewer;
/**
* <i>Callback</i> para a notificao de que um <i>lease</i> expirou.
*/
private LeaseExpiredCallbackImpl leaseExpiredCallback;
/**
* Cria um objeto que encapsula o Servio de Controle de Acesso.
*
* @param orb O orb utilizado para obter o servio.
* @param host A mquina onde o servio est localizado.
* @param port A porta onde o servio est disponvel.
*
* @throws ACSUnavailableException Caso o servio no seja encontrado.
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
*/
public AccessControlServiceWrapper(ORBWrapper orb, String host, int port)
throws ACSUnavailableException, CORBAException {
this.acs = Utils.fetchAccessControlService(orb, host, port);
this.rs = new RegistryServiceWrapper();
this.leaseExpiredCallback = new LeaseExpiredCallbackImpl();
}
/**
* Autentica uma entidade a partir de um nome de usurio e senha.
*
* @param name O nome do usurio.
* @param password A senha do usurio.
*
* @return {@code true} caso a entidade seja autenticada, ou {@code false},
* caso contrrio.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
*/
public boolean loginByPassword(String name, String password)
throws CORBAException {
CredentialHolder aCredential = new CredentialHolder();
boolean result;
try {
result = this.acs.loginByPassword(name, password, aCredential,
new IntHolder());
}
catch (SystemException e) {
throw new CORBAException(e);
}
if (result) {
Registry.getInstance().setCredential(aCredential.value);
this.leaseRenewer = new LeaseRenewer(aCredential.value, this.acs,
this.leaseExpiredCallback);
this.leaseRenewer.start();
return true;
}
return false;
}
/**
* Autentica uma entidade a partir de um certificado digital.
*
* @param name O nome da entidade.
* @param privateKey A chave privada da entidade.
* @param acsCertificate O certificado digital do Servio de Controle de
* Acesso.
*
* @return {@code true} caso a entidade seja autenticada, ou {@code false},
* caso contrrio.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
* @throws PKIException
*/
public boolean loginByCertificate(String name, RSAPrivateKey privateKey,
X509Certificate acsCertificate) throws CORBAException, PKIException {
byte[] challenge;
try {
challenge = this.acs.getChallenge(name);
if (challenge.length == 0) {
return false;
}
}
catch (SystemException e) {
throw new CORBAException(e);
}
byte[] answer;
try {
answer = Utils.generateAnswer(challenge, privateKey, acsCertificate);
}
catch (GeneralSecurityException e) {
throw new PKIException(e);
}
CredentialHolder aCredential = new CredentialHolder();
boolean result;
try {
result = this.acs.loginByCertificate(name, answer, aCredential,
new IntHolder());
}
catch (SystemException e) {
throw new CORBAException(e);
}
if (result) {
Registry.getInstance().setCredential(aCredential.value);
this.leaseRenewer = new LeaseRenewer(aCredential.value, this.acs,
this.leaseExpiredCallback);
this.leaseRenewer.start();
return true;
}
return false;
}
/**
* Autentica uma entidade a partir de uma credencial.
*
* @param credential A credencial.
*
* @return {@code true} caso a entidade seja autenticada, ou {@code false},
* caso contrrio.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
*/
public boolean loginByCredential(Credential credential) throws CORBAException {
Registry registry = Registry.getInstance();
registry.setCredential(credential);
return this.isValid(credential);
}
/**
* Desconecta a entidade em relao ao Servio.
*
* @return {@code true}, caso a entidade seja desconectada, ou {@code false},
* caso contrrio.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
*/
public boolean logout() throws CORBAException {
Registry registry = Registry.getInstance();
Credential credential = registry.getCredential();
this.leaseRenewer.finish();
this.leaseRenewer = null;
try {
boolean result = this.acs.logout(credential);
registry.setCredential(null);
return result;
}
catch (SystemException e) {
throw new CORBAException(e);
}
}
/**
* Obtm o Servio de Registro.
*
* @return O Servio de Registro, ou {@code null}, caso o Servio no esteja
* disponvel.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
* @throws InvalidCredentialException Indica que a credencial da entidade no
* mais vlida.
*/
public RegistryServiceWrapper getRegistryService() throws CORBAException,
InvalidCredentialException {
try {
IRegistryService registryService = this.acs.getRegistryService();
if (registryService == null) {
return null;
}
this.rs.setRS(registryService);
return this.rs;
}
catch (NO_PERMISSION e) {
throw new InvalidCredentialException(e);
}
catch (SystemException e) {
throw new CORBAException(e);
}
}
/**
* Obtm a credencial da entidade.
*
* @return A credencial da entidade.
*/
public Credential getCredential() {
return Registry.getInstance().getCredential();
}
/**
* Verifica se uma determinada credencial vlida.
*
* @param credential A credencial.
*
* @return {@code true} caso a credencial seja vlida, ou {@code false}, caso
* contrrio.
*
* @throws CORBAException Caso ocorra alguma exceo na infra-estrutura CORBA.
*/
public boolean isValid(Credential credential) throws CORBAException {
try {
return this.acs.isValid(credential);
}
catch (SystemException e) {
throw new CORBAException(e);
}
}
/**
* Adiciona um observador para receber eventos de expirao do <i>lease</i>.
*
* @param lec O observador.
*
* @return {@code true}, caso o observador seja adicionado, ou {@code false},
* caso contrrio.
*/
public boolean addLeaseExpiredCallback(LeaseExpiredCallback lec) {
return this.leaseExpiredCallback.addLeaseExpiredCallback(lec);
}
/**
* Remove um observador de expirao do <i>lease</i>.
*
* @param lec O observador.
*
* @return {@code true}, caso o observador seja removido, ou {@code false},
* caso contrrio.
*/
public boolean removeLeaseExpiredCallback(LeaseExpiredCallback lec) {
return this.leaseExpiredCallback.removeLeaseExpiredCallback(lec);
}
/**
* Implementa uma <i>callback</i> para a notificao de que um <i>lease</i>
* expirou.
*
* @author Tecgraf/PUC-Rio
*/
private static class LeaseExpiredCallbackImpl implements LeaseExpiredCallback {
/**
* Observadores da expirao do <i>lease</i>.
*/
private Set<LeaseExpiredCallback> callbacks;
/**
* Cria a <i>callback</i>.
*/
LeaseExpiredCallbackImpl() {
this.callbacks = new HashSet<LeaseExpiredCallback>();
}
/**
* {@inheritDoc}
*/
@Override
public void expired() {
for (LeaseExpiredCallback lec : this.callbacks) {
lec.expired();
}
}
/**
* Adiciona um observador para receber eventos de expirao do <i>lease</i>.
*
* @param lec O observador.
*
* @return {@code true}, caso o observador seja adicionado, ou
* {@code false}, caso contrrio.
*/
boolean addLeaseExpiredCallback(LeaseExpiredCallback lec) {
return this.callbacks.add(lec);
}
/**
* Remove um observador de expirao do <i>lease</i>.
*
* @param lec O observador.
*
* @return {@code true}, caso o observador seja removido, ou {@code false},
* caso contrrio.
*/
boolean removeLeaseExpiredCallback(LeaseExpiredCallback lec) {
return this.callbacks.remove(lec);
}
}
}
/*
* $Id$
*/
package openbus;
import openbusidl.acs.Credential;
import scs.core.ComponentId;
/**
* Representa objetos inválidos, usados para indicar erros, de alguns tipos
* definidos na IDL.
*
* @author Tecgraf/PUC-Rio
*/
public final class InvalidTypes {
/**
* Representa um identificador de componente inválido.
*/
public static final ComponentId COMPONENT_ID = new ComponentId("", -1);
/**
* Representa uma credencial inválida.
*/
public static final Credential CREDENTIAL = new Credential("", "");
}
/*
* $Id$
*/
package openbus;
import java.util.Properties;
import openbus.common.interceptors.ClientInitializer;
import openbus.common.interceptors.ServerInitializer;
import org.omg.CORBA.UserException;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManager;
/**
* Encapsula um ORB que deve ser usado para acesso ao OpenBus.
*
* @author Tecgraf/PUC-Rio
*/
public final class ORBWrapper {
/**
* O prefixo do nome da propriedade do(s) inicializador(es) do ORB.
*/
private static final String ORB_INITIALIZER_PROPERTY_NAME_PREFIX = "org.omg.PortableInterceptor.ORBInitializerClass.";
/**
* O ORB real, encapsulado por este objeto.
*/
private org.omg.CORBA.ORB orb;
/**
* O RootPOA.
*/
private POA rootPOA;
/**
* Cria um objeto que encapsula um ORB.
*/
public ORBWrapper() {
this(new Properties());
}
/**
* Cria um objeto que encapsula um ORB.
*
* @param properties As propriedades para a criao do ORB real.
*/
public ORBWrapper(Properties properties) {
Properties props = new Properties(properties);
String clientInitializerClassName = ClientInitializer.class.getName();
props.put(
ORB_INITIALIZER_PROPERTY_NAME_PREFIX + clientInitializerClassName,
clientInitializerClassName);
String serverInitializerClassName = ServerInitializer.class.getName();
props.put(
ORB_INITIALIZER_PROPERTY_NAME_PREFIX + serverInitializerClassName,
serverInitializerClassName);
this.orb = org.omg.CORBA.ORB.init((String[]) null, props);
}
/**
* Obtm o ORB real.
*
* @return O ORB real.
*/
public org.omg.CORBA.ORB getORB() {
return this.orb;
}
/**
* Obtm o RootPOA.
*
* <p>
* OBS: A chamada a este mtodo ativa o POAManager.
*
* @return O RootPOA.
*
* @throws UserException Caso ocorra algum erro ao obter o RootPOA.
*/
public POA getRootPOA() throws UserException {
if (this.rootPOA == null) {
org.omg.CORBA.Object obj = this.orb.resolve_initial_references("RootPOA");
this.rootPOA = POAHelper.narrow(obj);
POAManager manager = this.rootPOA.the_POAManager();
manager.activate();
}
return this.rootPOA;
}
/**
* Executa o ORB.
*/
public void run() {
this.orb.run();
}
/**
* Finaliza a execuo do ORB.
*/
public void finish() {
this.orb.shutdown(true);
this.orb.destroy();
}
}
/*
* $Id$
*/
package openbus;
import openbus.common.Log;
import openbusidl.acs.Credential;
import openbusidl.acs.CredentialHelper;
import openbusidl.ss.ISession;
import org.omg.CORBA.Any;
import org.omg.CORBA.TCKind;
import org.omg.PortableInterceptor.Current;
import org.omg.PortableInterceptor.CurrentHelper;
import org.omg.PortableServer.POA;
/**
* Oferece um registro onde ficam armazenados os objetos de uso geral para o
* acesso ao barramento e infra-estrutura CORBA.
*
* @author Tecgraf/PUC-Rio
*/
public final class Registry {
/**
* A instncia nica do registro.
*/
private static Registry instance;
/**
* O ORB.
*/
private ORBWrapper orbWrapper;
/**
* O POA.
*/
private POA poa;
/**
* O Servio de Controle de Acesso.
*/
private AccessControlServiceWrapper acs;
/**
* A credencial da entidade.
*/
private Credential credential;
/**
* A credencial da enteidade, vlida apenas na <i>thread</i> corrente.
*/
private ThreadLocal<Credential> threadLocalCredential;
/**
* O slot da credencial da requisio.
*/
private int requestCredentialSlot;
/**
* A sesso da entidade.
*/
private ISession session;
/**
* Obtm a instncia nica do registro.
*
* @return A instncia nica do registro.
*/
public static Registry getInstance() {
if (instance == null) {
instance = new Registry();
}
return instance;
}
/**
* Cria o registro.
*/
private Registry() {
this.threadLocalCredential = new ThreadLocal<Credential>();
}
/**
* Define o ORB.
*
* @param orbWrapper O ORB.
*/
public void setORBWrapper(ORBWrapper orbWrapper) {
this.orbWrapper = orbWrapper;
}
/**
* Obtm o ORB.
*
* @return O ORB.
*/
public ORBWrapper getORBWrapper() {
return this.orbWrapper;
}
/**
* Define o POA.
*
* @param poa O POA.
*/
public void setPOA(POA poa) {
this.poa = poa;
}
/**
* Obtm o POA.
*
* @return O POA.
*/
public POA getPOA() {
return this.poa;
}
/**
* Define o Servio de Controle de Acesso.
*
* @param acs O Servio de Controle de Acesso.
*/
public void setACS(AccessControlServiceWrapper acs) {
this.acs = acs;
}
/**
* Obtm o Servio de Controle de Acesso.
*
* @return the acs
*/
public AccessControlServiceWrapper getACS() {
return this.acs;
}
/**
* Define a credencial da entidade.
*
* @param credential A credencial.
*/
void setCredential(Credential credential) {
this.credential = credential;
}
/**
* Obtm a credencial da entidade.
*
* @return A credencial.
*/
public Credential getCredential() {
Credential threadCredential = this.threadLocalCredential.get();
if (threadCredential != null) {
return threadCredential;