Commit 031df250 by Antti Tönkyrä

Add logincontext to localcontextholder

1 parent 81b321b0
......@@ -3,6 +3,9 @@ package fi.insomnia.bortal.clientutils;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -15,6 +18,8 @@ public class BortalLocalContextHolder {
private String hostname;
private boolean ssl = false;
private Integer hostnameId;
private LoginContext loginContext;
private final Map<IAppPermission, Boolean> rightcache = new HashMap<IAppPermission, Boolean>();
......@@ -30,6 +35,7 @@ public class BortalLocalContextHolder {
super();
this.hostname = old.hostname;
this.ssl = old.ssl;
this.loginContext = old.loginContext;
}
public static void setHostname(String hostname) {
......@@ -111,4 +117,31 @@ public class BortalLocalContextHolder {
}
THREAD_WITH_CONTEXT.set(new BortalLocalContextHolder(contextHolder));
}
public void setLoginContext(LoginContext loginContext) {
this.loginContext = loginContext;
}
public LoginContext getLoginContext() {
return loginContext;
}
public boolean executeLogin() {
try {
this.loginContext.login();
System.err.println("execute login");
return true;
} catch (LoginException e) {
return false;
}
}
public void executeLogout() {
try {
this.loginContext.logout();
System.err.println("execute logout");
} catch(Exception e) {
}
}
}
\ No newline at end of file
......@@ -6,6 +6,10 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.HashMap;
import javax.annotation.PostConstruct;
import javax.security.auth.login.LoginException;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.Environment;
......@@ -14,20 +18,29 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.cmdline.Hello;
import fi.insomnia.bortal.cmdline.ICommandlineCommand;
public class BortalCommand implements Command, Runnable {
private static Logger logger = LoggerFactory.getLogger(BortalCommand.class);
private OutputStream errstream;
private OutputStreamWriter errstream;
private ExitCallback exitCallback;
private InputStreamReader instream;
private OutputStreamWriter outstream;
private BortalLocalContextHolder contextHolder;
private Charset UTF8 = Charset.forName("UTF-8");
private HashMap<String, ICommandlineCommand> commandMap = new HashMap<String, ICommandlineCommand>();
public BortalCommand(BortalLocalContextHolder context) {
contextHolder = context;
}
public BortalCommand addCommandlineCommand(String name, ICommandlineCommand c) {
this.commandMap.put(name, c);
return this;
}
@Override
public void setInputStream(InputStream in) {
......@@ -42,7 +55,7 @@ public class BortalCommand implements Command, Runnable {
@Override
public void setErrorStream(OutputStream err) {
errstream = err;
errstream = new OutputStreamWriter(err, UTF8);
}
@Override
......@@ -59,16 +72,20 @@ public class BortalCommand implements Command, Runnable {
@Override
public void destroy() {
logger.info("destroying ssh command");
}
@Override
public void run() {
BortalLocalContextHolder.copy(contextHolder);
BortalLocalContextHolder.getInstance().executeLogin();
try {
logger.info("Created new bortalCommane");
outstream.write("Hello you...");
StringBuilder cmdBuilder = new StringBuilder();
// prime 0 return value
int returnValue = 0;
while (true) {
if (!instream.ready()) {
......@@ -78,9 +95,12 @@ public class BortalCommand implements Command, Runnable {
if (inchar == '\n' || inchar == '\r')
{
outstream.write("\r\n# ");
outstream.write("\r\n");
outstream.flush();
returnValue = parseCommand(cmdBuilder.toString());
outstream.write("[" + returnValue + "] " + BortalLocalContextHolder.getInstance().loginContext.getSubject().getPrincipals().iterator().next().getName() + " # ");
outstream.flush();
parseCommand(cmdBuilder.toString());
cmdBuilder = new StringBuilder();
......@@ -99,14 +119,33 @@ public class BortalCommand implements Command, Runnable {
// TODO Auto-generated catch block
e.printStackTrace();
}
BortalLocalContextHolder.getInstance().executeLogout();
exitCallback.onExit(3);
}
private void parseCommand(String string) {
if (string != null && !string.isEmpty())
{
logger.info("received command {}", string);
private int parseCommand(String args) {
String[] argv = null;
if(args != null) {
if(args.length() == 0) return 0;
argv = args.split(" ");
}
if(argv != null && argv.length > 0) {
logger.info("received command {}", argv[0]);
ICommandlineCommand cmd;
if((cmd = this.commandMap.get(argv[0])) != null) {
return cmd.execute(argv,this.instream, this.outstream, this.errstream);
} else {
try {
this.errstream.write("unknown command\r\n");
this.errstream.flush();
} catch(IOException ioe) {}
return -1;
}
} else {
return 0;
}
}
}
......@@ -64,6 +64,8 @@ public class BortalPasswordAuthenticator implements PasswordAuthenticator {
}
});
loginContext.login();
context.setLoginContext(loginContext);
// loginContext.logout();
return true;
} catch (Exception e) {
......
......@@ -6,6 +6,7 @@ import java.util.Map;
import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.security.auth.login.LoginException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
......@@ -22,7 +23,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.cmdline.Hello;
import fi.insomnia.bortal.model.LanEvent;
/**
......@@ -38,6 +41,8 @@ public class SshServlet extends HttpServlet {
@EJB
private EventBeanLocal eventbean;
@EJB private PermissionBeanLocal permBean;
/**
* @see HttpServlet#HttpServlet()
......@@ -58,8 +63,12 @@ public class SshServlet extends HttpServlet {
@Override
public Command create() {
logger.info("creating new bortal command");
return new BortalCommand(context);
BortalCommand bc = new BortalCommand(context);
bc
.addCommandlineCommand("hello", new Hello(permBean))
.addCommandlineCommand("hallo", new Hello(permBean));
return bc;
}
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!