/** * */ package edu.stanford.prpl.phoneIdp.server.impl; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.AccountStore; /** * @author debangsu * */ public class AccountStoreImpl extends AccountStore { private static AccountStoreImpl theInstance = null; private static final Log log = LogFactory.getLog(AccountStoreImpl.class); private static Map<String, AccountEntry> accountsMap; //oid, account entry /** * */ private AccountStoreImpl() { accountsMap = new HashMap<String, AccountEntry>(); } public synchronized static AccountStoreImpl getInstance() { if (theInstance == null) { theInstance = new AccountStoreImpl(); } return theInstance; } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#activate(edu.stanford.prpl.phoneIdp.Credential) */ @Override public boolean activate(Credential userCred) { boolean result = false; //extract oid String oid = userCred.getOpenId(); AccountEntry entry = accountsMap.get(oid); if (null == entry) { //create entry = new AccountEntryImpl(userCred, true); accountsMap.put(oid, entry); log.info("AccountStore.activate: new size is: " + accountsMap.size()); result = true; } else { log.error("AccountStore.active: Account already exists\n" + userCred.toString()); } return result; } @Override public void activateAuthCode(String openId, AuthCode acode) { //todo debug AccountEntry accountEntry = accountsMap.get(openId); accountEntry.getActiveAuthCodes().put(acode.getAuthCode(), acode); log.info("AccountStore.activateAuthCode: new size of outstanding authCodes is: " + accountEntry.getActiveAuthCodes().size()); log.info("AccountStore.activateAuthCode: new size of valid authCodes is: " + accountEntry.getValidAuthCodes().size()); return; } @Override public boolean update(String oid) { boolean result = false; AccountEntry entry = accountsMap.get(oid); if (null == entry) { log.error("CredStore.update: Account does not exist\n" + entry.toString()); } else { //create entry = accountsMap.get(oid); entry.setActive(true); Credential c = entry.getMyCredential(); c.setOpenId(oid); entry.setMyCredential(c); entry.setActiveAuthCodes(null); entry.setValidAuthCodes(null); accountsMap.put(oid, entry); result = true; } return result; } @Override public boolean update(Credential userCred) { boolean result = false; //extract oid String oid = userCred.getOpenId(); return update(oid); } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#deActivate(edu.stanford.prpl.phoneIdp.Credential) */ @Override public boolean deActivate(Credential userCred) { boolean result = false; //extract oid String oid = userCred.getOpenId(); AccountEntry entry = accountsMap.get(oid); if (null == entry) { log.error("CredStore.deActivate: Nothing to do. Account already deactive or does not exist\n" + userCred.toString()); result = false; } else { entry.setActive(false); entry.setActiveAuthCodes(null); entry.setValidAuthCodes(null); result = true; } return result; } @Override public void validateAuthCode(String openId, AuthCode acode) { //todo debug AccountEntry accountEntry = accountsMap.get(openId); boolean resultContains = accountEntry.getActiveAuthCodes().containsKey(acode.getAuthCode()); AuthCode deletedAuthCode = accountEntry.getActiveAuthCodes().remove(acode.getAuthCode()); log.info("AccountStore.deActivateAuthCode: new size of outstanding authCodes is: " + accountEntry.getActiveAuthCodes().size()); deletedAuthCode.setValidated(true); accountEntry.getValidAuthCodes().put(acode.getAuthCode(), acode); log.info("AccountStore.deActivateAuthCode: new size of valid authCodes is: " + accountEntry.getValidAuthCodes().size()); return; } @Override public boolean delete(String openId) { boolean result = false; AccountEntry entry = accountsMap.remove(openId); if (null == entry) { log.error("CredStore.deActivate: Nothing to do. Account already deleted or does not exist\n" + openId); result = false; } else { result = true; log.info("AccountStore.delete: new size is: " + accountsMap.size()); } return result; } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#delete(edu.stanford.prpl.phoneIdp.Credential) */ @Override public boolean delete(Credential userCred) { boolean result = false; //extract oid String oid = userCred.getOpenId(); return delete(oid); } @Override public void deleteOldAuthCodes() { //todo //on timer 10 mins go thru outstanding authcodes in cache and accountstore. delete them. //on timer 30 mins go thru validated authcodes. delete them. } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#exists(edu.stanford.prpl.phoneIdp.Credential) */ @Override public boolean exists(Credential userCred) { //extract oid String oid = userCred.getOpenId(); return accountsMap.containsKey(oid); } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#get(edu.stanford.prpl.phoneIdp.Credential) */ @Override public AccountEntry get(Credential userCred) { String oid = userCred.getOpenId(); return get(oid); } public AccountEntry get(String oid) { return accountsMap.get(oid); } /* (non-Javadoc) * @see edu.stanford.prpl.phoneIdp.CredentialStore#isActive(edu.stanford.prpl.phoneIdp.Credential) */ @Override public boolean isActive(Credential userCred) { boolean result = false; String oid = userCred.getOpenId(); AccountEntry entry = accountsMap.get(oid); if (null == entry) { result = false; log.error("CredStore.isActive: creds are not in map. \n" + userCred.toString()); } else { result = entry.isActive(); } return result; } @Override public boolean isVerified(String oid) { boolean result = false; AccountEntry accountEntry = get(oid); if (null != accountEntry) { log.info("Oid: " + oid + ", Size of validAuthCodes: " + accountEntry.getValidAuthCodes().size()); if (accountEntry.getValidAuthCodes().size() > 0) { result = true; log.info("Account VERIFIED"); } } return result; } @Override public void printEntries() { for (Iterator<String> it = accountsMap.keySet().iterator(); it.hasNext();) { String entry = it.next(); log.info("Oid: " + entry + ", " + accountsMap.get(entry).toString()); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } }