package connector;
import org.glassfish.security.common.PrincipalImpl;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.Subject;
import javax.security.auth.message.callback.CallerPrincipalCallback;
import javax.resource.spi.work.SecurityContext;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
public class UnauthenticatedIdentityOptWorkContext extends SecurityContext {
private String userName;
private String password;
private String principalName;
private boolean translationRequired;
private Subject subject;
private boolean principal;
public UnauthenticatedIdentityOptWorkContext(boolean translationRequired, boolean principal, String principalName, String userName, String password) {
this.translationRequired = translationRequired;
this.principal = principal;
this.userName = userName;
this.password = password;
this.principalName = principalName;
}
public boolean isTranslationRequired() {
return translationRequired;
}
public void setupSecurityContext(CallbackHandler callbackHandler, Subject execSubject, Subject serviceSubject) {
List<Callback> callbacks = new ArrayList<Callback>();
//if (!translationRequired) {
if (principal) {
CallerPrincipalCallback cpc = null;
if(principalName != null){
cpc = new CallerPrincipalCallback(execSubject, new PrincipalImpl(principalName));
callbacks.add(cpc);
debug("setting caller principal callback with principal : " + principalName);
}else{
execSubject.getPrincipals().add(new PrincipalImpl(principalName));
debug("setting principal for execSubject : " + principalName);
}
} else {
//empty execSubject
//do nothing
}
//}
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());
}
//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 Subject getSubject() {
//if (translationRequired) {
if (subject == null) {
subject = new Subject();
subject.getPrincipals().add(new PrincipalImpl(principalName));
debug("setting translation required for principal : " + principalName);
}
return subject;
/*} else {
return null;
}*/
}
public String toString() {
StringBuffer toString = new StringBuffer("{");
toString.append("userName : " + userName);
toString.append(", password : " + password);
toString.append(", principalName : " + principalName);
toString.append(", translationRequired : " + translationRequired);
toString.append("}");
return toString.toString();
}
public void debug(String message) {
System.out.println("JSR-322 [RA] [MySecurityContext]: " + message);
}
}