package org.apache.kerberos.kerb.server;
import org.apache.haox.event.EventHub;
import org.apache.kerberos.kerb.common.KrbStreamingDecoder;
import org.apache.kerberos.kerb.identity.IdentityService;
import org.apache.haox.transport.Acceptor;
import org.apache.haox.transport.tcp.TcpAcceptor;
import java.io.File;
public class KdcServer {
private String kdcHost;
private short kdcPort;
private String kdcRealm;
private boolean started;
private String serviceName = "HaoxKdc";
private KdcHandler kdcHandler;
private EventHub eventHub;
protected KdcConfig kdcConfig;
protected IdentityService identityService;
protected File workDir;
public KdcServer() {
kdcConfig = new KdcConfig();
}
public void init() {
initConfig();
initWorkDir();
}
protected void initWorkDir() {
String path = kdcConfig.getWorkDir();
File file;
if (path != null) {
file = new File(path);
file.mkdirs();
} else {
file = new File(".");
}
this.workDir = file;
}
protected void initConfig() {}
public void start() {
try {
doStart();
} catch (Exception e) {
throw new RuntimeException("Failed to start " + getServiceName(), e);
}
started = true;
}
public String getKdcRealm() {
if (kdcRealm != null) {
return kdcRealm;
}
return kdcConfig.getKdcRealm();
}
private String getKdcHost() {
if (kdcHost != null) {
return kdcHost;
}
return kdcConfig.getKdcHost();
}
private short getKdcPort() {
if (kdcPort > 0) {
return kdcPort;
}
return kdcConfig.getKdcPort();
}
public void setKdcHost(String kdcHost) {
this.kdcHost = kdcHost;
}
public void setKdcPort(short kdcPort) {
this.kdcPort = kdcPort;
}
public void setKdcRealm(String realm) {
this.kdcRealm = realm;
}
public boolean enableDebug() {
return kdcConfig.enableDebug();
}
protected void doStart() throws Exception {
prepareHandler();
this.eventHub = new EventHub();
eventHub.register(kdcHandler);
Acceptor acceptor = new TcpAcceptor(new KrbStreamingDecoder());
eventHub.register(acceptor);
eventHub.start();
acceptor.listen(getKdcHost(), getKdcPort());
}
private void prepareHandler() {
this.kdcHandler = new KdcHandler();
kdcHandler.setConfig(kdcConfig);
kdcHandler.setIdentityService(identityService);
if (kdcRealm != null) {
kdcHandler.setKdcRealm(kdcRealm);
}
kdcHandler.init();
}
public void stop() {
try {
doStop();
} catch (Exception e) {
throw new RuntimeException("Failed to stop " + getServiceName());
}
}
protected void doStop() throws Exception {
eventHub.stop();
}
public KdcConfig getConfig() {
return kdcConfig;
}
public boolean isStarted() {
return started;
}
protected void setStarted( boolean started ) {
this.started = started;
}
protected void setServiceName( String name ) {
this.serviceName = name;
}
protected String getServiceName() {
if (serviceName != null) {
return serviceName;
}
return kdcConfig.getKdcServiceName();
}
public IdentityService getIdentityService() {
return identityService;
}
protected void setIdentityService(IdentityService identityService) {
this.identityService = identityService;
}
}