Author: prabath
Date: Tue Dec 11 03:20:52 2007
New Revision: 10957

Log:

OpenID related functionality

Added:
   
branches/solutions/identity/openid-poc/modules/identity-provider/src/main/java/org/wso2/solutions/identity/openid/
   
branches/solutions/identity/openid-poc/modules/identity-provider/src/main/java/org/wso2/solutions/identity/openid/OpenIdProvider.java

Added: 
branches/solutions/identity/openid-poc/modules/identity-provider/src/main/java/org/wso2/solutions/identity/openid/OpenIdProvider.java
==============================================================================
--- (empty file)
+++ 
branches/solutions/identity/openid-poc/modules/identity-provider/src/main/java/org/wso2/solutions/identity/openid/OpenIdProvider.java
       Tue Dec 11 03:20:52 2007
@@ -0,0 +1,220 @@
+package org.wso2.solutions.identity.openid;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.wso2.solutions.identity.UserStore;
+import org.openid4java.message.AuthRequest;
+import org.openid4java.message.DirectError;
+import org.openid4java.message.Message;
+import org.openid4java.message.MessageExtension;
+import org.openid4java.message.ParameterList;
+import org.openid4java.message.ax.AxMessage;
+import org.openid4java.message.ax.FetchRequest;
+import org.openid4java.message.ax.FetchResponse;
+import org.openid4java.message.sreg.SRegMessage;
+import org.openid4java.message.sreg.SRegRequest;
+import org.openid4java.message.sreg.SRegResponse;
+import org.openid4java.server.ServerException;
+import org.openid4java.server.ServerManager;
+import org.wso2.solutions.identity.IdentityConstants;
+import org.wso2.solutions.identity.IdentityProviderException;
+
+
+public class OpenIdProvider {
+
+       // instantiate a ServerManager object
+       public static ServerManager manager = new ServerManager();
+
+       // configure the OpenID Provider's endpoint URL
+       static {
+               // TODO: remove hard-coded strings
+               
manager.setOPEndpointUrl("https://localhost:12443/admin/server";);
+       }
+
+       public String processRequest(HttpServletRequest httpReq,
+                       HttpServletResponse httpResp) throws Exception {
+
+               // extract the parameters from the request
+               ParameterList request = new 
ParameterList(httpReq.getParameterMap());
+
+               String mode = request.hasParameter("openid.mode") ? request
+                               .getParameterValue("openid.mode") : null;
+
+               Message response;
+               String responseText;
+
+               if ("associate".equals(mode)) {
+                       // process an association request
+                       response = manager.associationResponse(request);
+                       responseText = response.keyValueFormEncoding();
+               } else if ("checkid_setup".equals(mode)
+                               || "checkid_immediate".equals(mode)) {
+                       // interact with the user and obtain data needed to 
continue
+                       List userData = userInteraction(request);
+
+                       // TODO : do the authentication
+                       Boolean authenticatedAndApproved = true;
+
+                       String userSelectedClaimedId = (String) userData.get(0);
+                       String nickName = (String) userData.get(1);
+                       String fullName = (String) userData.get(2);
+                       String email = (String) userData.get(3);
+
+                       // process an authentication request
+                       AuthRequest authReq = 
AuthRequest.createAuthRequest(request,
+                                       manager.getRealmVerifier());
+
+                       String opLocalId = null;
+
+                       // if the user chose a different claimed_id than the 
one in request
+                       if (userSelectedClaimedId != null
+                                       && 
userSelectedClaimedId.equals(authReq.getClaimed())) {
+                               // TODO: opLocalId = 
lookupLocalId(userSelectedClaimedId);
+                       }
+
+                       response = manager.authResponse(request, opLocalId,
+                                       userSelectedClaimedId, 
authenticatedAndApproved
+                                                       .booleanValue());
+
+                       if (response instanceof DirectError)
+                               return directResponse(httpResp, 
response.keyValueFormEncoding());
+                       else {
+                               if 
(authReq.hasExtension(AxMessage.OPENID_NS_AX)) {
+                                       MessageExtension ext = authReq
+                                                       
.getExtension(AxMessage.OPENID_NS_AX);
+                                       if (ext instanceof FetchRequest) {
+                                               FetchRequest fetchReq = 
(FetchRequest) ext;
+                                               Map required = 
fetchReq.getAttributes(true);
+                                               // Map optional = 
fetchReq.getAttributes(false);
+                                               if 
(required.containsKey("email")) {
+                                                       Map userDataExt = new 
HashMap();
+                                                       // 
userDataExt.put("email", userData.get(3));
+
+                                                       FetchResponse fetchResp 
= FetchResponse
+                                                                       
.createFetchResponse(fetchReq, userDataExt);
+                                                       // (alternatively) 
manually add attribute values
+                                                       
fetchResp.addAttribute("email",
+                                                                       
"http://schema.openid.net/contact/email";,
+                                                                       email);
+                                                       
response.addExtension(fetchResp);
+                                               }
+                                       } else {
+                                               throw new 
UnsupportedOperationException("TODO");
+                                       }
+                               }
+                               if 
(authReq.hasExtension(SRegMessage.OPENID_NS_SREG)) {
+                                       MessageExtension ext = authReq
+                                                       
.getExtension(SRegMessage.OPENID_NS_SREG);
+                                       if (ext instanceof SRegRequest) {
+                                               SRegRequest sregReq = 
(SRegRequest) ext;
+                                               List required = 
sregReq.getAttributes(true);
+                                               // TODO: List optional = 
sregReq.getAttributes(false);
+
+                                               // data released by the user
+                                               Map userDataSReg = new 
HashMap();
+                                               SRegResponse sregResp = 
SRegResponse
+                                                               
.createSRegResponse(sregReq, userDataSReg);
+
+                                               // TODO: use constants
+                                               if (required.contains("email")) 
{
+                                                       
sregResp.addAttribute("email", email);
+                                               }
+
+                                               if 
(required.contains("nickname")) {
+                                                       
sregResp.addAttribute("nickname", nickName);
+                                               }
+
+                                               if 
(required.contains("fullname")) {
+                                                       
sregResp.addAttribute("fullname", fullName);
+                                               }
+
+                                               response.addExtension(sregResp);
+
+                                       } else {
+                                               throw new 
UnsupportedOperationException("TODO");
+                                       }
+                               }
+                               // caller will need to decide which of the 
following to use:
+
+                               // option1: GET HTTP-redirect to the return_to 
URL
+                               return response.getDestinationUrl(true);
+                       }
+               } else if ("check_authentication".equals(mode)) {
+                       // processing a verification request ---
+                       response = manager.verify(request);
+                       responseText = response.keyValueFormEncoding();
+               } else {
+                       // error response
+                       response = DirectError.createDirectError("Unknown 
request");
+                       responseText = response.keyValueFormEncoding();
+               }
+
+               // return the result to the user
+               return responseText;
+       }
+
+       protected List userInteraction(ParameterList request)
+                       throws ServerException, IdentityProviderException {
+
+               List back = new ArrayList();
+
+               UserStore userStore = null;
+               List claimList = null;
+               List users = null;
+               Map mapValues = null;
+
+               String openId = null;
+
+               openId = request.hasParameter("openid.identity") ? request
+                               .getParameterValue("openid.identity") : null;
+
+               userStore = UserStore.getInstance();
+
+               users = userStore.getAllUserNames();
+
+               claimList = new ArrayList();
+               claimList.add(IdentityConstants.CLAIM_EMAIL_ADDRESS);
+               claimList.add(IdentityConstants.CLAIM_GIVEN_NAME);
+               claimList.add(IdentityConstants.CLAIM_SURNAME);
+               claimList.add(IdentityConstants.CLAIM_OPENID);
+
+               Iterator iterator = users.iterator();
+
+               while (iterator.hasNext()) {
+
+                       String user = (String) iterator.next();
+                       mapValues = userStore.getClaimValues(user, claimList);
+
+                       if (mapValues != null && !mapValues.isEmpty()) {
+                               if (openId.indexOf((String) mapValues
+                                               
.get(IdentityConstants.CLAIM_OPENID)) >= 0) {
+                                       
back.add(mapValues.get(IdentityConstants.CLAIM_OPENID));
+                                       back.add(user);
+                                       
back.add(mapValues.get(IdentityConstants.CLAIM_SURNAME));
+                                       back.add(mapValues
+                                                       
.get(IdentityConstants.CLAIM_EMAIL_ADDRESS));
+                                       break;
+                               }
+                       }
+               }
+
+               return back;
+       }
+
+       private String directResponse(HttpServletResponse httpResp, String 
response)
+                       throws IOException {
+               ServletOutputStream os = httpResp.getOutputStream();
+               os.write(response.getBytes());
+               os.close();
+
+               return null;
+       }
+
+}
\ No newline at end of file

_______________________________________________
Identity-dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/identity-dev

Reply via email to