package edu.stanford.prpl.phoneIdp.server.impl;
import java.util.Date;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.stanford.prpl.phoneIdp.common.PhoneIdpCommon;
import edu.stanford.prpl.phoneIdp.common.api.Challenge;
import edu.stanford.prpl.phoneIdp.server.api.AccountEntry;
import edu.stanford.prpl.phoneIdp.server.api.AuthCode;
import edu.stanford.prpl.phoneIdp.server.api.Credential;
import edu.stanford.prpl.phoneIdp.server.api.PhoneIdp;
public class PhoneIdpImpl extends PhoneIdp {
private static final Log log = LogFactory.getLog(PhoneIdpImpl.class);
private PhoneIdpImpl()
{
pIdpAccountStore_ = AccountStoreImpl.getInstance();
pIdpAuthCodeCache_ = AuthCodeCacheImpl.getInstance();
pIdpRegistrar_ = new RegistrarImpl();
pIdpAuthenticator_ = new AuthenticatorImpl();
}
private static PhoneIdpImpl theInstance;
public static PhoneIdpImpl getInstance()
{
if (theInstance == null)
{
theInstance = new PhoneIdpImpl();
}
return theInstance;
}
//singleton todo
//init shared state - cred store
//init Registrar
//init Authenticator
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public Credential createAccount(String name, String openId) {
log.info("openId: " + openId);
log.info("name: " + name);
Credential userCred = pIdpRegistrar_.createAccount(name, openId);
log.info("PhoneIdpImpl.createAccount: Cred: " + userCred.toString());
return userCred;
}
@Override
public Credential getAccount(String openId) {
log.info("openId: " + openId);
AccountEntry accountEntry = pIdpAccountStore_.get(openId);
if (null != accountEntry)
{
log.info("Found account entry: " + accountEntry.toString());
return accountEntry.getMyCredential();
}
log.info("Did not find account entry");
return null;
}
@Override
public boolean deleteAccount(String openId) {
boolean result = pIdpRegistrar_.deleteAccount(openId);
log.info("PhoneIdpImpl.deleteAccount: OpenId: " + openId + ", Result: " + result);
return result;
}
@Override
public Challenge createChallenge(String oid)
{
log.info("createChallenge: OpenId: " + oid);
Assert.assertNotNull(pIdpAccountStore_);
AccountEntry accountEntry = pIdpAccountStore_.get(oid);
//DEBUG
if (null == accountEntry)
{
log.error("CreateChallenge called for inactive user");
pIdpAccountStore_.printEntries();
}
Credential userCred = accountEntry.getMyCredential();
return createChallenge(userCred);
}
@Override
public Challenge createChallenge(Credential userCred) {
Challenge challenge = pIdpAuthenticator_.generateChallenge(userCred);
log.info("PhoneIdpImpl.createChallenge: Challenge: " + challenge.toString());
return challenge;
}
@Override
public boolean verifyResponse(String signedText) {
boolean result = pIdpAuthenticator_.verifyResponse(signedText);
log.info("PhoneIdpImpl.verifyResponse: SignedText: " + signedText + ", Result: " + result);
return result;
}
@Override
public boolean isVerified(String oid, String authcode) {
boolean result = false;
log.info("isVerified: oid: " + oid + ", authcode: "+ authcode);
AccountEntry accountEntry = pIdpAccountStore_.get(oid);
AuthCode acode = accountEntry.getValidAuthCodes().get(authcode);
if (null != acode)
{
Date now = new Date();
long elapsed = now.getTime() - acode.getIssueDateTime().getTime();
log.info("Authcode time: " + acode.getIssueDateTime().toString());
log.info("Now: " + now.toString());
log.info("Elapsed time: " + elapsed);
if (elapsed < PhoneIdpCommon.AUTHCODE_VALID_DURATION_MS)
{
log.info("isVerified: TRUE");
result = true;
}
else
{
log.info("isVerified: FALSE");
}
}
else
{
log.info("isVerified: FALSE. Not found in validAuthCodes");
}
return result;
}
public boolean isAccountVerified(String oid)
{
log.info("isAccountVerified: oid: " + oid);
return pIdpAccountStore_.isVerified(oid);
}
}