package org.verisign.joid.server; import org.verisign.joid.Association; import org.verisign.joid.AssociationRequest; import org.verisign.joid.Crypto; import org.verisign.joid.Nonce; import org.verisign.joid.OpenIdException; import org.verisign.joid.Store; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.ListIterator; public class MemoryStore extends Store { public static long DEFAULT_LIFESPAN = 300; // todo: should probably increase this private static List associationList = new ArrayList(); private static List nonceList = new ArrayList(); private long associationLifetime = DEFAULT_LIFESPAN; public Association generateAssociation(AssociationRequest req, Crypto crypto) throws OpenIdException { // boldly reusing the db implementation of Association AssociationImpl a = new AssociationImpl(); a.setMode("unused"); a.setHandle(Crypto.generateHandle()); a.setSessionType(req.getSessionType()); byte[] secret = null; if (req.isNotEncrypted()){ secret = crypto.generateSecret(req.getAssociationType()); } else { secret = crypto.generateSecret(req.getSessionType()); crypto.setDiffieHellman(req.getDhModulus(), req.getDhGenerator()); byte[] encryptedSecret = crypto.encryptSecret(req.getDhConsumerPublic(), secret); a.setEncryptedMacKey(encryptedSecret); a.setPublicDhKey(crypto.getPublicKey()); } a.setMacKey(secret); a.setIssuedDate(new Date()); a.setLifetime(new Long(associationLifetime)); a.setAssociationType(req.getAssociationType()); return a; } public void saveAssociation(Association a) { associationList.add(a); } public void saveNonce(Nonce n) { nonceList.add(n); } public void deleteAssociation(Association a) { throw new RuntimeException("not yet implemented"); // "associationList.delete(a)" } public Association findAssociation(String handle) throws OpenIdException { if (handle == null) return null; ListIterator li = associationList.listIterator(); while (li.hasNext()){ Association a = (Association) li.next(); if (handle.equals(a.getHandle())){ return a; } } return null; } public Nonce findNonce(String nonce) throws OpenIdException { if (nonce == null) return null; ListIterator li = nonceList.listIterator(); while (li.hasNext()){ Nonce n = (Nonce) li.next(); if (nonce.equals(n.getNonce())){ return n; } } return null; } public Nonce generateNonce(String nonce) throws OpenIdException { NonceImpl n = new NonceImpl(); n.setNonce(nonce); n.setCheckedDate(new Date()); return n; } public void setAssociationLifetime(long associationLifetime) { this.associationLifetime = associationLifetime; } }