You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2009/03/16 21:40:08 UTC

svn commit: r755000 [2/4] - in /roller/trunk: apps/weblogger/ apps/weblogger/nbproject/ apps/weblogger/src/java/META-INF/ apps/weblogger/src/java/org/apache/roller/weblogger/business/ apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/ ap...

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java Mon Mar 16 20:40:06 2009
@@ -79,8 +79,10 @@
     public static void sendPendingEntryNotice(WeblogEntry entry) 
             throws WebloggerException {
         
-        Session mailSession = WebloggerStartup.getMailProvider().getSession();
-        if(mailSession == null) {
+        Session mailSession = WebloggerStartup.getMailProvider() != null
+                ? WebloggerStartup.getMailProvider().getSession() : null;
+
+        if (mailSession == null) {
             throw new WebloggerException("Couldn't get mail Session");
         }
         
@@ -148,7 +150,9 @@
                                             User user)
             throws WebloggerException {
         
-        Session mailSession = WebloggerStartup.getMailProvider().getSession();
+        Session mailSession = WebloggerStartup.getMailProvider() != null
+                ? WebloggerStartup.getMailProvider().getSession() : null;
+
         if(mailSession == null) {
             throw new WebloggerException("ERROR: Notification email(s) not sent, "
                     + "Roller's mail session not properly configured");
@@ -205,7 +209,9 @@
     public static void sendUserActivationEmail(User user)
             throws WebloggerException {
         
-        Session mailSession = WebloggerStartup.getMailProvider().getSession();
+        Session mailSession = WebloggerStartup.getMailProvider() != null
+                ? WebloggerStartup.getMailProvider().getSession() : null;
+
         if(mailSession == null) {
             throw new WebloggerException("ERROR: Notification email(s) not sent, "
                     + "Roller's mail session not properly configured");
@@ -585,7 +591,7 @@
             throws MessagingException {
         
         MailProvider mailProvider = WebloggerStartup.getMailProvider();
-        if(mailProvider == null) {
+        if (mailProvider == null) {
             return;
         }
         

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java Mon Mar 16 20:40:06 2009
@@ -1,6 +1,6 @@
 /*
 * Licensed to the Apache Software Foundation (ASF) under one or more
-*  contributor license agreements.  The ASF licenses this file to You
+* contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
@@ -37,11 +37,18 @@
 import com.sun.syndication.propono.atom.server.AtomHandler;
 import com.sun.syndication.propono.atom.server.AtomMediaResource;
 import com.sun.syndication.propono.atom.server.AtomNotFoundException;
+import javax.servlet.http.HttpServletResponse;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthMessage;
+import net.oauth.server.OAuthServlet;
 import org.apache.commons.lang.StringUtils;
 import org.apache.roller.weblogger.WebloggerException;
+import org.apache.roller.weblogger.business.OAuthManager;
 import org.apache.roller.weblogger.config.WebloggerConfig;
+import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
 import org.apache.roller.weblogger.pojos.WeblogPermission;
 
+
 /**
  * Weblogger's ROME Propono-based Atom Protocol implementation.
  * 
@@ -53,7 +60,6 @@
  * Here are the APP URIs suppored by Weblogger:
  * 
  * <pre>
- * 
  *    /roller-services/app
  *    Introspection doc
  * 
@@ -79,8 +85,8 @@
  * 
  *    /roller-services/app/[weblog-handle]/resource/[name]
  *    Individual resource data (GET)
- * 
  * </pre>
+ *
  * @author David M Johnson
  */
 public class RollerAtomHandler implements AtomHandler {
@@ -106,12 +112,20 @@
      * If user is authenticated, then getAuthenticatedUsername() will return
      * then user's name, otherwise it will return null.
      */
-    public RollerAtomHandler(HttpServletRequest request) {
+    public RollerAtomHandler(HttpServletRequest request, HttpServletResponse response) {
         roller = WebloggerFactory.getWeblogger();
-        
-        // TODO: decide what to do about authentication, is WSSE going to fly?
-        //String userName = authenticateWSSE(request);
-        String userName = authenticateBASIC(request);
+
+        String userName = null;
+        if ("oauth".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) {
+            userName = authenticationOAUTH(request, response);
+
+        } else if ("wsse".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) {
+            userName = authenticateWSSE(request);
+
+        } else { // default to basic
+            userName = authenticateBASIC(request);
+        }
+
         if (userName != null) {
             try {
                 this.user = roller.getUserManager().getUserByUserName(userName);
@@ -122,9 +136,6 @@
         
         atomURL = WebloggerFactory.getWeblogger().getUrlStrategy().getAtomProtocolURL(true);
     }
-    
-    /** For testing and for those who wish to extend */
-    public RollerAtomHandler() {}
 
     /**
      * Return weblogHandle of authenticated user or null if there is none.
@@ -462,6 +473,29 @@
     }
 
     
+    private String authenticationOAUTH(
+            HttpServletRequest request, HttpServletResponse response) {
+        try {
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
+            OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
+            OAuthAccessor accessor = omgr.getAccessor(requestMessage);
+            omgr.getValidator().validateMessage(requestMessage, accessor);
+            return (String)accessor.consumer.getProperty("userId");
+
+        } catch (Exception ex) {
+            log.debug("ERROR authenticating user", ex);
+            String realm = (request.isSecure())?"https://":"http://";
+            realm += request.getLocalName();
+            try {
+                OAuthServlet.handleException(response, ex, realm, true);
+            } catch (Exception ioe) {
+                log.debug("ERROR writing error response", ioe);
+            }
+        }
+        return null;
+    }
+
+
     public static void oneSecondThrottle() {
         // Throttle one entry per second per weblog because time-
         // stamp in MySQL and other DBs has only 1 sec resolution
@@ -471,4 +505,5 @@
             }  
         } catch (Exception ignored) {} 
     }
+
 }

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java Mon Mar 16 20:40:06 2009
@@ -1,6 +1,6 @@
 /*
 * Licensed to the Apache Software Foundation (ASF) under one or more
-*  contributor license agreements.  The ASF licenses this file to You
+* contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
@@ -21,6 +21,7 @@
 import com.sun.syndication.propono.atom.server.AtomHandlerFactory;
 import com.sun.syndication.propono.atom.server.AtomHandler;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * Extends {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} to create and return 
@@ -31,8 +32,9 @@
     /**
      * Create new AtomHandler.
      */
-    public AtomHandler newAtomHandler( HttpServletRequest req ) {
-        return new RollerAtomHandler(req);
+    public AtomHandler newAtomHandler(
+            HttpServletRequest req, HttpServletResponse res) {
+        return new RollerAtomHandler(req, res);
     }    
 }
       

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2007 AOL, LLC.
+ * Portions Copyright 2009 Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.roller.weblogger.webservices.oauth;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.oauth.OAuth;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthMessage;
+import net.oauth.OAuthProblemException;
+import net.oauth.server.OAuthServlet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.business.OAuthManager;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+
+/**
+ * Access Token request handler
+ *
+ * @author Praveen Alavilli
+ * @author Dave Johnson (adapted for Roller)
+ */
+public class AccessTokenServlet extends HttpServlet {
+    protected static Log log =
+            LogFactory.getFactory().getInstance(AccessTokenServlet.class);
+    
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        // nothing at this point
+    }
+    
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        processRequest(request, response);
+    }
+    @Override
+    public void doPost(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        processRequest(request, response);
+    }
+        
+    public void processRequest(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        try{
+            OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
+            
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
+            OAuthAccessor accessor = omgr.getAccessor(requestMessage);
+            omgr.getValidator().validateMessage(requestMessage, accessor);
+            
+            // make sure token is authorized
+            if (!Boolean.TRUE.equals(accessor.getProperty("authorized"))) {
+                 OAuthProblemException problem = new OAuthProblemException("permission_denied");
+                throw problem;
+            }
+            // generate access token and secret
+            omgr.generateAccessToken(accessor);
+            WebloggerFactory.getWeblogger().flush();
+            
+            response.setContentType("text/plain");
+            OutputStream out = response.getOutputStream();
+            OAuth.formEncode(OAuth.newList(
+                "oauth_token", accessor.accessToken,
+                "oauth_token_secret", accessor.tokenSecret), out);
+            out.close();
+            
+        } catch (Exception e){
+            handleException(e, request, response, true);
+        }
+    }
+
+    public void handleException(Exception e, HttpServletRequest request,
+            HttpServletResponse response, boolean sendBody)
+            throws IOException, ServletException {
+        log.debug("ERROR authorizing token", e);
+        String realm = (request.isSecure())?"https://":"http://";
+        realm += request.getLocalName();
+        OAuthServlet.handleException(response, e, realm, sendBody);
+    }
+
+}

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2007 AOL, LLC.
+ * Portions Copyright 2009 Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.roller.weblogger.webservices.oauth;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.oauth.OAuth;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthMessage;
+import net.oauth.server.OAuthServlet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.business.OAuthManager;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+
+/**
+ * Autherization request handler.
+ *
+ * @author Praveen Alavilli
+ * @author Dave Johnson (adapted for Roller)
+ */
+public class AuthorizationServlet extends HttpServlet {
+    protected static Log log =
+            LogFactory.getFactory().getInstance(AuthorizationServlet.class);
+    
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        // nothing at this point
+    }
+    
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        
+        try{
+            OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
+            
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
+            OAuthAccessor accessor = omgr.getAccessor(requestMessage);
+           
+            if (Boolean.TRUE.equals(accessor.getProperty("authorized"))) {
+                // already authorized send the user back
+                returnToConsumer(request, response, accessor);
+            } else {
+                sendToAuthorizePage(request, response, accessor);
+            }
+        
+        } catch (Exception e){
+            handleException(e, request, response, true);
+        }
+    }
+    
+    @Override 
+    public void doPost(HttpServletRequest request, HttpServletResponse response) 
+            throws IOException, ServletException{
+        
+        try{
+            OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
+            
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
+            OAuthAccessor accessor = omgr.getAccessor(requestMessage);
+            
+            String userId = request.getParameter("userId");
+            if (userId == null){
+                sendToAuthorizePage(request, response, accessor);
+            }
+            // set userId in accessor and mark it as authorized
+            omgr.markAsAuthorized(accessor, userId);
+            WebloggerFactory.getWeblogger().flush();
+            
+            returnToConsumer(request, response, accessor);
+
+            
+        } catch (Exception e){
+            handleException(e, request, response, true);
+        }
+    }
+    
+    private void sendToAuthorizePage(HttpServletRequest request, 
+            HttpServletResponse response, OAuthAccessor accessor)
+    throws IOException, ServletException{
+        String callback = request.getParameter("oauth_callback");
+        if(callback == null || callback.length() <=0) {
+            callback = "none";
+        }
+        String consumer_description = (String)accessor.consumer.getProperty("description");
+        request.setAttribute("CONS_DESC", consumer_description);
+        request.setAttribute("CALLBACK", callback);
+        request.setAttribute("TOKEN", accessor.requestToken);
+        request.getRequestDispatcher("/roller-ui/oauthAuthorize.rol").forward(request, response);
+    }
+    
+    private void returnToConsumer(HttpServletRequest request, 
+            HttpServletResponse response, OAuthAccessor accessor)
+        throws IOException, ServletException {
+
+        // send the user back to site's callBackUrl
+        String callback = request.getParameter("oauth_callback");
+        if ("none".equals(callback)
+            && accessor.consumer.callbackURL != null 
+                && accessor.consumer.callbackURL.length() > 0){
+            // first check if we have something in our properties file
+            callback = accessor.consumer.callbackURL;
+        }
+        
+        if ( "none".equals(callback) ) {
+            // no call back it must be a client
+            response.setContentType("text/plain");
+            PrintWriter out = response.getWriter();
+            out.println("You have successfully authorized for consumer key '"
+                    + accessor.consumer.consumerKey
+                    + "'. Please close this browser window and click continue"
+                    + " in the client.");
+            out.close();
+        } else {
+            // if callback is not passed in, use the callback from config
+            if(callback == null || callback.length() <=0 )
+                callback = accessor.consumer.callbackURL;
+            String token = accessor.requestToken;
+            if (token != null && callback != null) {
+                callback = OAuth.addParameters(callback, "oauth_token", token);
+            }
+
+            response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
+            response.setHeader("Location", callback);
+        }
+    }
+
+    public void handleException(Exception e, HttpServletRequest request,
+            HttpServletResponse response, boolean sendBody)
+            throws IOException, ServletException {
+        log.debug("ERROR authorizing token", e);
+        String realm = (request.isSecure())?"https://":"http://";
+        realm += request.getLocalName();
+        OAuthServlet.handleException(response, e, realm, sendBody);
+    }
+}

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007 AOL, LLC.
+ * Portions Copyright 2009 Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.roller.weblogger.webservices.oauth;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.oauth.OAuth;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthConsumer;
+import net.oauth.OAuthMessage;
+import net.oauth.server.OAuthServlet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.business.OAuthManager;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+
+
+/**
+ * Request token request handler
+ * 
+ * @author Praveen Alavilli
+ * @author Dave Johnson (adapted for Roller)
+ */
+public class RequestTokenServlet extends HttpServlet {
+    protected static Log log =
+            LogFactory.getFactory().getInstance(RequestTokenServlet.class);
+    
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+    }
+    
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response) 
+            throws IOException, ServletException {
+        processRequest(request, response);
+    }
+    
+    @Override
+    public void doPost(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        processRequest(request, response);
+    }
+        
+    public void processRequest(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+
+        try {
+            OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();            
+            OAuthAccessor accessor = omgr.getAccessor(requestMessage);
+
+            if (accessor == null) {
+
+                OAuthConsumer consumer = omgr.getConsumer(requestMessage);
+                accessor = new OAuthAccessor(consumer);
+                omgr.getValidator().validateMessage(requestMessage, accessor);
+
+                {
+                    // Support the 'Variable Accessor Secret' extension
+                    // described in http://oauth.pbwiki.com/AccessorSecret
+                    String secret = requestMessage.getParameter("oauth_accessor_secret");
+                    if (secret != null) {
+                        accessor.setProperty(OAuthConsumer.ACCESSOR_SECRET, secret);
+                    }
+                }
+
+                // generate request_token and secret
+                omgr.generateRequestToken(accessor);
+                WebloggerFactory.getWeblogger().flush();
+            }
+
+            response.setContentType("text/plain");
+            OutputStream out = response.getOutputStream();
+            String token = accessor.requestToken != null
+                    ? accessor.requestToken: accessor.accessToken;
+            OAuth.formEncode(OAuth.newList(
+                    "oauth_token", token,
+                    "oauth_token_secret", accessor.tokenSecret), out);
+            out.close();
+            
+        } catch (Exception e){
+            handleException(e, request, response, true);
+        }
+        
+    }
+
+    public void handleException(Exception e, HttpServletRequest request,
+            HttpServletResponse response, boolean sendBody)
+            throws IOException, ServletException {
+        log.debug("ERROR authorizing token", e);
+        String realm = (request.isSecure())?"https://":"http://";
+        realm += request.getLocalName();
+        OAuthServlet.handleException(response, e, realm, sendBody);
+    }
+}

Modified: roller/trunk/apps/weblogger/src/sql/400-to-500-migration.vm
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/sql/400-to-500-migration.vm?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/sql/400-to-500-migration.vm (original)
+++ roller/trunk/apps/weblogger/src/sql/400-to-500-migration.vm Mon Mar 16 20:40:06 2009
@@ -67,3 +67,22 @@
 create index ua_username_idx  on roller_userattribute( username$!db.INDEXSIZE );
 create index ua_attrname_idx  on roller_userattribute( attrname$!db.INDEXSIZE );
 create index ua_attrvalue_idx on roller_userattribute( attrvalue$!db.INDEXSIZE );
+
+create table rol_oauthconsumer (
+    consumerkey varchar(48) not null primary key,
+    consumersecret varchar(48) not null,
+    username varchar(48) not null
+);
+create index oc_username_idx  on rol_oauthconsumer( username$!db.INDEXSIZE );
+create index oc_consumerkey_idx  on rol_oauthconsumer( consumerkey$!db.INDEXSIZE );
+
+create table rol_oauthaccessor (
+    consumerkey varchar(48) not null primary key,
+    requesttoken varchar(48),
+    accesstoken varchar(48),
+    tokensecret varchar(48),
+    created $db.TIMESTAMP_SQL_TYPE not null,
+    updated $db.TIMESTAMP_SQL_TYPE not null,
+    authorized $db.BOOLEAN_SQL_TYPE_FALSE
+);
+create index oa_consumerkey_idx  on rol_oauthaccessor( consumerkey$!db.INDEXSIZE );

Modified: roller/trunk/apps/weblogger/src/sql/createdb.vm
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/sql/createdb.vm?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/sql/createdb.vm (original)
+++ roller/trunk/apps/weblogger/src/sql/createdb.vm Mon Mar 16 20:40:06 2009
@@ -435,7 +435,27 @@
 create index ea_entryid_idx on entryattribute( entryid );
 alter table entryattribute add constraint ea_name_uq unique ( entryid, name$!db.INDEXSIZE );
 
-
+-- each record is an OAuth consumer key and secret, can be tied to just one user
+create table rol_oauthconsumer (
+    consumerkey varchar(48) not null primary key,
+    consumersecret varchar(48) not null,
+    username varchar(48)
+);
+create index oc_username_idx  on rol_oauthconsumer( username$!db.INDEXSIZE );
+create index oc_consumerkey_idx  on rol_oauthconsumer( consumerkey$!db.INDEXSIZE );
+
+-- each record is an OAuth accessor, always tied to just one user
+create table rol_oauthaccessor (
+    consumerkey varchar(48) not null primary key,
+    requesttoken varchar(48),
+    accesstoken varchar(48),
+    tokensecret varchar(48),
+    created $db.TIMESTAMP_SQL_TYPE not null,
+    updated $db.TIMESTAMP_SQL_TYPE not null,
+    username varchar(48) not null,
+    authorized $db.BOOLEAN_SQL_TYPE_FALSE
+);
+create index oa_consumerkey_idx  on rol_oauthaccessor( consumerkey$!db.INDEXSIZE );
 
 create table rag_properties (
     name     varchar(255) not null primary key,

Modified: roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/SupplementalWeblogServicesTestSuite.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/SupplementalWeblogServicesTestSuite.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/SupplementalWeblogServicesTestSuite.java (original)
+++ roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/SupplementalWeblogServicesTestSuite.java Mon Mar 16 20:40:06 2009
@@ -20,6 +20,7 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.apache.roller.weblogger.business.jpa.JPAOAuthManagerTest;
 
 
 /**
@@ -54,6 +55,8 @@
         // referrers
         suite.addTestSuite(RefererTest.class);
 
+        suite.addTestSuite(JPAOAuthManagerTest.class);
+
         return suite;
     }
     

Added: roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java (added)
+++ roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,87 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+
+package org.apache.roller.weblogger.business.jpa;
+
+import junit.framework.TestCase;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthConsumer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+
+
+/**
+ * Test Weblogger Bookmark Management.
+ */
+public class JPAOAuthManagerTest extends TestCase {    
+    public static Log log = LogFactory.getLog(JPAOAuthManagerTest.class);
+
+    public void setUp() throws Exception {
+        
+        // setup weblogger
+        TestUtils.setupWeblogger();
+        
+        try {
+            TestUtils.endSession(true);
+        } catch (Exception ex) {
+            log.error(ex);
+            throw new Exception("Test setup failed", ex);
+        }
+    }
+    
+    public void tearDown() throws Exception {
+        
+        try {
+            TestUtils.endSession(true);
+        } catch (Exception ex) {
+            log.error("ERROR in tearDown", ex);
+            throw new Exception("Test teardown failed", ex);
+        }
+    }
+
+    public void testCRUD() throws Exception {
+        JPAOAuthManagerImpl omgr = (JPAOAuthManagerImpl)
+            WebloggerFactory.getWeblogger().getOAuthManager();
+
+        String consumerKey = "1111";
+        OAuthConsumer consumer = omgr.addConsumer("dummyusername", consumerKey);
+        TestUtils.endSession(true);
+
+        consumer = omgr.getConsumerByKey(consumer.consumerKey);
+        assertNotNull(consumer);
+        assertEquals(consumerKey, consumer.consumerKey);
+
+        OAuthAccessor accessor = new OAuthAccessor(consumer);
+        accessor.setProperty("userId", "dummyusername");
+        omgr.addAccessor(accessor);
+        TestUtils.endSession(true);
+
+        accessor = omgr.getAccessorByKey(consumerKey);
+        assertNotNull(accessor);
+
+        omgr.removeAccessor(accessor);
+        TestUtils.endSession(true);
+        assertNull(omgr.getAccessorByKey(consumerKey));
+
+        omgr.removeConsumer(consumer);
+        TestUtils.endSession(true);
+        assertNull(omgr.getConsumerByKey(consumerKey));
+    }
+}