package com.sissi.pipeline.in.auth.impl;
import java.util.Arrays;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sissi.context.JIDBuilder;
import com.sissi.context.JIDContext;
import com.sissi.pipeline.Input;
import com.sissi.pipeline.in.auth.AuthCallback;
import com.sissi.protocol.iq.auth.Auth;
import com.sissi.protocol.iq.auth.Success;
import com.sissi.ucenter.access.AuthAccessor;
/**
* @author kim 2013-10-24
*/
public class PlainAuthCallback implements AuthCallback {
public final static String mechanism = "PLAIN";
private final Log log = LogFactory.getLog(this.getClass());
private final Input proxy;
private final JIDBuilder jidBuilder;
private final AuthAccessor authAccessor;
public PlainAuthCallback(Input proxy, JIDBuilder jidBuilder, AuthAccessor authAccessor) {
super();
this.proxy = proxy;
this.jidBuilder = jidBuilder;
this.authAccessor = authAccessor;
}
@Override
public boolean auth(Auth auth, JIDContext context) {
AuthCertificate certificate = new AuthCertificate(auth);
return context.auth(certificate.pass(this.authAccessor.access(certificate.getUser(), certificate.getPass()))).auth() ? this.writeAndReturn(context, certificate) : this.proxy.input(context, null);
}
@Override
public String support() {
return mechanism;
}
private boolean writeAndReturn(JIDContext context, AuthCertificate certificate) {
context.jid(this.jidBuilder.build(certificate.getUser(), null)).write(Success.INSTANCE);
return true;
}
private class AuthCertificate {
private final String user;
private final String pass;
public AuthCertificate(Auth auth) {
super();
byte[] afterDecode = Base64.decodeBase64(auth.getText());
PlainAuthCallback.this.log.debug("User/Pass is: " + Arrays.toString(afterDecode));
int passStart = ArrayUtils.lastIndexOf(afterDecode, (byte) 0) + 1;
this.pass = new String(afterDecode, passStart, afterDecode.length - passStart).trim();
this.user = new String(afterDecode, 0, passStart).trim();
}
public String getUser() {
return this.user;
}
public String getPass() {
return pass;
}
public boolean pass(String pass) {
return this.pass.equals(pass);
}
}
}