Author: hmt
Date: Sat Oct 6 13:35:53 2012
New Revision: 1395049
URL: http://svn.apache.org/viewvc?rev=1395049&view=rev
Log:
update oauth feature
Added:
incubator/wookie/trunk/features/oauth/web/
incubator/wookie/trunk/features/oauth/web/imgs/
incubator/wookie/trunk/features/oauth/web/imgs/wait.gif (with props)
incubator/wookie/trunk/features/oauth/web/implicit.jsp (with props)
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/TokenHandler.java
Modified:
incubator/wookie/trunk/WebContent/WEB-INF/dwr.xml
incubator/wookie/trunk/WebContent/WEB-INF/web.xml
incubator/wookie/trunk/features/oauth/oauth.js
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/oAuthClient.java
Modified: incubator/wookie/trunk/WebContent/WEB-INF/dwr.xml
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/WebContent/WEB-INF/dwr.xml?rev=1395049&r1=1395048&r2=1395049&view=diff
==============================================================================
--- incubator/wookie/trunk/WebContent/WEB-INF/dwr.xml (original)
+++ incubator/wookie/trunk/WebContent/WEB-INF/dwr.xml Sat Oct 6 13:35:53 2012
@@ -31,11 +31,10 @@
<create creator="new" javascript="OAuthConnector" scope="application">
<param name="class"
value="org.apache.wookie.feature.oauth.oAuthClient"/>
- <include method="authenticate"/>
<include method="updateToken"/>
<include method="queryToken"/>
<include method="invalidateToken"/>
- <include method="getClientId"/>
+ <include method="queryOAuthParams"/>
</create>
<convert converter="object"
match="org.apache.wookie.ajaxmodel.impl.PreferenceDelegate"
javascript="Preference">
Modified: incubator/wookie/trunk/WebContent/WEB-INF/web.xml
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/WebContent/WEB-INF/web.xml?rev=1395049&r1=1395048&r2=1395049&view=diff
==============================================================================
--- incubator/wookie/trunk/WebContent/WEB-INF/web.xml (original)
+++ incubator/wookie/trunk/WebContent/WEB-INF/web.xml Sat Oct 6 13:35:53 2012
@@ -256,7 +256,16 @@
org.apache.wookie.WidgetServiceServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
- </servlet>
+ </servlet>
+
+ <servlet>
+ <description>
+ </description>
+ <display-name>TokenHandler</display-name>
+ <servlet-name>TokenHandler</servlet-name>
+
<servlet-class>org.apache.wookie.feature.oauth.TokenHandler</servlet-class>
+ </servlet>
+
<servlet-mapping>
<servlet-name>WidgetServiceServlet</servlet-name>
<url-pattern>/WidgetServiceServlet</url-pattern>
@@ -267,6 +276,11 @@
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>TokenHandler</servlet-name>
+ <url-pattern>/features/oauth/implicit</url-pattern>
+ </servlet-mapping>
+
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
Modified: incubator/wookie/trunk/features/oauth/oauth.js
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/features/oauth/oauth.js?rev=1395049&r1=1395048&r2=1395049&view=diff
==============================================================================
--- incubator/wookie/trunk/features/oauth/oauth.js (original)
+++ incubator/wookie/trunk/features/oauth/oauth.js Sat Oct 6 13:35:53 2012
@@ -14,74 +14,104 @@
oAuth = new function OAuth() {
this.access_token = null;
- this.client_id = null;
this.status = null; // null: init, O: not being authenticated, F:
authentication failed, A: authenticated
+ this.oauthParams = new Object();
this.init = function() {
+ var info = new Object();
+ info['id_key'] = widget.instanceid_key;
+ info['url'] = window.location.href;
+ OAuthConnector.queryOAuthParams(info,
+ {callback: function(map) {
+ oAuth.oauthParams = map;
+ }, async: false});
+ // if persist enalbed, try to get acess token
+ if (oAuth.oauthParams['persist'] != 'false') {
+ OAuthConnector.queryToken(widget.instanceid_key,
+ {callback: function(accessToken) {
+
oAuth.setAccessToken(accessToken);
+ }, async: false});
+ }
+ }
- token_bunch = window.location.hash;
- if (token_bunch.length > 0) {
+ this.initAccessToken = function(access_token, expires) {
+ // update to db if persist type
+ if (oAuth.oauthParams['persist'] != 'false') {
OAuthConnector.updateToken(
- widget.instanceid_key + token_bunch,
+ 'id_key=' + widget.instanceid_key +
'&access_token=' + access_token + '&expires_in=' + expires,
{callback: function(result) {
- if (result != "invalid") {
-
window.opener.location.reload();
- }
+ return;
}, async: false});
- window.close();
}
- dwr.engine.beginBatch();
- OAuthConnector.getClientId(widget.instanceid_key,
this.setClientId);
- OAuthConnector.queryToken(widget.instanceid_key,
this.setAccessToken);
- dwr.engine.endBatch({async: false});
- }
-
- this.setClientId = function(returned_client_id) {
- oAuth.client_id = returned_client_id;
+
+ // set access token to member variables
+ oAuth.setAccessToken(access_token);
}
this.setAccessToken = function(token_info) {
- if (token_info != "invalid") {
+ if (token_info != 'invalid') {
oAuth.access_token = token_info;
- oAuth.status = "A";
+ oAuth.status = 'A';
} else {
- oAuth.status = "O";
+ oAuth.status = 'O';
}
}
this.proxify = function(url) {
- returnedUrl = widget.getProxyUrl() + "?instanceid_key=" +
widget.instanceid_key + "&url=" + url;
- if (oAuth.client_id != null && oAuth.access_token != null) {
- returnedUrl = returnedUrl + "&client_id=" +
oAuth.client_id + "&access_token=" + oAuth.access_token;
+ returnedUrl = widget.getProxyUrl() + '?instanceid_key=' +
widget.instanceid_key + '&url=' + url;
+ if (oAuth.access_token != null) {
+ returnedUrl = returnedUrl + '&access_token=' +
oAuth.access_token;
}
return returnedUrl;
}
this.authenticate = function() {
- OAuthConnector.authenticate(
- widget.instanceid_key + "#" + window.location,
- {callback: function(redirectUrl) {
- window.open(redirectUrl,
"authentication_popup", "width=500, height=400");
- }, async: false});
+ // check if persist
+ if (oAuth.oauthParams['persist'] != 'false') {
+ OAuthConnector.queryToken(widget.instanceid_key,
+ {callback: function(accessToken) {
+
oAuth.setAccessToken(accessToken);
+ }, async: false});
+
+ if (oAuth.status == 'A') return;
+ }
+
+ // check oauth profile
+ if (typeof oAuth.oauthParams['profile'] != 'undefined') {
+ if (oAuth.oauthParams['profile'] != 'implicit') {
+ alert(oAuth.oauthParams['profile'] + ' is not
supported in this version');
+ return;
+ }
+ }
+ // show popup window
+ var url = oAuth.oauthParams['authzServer'] +
+ '?response_type=token&client_id=' +
oAuth.oauthParams['clientId'] +
+ '&redirect_uri=' + oAuth.oauthParams['redirectUri'];
+ if (typeof oAuth.oauthParams['scope'] != 'undefined') {
+ url += '&scope=' + oAuth.oauthParams['scope'];
+ }
+
+ window.open(url, 'Authorization request',
+ 'width=' + oAuth.oauthParams['popupWidth'] + ',
height=' + oAuth.oauthParams['popupHeight']);
}
this.invalidateToken = function() {
- oAuth.status = "O";
+ oAuth.status = 'O';
oAuth.access_token = null;
OAuthConnector.invalidateToken(widget.instanceid_key);
}
this.showStatus = function(container_id) {
- if (oAuth.status == null || oAuth.status == "O") {
- document.getElementById(container_id).innerHTML = "Not
yet authenticated";
- } else if (oAuth.status == "F") {
- document.getElementById(container_id).innerHTML =
"Authentication failed";
- } else if (oAuth.status == "A") {
- document.getElementById(container_id).innerHTML =
"Authenticated";
+ if (oAuth.status == null || oAuth.status == 'O') {
+ document.getElementById(container_id).innerHTML = 'Not
yet authenticated';
+ } else if (oAuth.status == 'F') {
+ document.getElementById(container_id).innerHTML =
'Authentication failed';
+ } else if (oAuth.status == 'A') {
+ document.getElementById(container_id).innerHTML =
'Authenticated';
}
}
}
oAuth.init();
-window.oauth = oAuth;
\ No newline at end of file
+window.oauth = oAuth;
Added: incubator/wookie/trunk/features/oauth/web/imgs/wait.gif
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/features/oauth/web/imgs/wait.gif?rev=1395049&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/features/oauth/web/imgs/wait.gif
------------------------------------------------------------------------------
svn:mime-type = image/gif
Added: incubator/wookie/trunk/features/oauth/web/implicit.jsp
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/features/oauth/web/implicit.jsp?rev=1395049&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/features/oauth/web/implicit.jsp
------------------------------------------------------------------------------
svn:mime-type = application/xml
Added:
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/TokenHandler.java
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/TokenHandler.java?rev=1395049&view=auto
==============================================================================
---
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/TokenHandler.java
(added)
+++
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/TokenHandler.java
Sat Oct 6 13:35:53 2012
@@ -0,0 +1,41 @@
+package org.apache.wookie.feature.oauth;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Servlet implementation class TokenReceiver
+ */
+public class TokenHandler extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public TokenHandler() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request,
HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
+ // check oauth profile
+ String context = request.getRequestURI();
+ if (context.endsWith("implicit")) {
+
request.getRequestDispatcher("/features/oauth/web/implicit.jsp").forward(request,
response);
+ }
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request,
HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ }
+}
+
Modified:
incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/oAuthClient.java
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/oAuthClient.java?rev=1395049&r1=1395048&r2=1395049&view=diff
==============================================================================
--- incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/oAuthClient.java
(original)
+++ incubator/wookie/trunk/src/org/apache/wookie/feature/oauth/oAuthClient.java
Sat Oct 6 13:35:53 2012
@@ -21,12 +21,12 @@ import java.net.URLEncoder;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import org.apache.wookie.Messages;
import org.apache.wookie.beans.IOAuthToken;
-import org.apache.wookie.w3c.IContent;
import org.apache.wookie.w3c.IParam;
import org.apache.wookie.beans.IWidgetInstance;
import org.apache.wookie.beans.util.IPersistenceManager;
@@ -57,82 +57,6 @@ public class oAuthClient implements IFea
return null;
}
- public String authenticate(String idKey_RedirectUri) {
- int iPos = idKey_RedirectUri.indexOf('#');
- String idKey = idKey_RedirectUri.substring(0, iPos);
- String redirectUri = idKey_RedirectUri.substring(iPos + 1);
- if(idKey == null) return "invalid";
- IPersistenceManager persistenceManager =
PersistenceManagerFactory.getPersistenceManager();
- IWidgetInstance widgetInstance =
persistenceManager.findWidgetInstanceByIdKey(idKey);
- if(widgetInstance==null) return "invalid";
-
- Collection<IContent> startFiles =
widgetInstance.getWidget().getContentList();
- String startFileUrl = null;
- for(IContent startFile : startFiles) {
- iPos = redirectUri.indexOf(startFile.getSrc());
- if (iPos > -1) {
- startFileUrl = startFile.getSrc();
- break;
- }
- }
- if (startFileUrl != null) {
- redirectUri = redirectUri.substring(0, iPos +
startFileUrl.length()) + "?idkey=" + idKey;
- }
-
- try {
- redirectUri = URLEncoder.encode(redirectUri, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- }
-
- Collection<org.apache.wookie.w3c.IFeature> widgetFeatures =
widgetInstance.getWidget().getFeatures();
- org.apache.wookie.w3c.IFeature oAuthFeature = null;
- for (org.apache.wookie.w3c.IFeature aFeature : widgetFeatures) {
- if (getName().equals(aFeature.getName())) {
- oAuthFeature = aFeature;
- break;
- }
- }
-
- if (oAuthFeature == null) {
- return "";
- }
-
- Collection<IParam> oAuthParams = oAuthFeature.getParameters();
- String clientId = idKey;
- String authzServer = null;
- String scope = "";
- for (IParam aParam : oAuthParams) {
- String paramName = aParam.getName().toLowerCase();
- String paramValue = aParam.getValue();
- if ("authzserver".equals(paramName)) {
- authzServer = paramValue;
- } else if ("clientid".equals(paramName)) {
- if (!"auto".equalsIgnoreCase(paramValue)) {
- clientId = paramValue;
- }
- } else if ("scope".equals(aParam.getName())) {
- scope = paramValue;
- } else if ("redirecturi".equals(paramName)) {
- if (paramValue.length() != 0 &&
!"auto".equalsIgnoreCase(paramValue)) {
- redirectUri = paramValue;
- }
- }
- }
-
- IOAuthToken oauthToken =
persistenceManager.findOAuthToken(widgetInstance);
- if (oauthToken != null) {
- persistenceManager.delete(oauthToken);
- }
-
- String url = authzServer + "?client_id=" + clientId +
"&response_type=token&redirect_uri=" + redirectUri;
-
- if (scope.length() > 0) {
- url = url + "&scope=" + scope;
- }
-
- return url;
- }
-
public String queryToken(String idKey) {
if(idKey == null) return "invalid";
IPersistenceManager persistenceManager =
PersistenceManagerFactory.getPersistenceManager();
@@ -158,60 +82,28 @@ public class oAuthClient implements IFea
persistenceManager.delete(oauthToken);
}
}
-
- public String getClientId(String idKey) {
- if(idKey == null) return "invalid";
- IPersistenceManager persistenceManager =
PersistenceManagerFactory.getPersistenceManager();
- IWidgetInstance widgetInstance =
persistenceManager.findWidgetInstanceByIdKey(idKey);
- if(widgetInstance==null) return "invalid";
- IOAuthToken oauthToken =
persistenceManager.findOAuthToken(widgetInstance);
- if (oauthToken != null) {
- return oauthToken.getClientId();
- } else {
- return "invalid";
- }
- }
-
+
public String updateToken(String idKey_tokenBunch) {
- int iPos = idKey_tokenBunch.indexOf('#');
- String idKey = idKey_tokenBunch.substring(0, iPos);
- String tokenBunch = idKey_tokenBunch.substring(iPos + 1);
-
- Map<String,String> oAuthTokenBunch = new HashMap<String,
String>();
- iPos = 0;
- int iEqual, iOffset = 0;
- String fragment = tokenBunch;
- do {
- iPos = tokenBunch.indexOf('&', iOffset);
- if (iPos < 0) {
- iPos = tokenBunch.length();
- }
-
- fragment = tokenBunch.substring(iOffset, iPos);
- iOffset = iOffset + iPos + 1;
- iEqual = fragment.indexOf('=');
- if (iEqual < 0) continue;
- oAuthTokenBunch.put(fragment.substring(0, iEqual),
fragment.substring(iEqual + 1));
- } while (iOffset < tokenBunch.length());
+ Map<String,String> params = parseParams(idKey_tokenBunch);
+ String idKey = params.get("id_key");
IPersistenceManager persistenceManager =
PersistenceManagerFactory.getPersistenceManager();
IWidgetInstance widgetInstance =
persistenceManager.findWidgetInstanceByIdKey(idKey);
HttpServletRequest request =
WebContextFactory.get().getHttpServletRequest();
Messages localizedMessages =
LocaleHandler.localizeMessages(request);
-
if(widgetInstance==null) {
return localizedMessages.getString("WidgetAPIImpl.0");
//$NON-NLS-1$
}
- Map<String, String> oAuthParams = queryOAuthParams(idKey);
+ Map<String, String> oAuthParams = queryXMLParams(idKey);
if (oAuthParams == null) {
return localizedMessages.getString("WidgetAPIImpl.0");
//$NON-NLS-1$
}
IOAuthToken oauthToken =
persistenceManager.findOAuthToken(widgetInstance);
if (oauthToken == null) oauthToken =
persistenceManager.newInstance(IOAuthToken.class);
- oauthToken.setAccessToken(oAuthTokenBunch.get("access_token"));
- oauthToken.setExpires(System.currentTimeMillis() + 1000 *
Integer.parseInt(oAuthTokenBunch.get("expires_in")));
+ oauthToken.setAccessToken(params.get("access_token"));
+ oauthToken.setExpires(System.currentTimeMillis() + 1000 *
Integer.parseInt(params.get("expires_in")));
oauthToken.setClientId(oAuthParams.get("clientId"));
oauthToken.setAuthzUrl(oAuthParams.get("authzServer"));
oauthToken.setWidgetInstance(widgetInstance);
@@ -219,7 +111,7 @@ public class oAuthClient implements IFea
return oauthToken.getAccessToken();
}
- private Map<String, String> queryOAuthParams(String idKey) {
+ public Map<String, String> queryXMLParams(String idKey) {
IPersistenceManager persistenceManager =
PersistenceManagerFactory.getPersistenceManager();
IWidgetInstance widgetInstance =
persistenceManager.findWidgetInstanceByIdKey(idKey);
if(widgetInstance==null) return null;
@@ -241,4 +133,51 @@ public class oAuthClient implements IFea
}
return oAuthParamMap;
}
-}
\ No newline at end of file
+
+ public Map<String, String> queryOAuthParams(Map<String, String> info) {
+ if (info.get("id_key") == null || info.get("url") == null)
return null;
+ Map<String, String>oAuthParamMap =
queryXMLParams(info.get("id_key"));
+ if (oAuthParamMap == null) return null;
+ String url = info.get("url");
+ int iPos = url.indexOf("/wservices/");
+ if (iPos < 0) return null;
+ url = url.substring(0, iPos);
+ if (!oAuthParamMap.containsKey("profile"))
+ oAuthParamMap.put("profile", "implicit");
+ try {
+ url = URLEncoder.encode(url, "UTF8");
+
+ if ("implicit".equals(oAuthParamMap.get("profile")))
+ url += "%2Ffeatures%2Foauth%2Fimplicit";
+ else
+ url += "%2Ffeatures%2Foauth%2Fother";
+ } catch (UnsupportedEncodingException e) {
+ if ("implicit".equals(oAuthParamMap.get("profile")))
+ url += "/features/oauth/implicit";
+ else
+ url += "/features/oauth/other";
+ }
+ oAuthParamMap.put("redirectUri", url);
+
+ if (!oAuthParamMap.containsKey("persist"))
+ oAuthParamMap.put("persist", "true");
+ if (!oAuthParamMap.containsKey("popupWidth"))
+ oAuthParamMap.put("popupWidth", "400px");
+ if (!oAuthParamMap.containsKey("popupHeight"))
+ oAuthParamMap.put("popupHeight", "500px");
+ return oAuthParamMap;
+ }
+
+ private Map<String, String> parseParams(String paramString) {
+ StringTokenizer st = new StringTokenizer(paramString, "&");
+ Map<String, String> result = new HashMap<String, String>();
+ while (st.hasMoreTokens()) {
+ String paramPair = st.nextToken();
+ int iPos = paramPair.indexOf('=');
+ if (iPos > 0) {
+ result.put(paramPair.substring(0, iPos),
paramPair.substring(iPos + 1));
+ }
+ }
+ return result;
+ }
+}