package org.karmaexchange.provider;
import javax.servlet.http.HttpServletRequest;
import lombok.Data;
import info.modprobe.browserid.BrowserIDException;
import info.modprobe.browserid.BrowserIDResponse;
import info.modprobe.browserid.BrowserIDResponse.Status;
import info.modprobe.browserid.Verifier;
import org.karmaexchange.auth.AuthProvider;
import org.karmaexchange.auth.AuthProviderCredentials;
import org.karmaexchange.auth.AuthProviderType;
import org.karmaexchange.auth.GlobalUid;
import org.karmaexchange.auth.GlobalUidType;
import org.karmaexchange.dao.User;
import org.karmaexchange.dao.User.RegisteredEmail;
import org.karmaexchange.resources.msg.ErrorResponseMsg;
import org.karmaexchange.resources.msg.ErrorResponseMsg.ErrorInfo;
import org.karmaexchange.util.ServletUtil;
public class MozillaPersonaAuthProvider implements AuthProvider {
@Override
public CredentialVerificationResult verifyUserCredentials(AuthProviderCredentials userCredentials,
HttpServletRequest req) {
Verifier verifier = new Verifier();
BrowserIDResponse loginResponse;
try {
loginResponse = verifier.verify(userCredentials.getToken(),
ServletUtil.getBaseUriWithPort(req));
} catch (BrowserIDException e) {
throw ErrorResponseMsg.createException(e.getMessage(),
ErrorInfo.Type.PARTNER_SERVICE_FAILURE);
}
Status status = loginResponse.getStatus();
if (status == Status.OK) {
return new CredentialVerificationResult(
new GlobalUid(
GlobalUidType.toGlobalUidType(AuthProviderType.MOZILLA_PERSONA),
loginResponse.getEmail()),
new MozillaPersonaCredentialVerificationCtx(loginResponse.getEmail()));
} else {
throw ErrorResponseMsg.createException(loginResponse.getReason(),
ErrorInfo.Type.AUTHENTICATION);
}
}
@Override
public UserInfo createUser(CredentialVerificationResult verificationResult) {
MozillaPersonaCredentialVerificationCtx ctx =
(MozillaPersonaCredentialVerificationCtx) verificationResult.getVerificationCtx();
User user = User.create();
user.getRegisteredEmails().add(new RegisteredEmail(ctx.getEmail(), true));
return new UserInfo(user);
}
@Data
private static class MozillaPersonaCredentialVerificationCtx
implements CredentialVerificationCtx {
private final String email;
}
}