package connector;
import org.glassfish.security.common.Group;
import org.glassfish.security.common.PrincipalImpl;
import javax.security.auth.Subject;
import javax.security.auth.message.callback.CallerPrincipalCallback;
import javax.security.auth.message.callback.PasswordValidationCallback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.resource.spi.work.SecurityContext;
import java.util.List;
import java.util.ArrayList;
import java.io.IOException;
public class MyPlainSecurityContext extends SecurityContext {
private String userName;
private String password;
private String principalName;
private Subject subject;
private boolean translationRequired;
public MyPlainSecurityContext(String userName, String password, String principalName, boolean translationRequired){
this.userName = userName;
this.password = password;
this.principalName = principalName;
this.translationRequired = translationRequired;
}
public void setupSecurityContext(CallbackHandler callbackHandler, Subject execSubject, Subject serviceSubject) {
////execSubject.getPublicCredentials().add(new Group("employee"));
//execSubject.getPublicCredentials().add(new PrincipalImpl(principalName));
execSubject.getPrincipals().add(new PrincipalImpl(principalName));
List<Callback> callbacks = new ArrayList<Callback>();
CallerPrincipalCallback cpc = new CallerPrincipalCallback(execSubject, new PrincipalImpl(principalName));
debug("setting caller principal callback with principal : " + principalName);
callbacks.add(cpc);
/*
PasswordValidationCallback pvc = null;
if(translationRequired){
pvc = new PasswordValidationCallback(execSubject, userName,
password.toCharArray());
debug("setting password validation callback with user [ " + userName + " ] + password [ " + password + " ]");
callbacks.add(pvc);
}
*/
addCallbackHandlers(callbacks, execSubject);
Callback callbackArray[] = new Callback[callbacks.size()];
try{
callbackHandler.handle(callbacks.toArray(callbackArray));
}catch(UnsupportedCallbackException e){
debug("exception occured : " + e.getMessage());
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
debug("exception occured : " + e.getMessage());
}
/* if(translationRequired){
if(!pvc.getResult()){
debug("Password validation callback failure for user : " + userName);
//throw new RuntimeException("Password validation callback failed for user " + userName);
//TODO need to throw exception later (once spec defines it) and fail setup security context
}else{
debug("Password validation callback succeded for user : " + userName);
}
}*/
}
protected void addCallbackHandlers(List<Callback> callbacks, Subject execSubject) {
//do nothing
//hook to test Dupilcate Inflow Context behavior
}
public String toString(){
StringBuffer toString = new StringBuffer("{");
toString.append("userName : " + userName);
toString.append(", password : " + password);
toString.append(", principalName : " + principalName);
toString.append("}");
return toString.toString();
}
public void debug(String message){
System.out.println("JSR-322 [RA] [MyPlainSecurityContext]: " + message);
}
}