// // (C) Copyright 2007 VeriSign, Inc. All Rights Reserved. // // VeriSign, Inc. shall have no responsibility, financial or // otherwise, for any consequences arising out of the use of // this material. The program material is provided on an "AS IS" // BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either // express or implied. // // Distributed under an Apache License // http://www.apache.org/licenses/LICENSE-2.0 // package org.verisign.joid; import java.math.BigInteger; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; /** * Represents an OpenID check authentication request. */ public class CheckAuthenticationRequest extends Request { public final static String OPENID_ASSOC_HANDLE = "openid.assoc_handle"; private final static Log log = LogFactory.getLog(CheckAuthenticationRequest.class); private AuthenticationResponse ar; private String handle; /** * Creates a check_authentication request. * * TODO: Made public to be accessible from unit tests only. Need * to rework that to change access level during test time. * * @param map the map of incoming openid parameters * @param mode always "check_authentication" */ public CheckAuthenticationRequest(Map map, String mode) throws OpenIdException { super(map, mode); ar = new AuthenticationResponse(map); handle = ar.getAssociationHandle(); checkInvariants(); } private void checkInvariants() throws OpenIdException { if (handle == null){ throw new OpenIdException("Missing " +CheckAuthenticationRequest .OPENID_ASSOC_HANDLE); } } public Response processUsing(ServerInfo si) throws OpenIdException { String invalidate = null; Store store = si.getStore(); String nonceStr = ar.getNonce(); if (nonceStr != null) { Nonce n = store.findNonce(nonceStr); if (n != null) { String s = "Nonce has already been checked"; log.debug(s); throw new OpenIdException(s); } else { n = store.generateNonce(nonceStr); store.saveNonce(n); } } Association assoc = store.findAssociation(handle); if ((assoc == null) || (assoc.hasExpired())){ invalidate = handle; } Crypto crypto = si.getCrypto(); return new CheckAuthenticationResponse(ar, assoc, crypto, invalidate); } public String toString() { return "[CheckAuthenticationRequest " + super.toString() +", handle="+handle +", authentication response="+ar +"]"; } Map toMap() { // need to send all values exactly from AuthenticationResponse... Map map = ar.toMap(); // ... except mode map.putAll(super.toMap()); return map; } }