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 2012/03/25 23:02:21 UTC
svn commit: r1305130 - in /roller/trunk:
weblogger-business/src/main/resources/org/apache/roller/weblogger/config/
weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/
weblogger-web/src/main/resources/
Author: snoopdave
Date: Sun Mar 25 21:02:21 2012
New Revision: 1305130
URL: http://svn.apache.org/viewvc?rev=1305130&view=rev
Log:
Commiting patch from Nick Padilla for: LDAP Comment Authenticator https://issues.apache.org/jira/browse/ROL-1934
Added:
roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java
Modified:
roller/trunk/weblogger-business/src/main/resources/org/apache/roller/weblogger/config/roller.properties
roller/trunk/weblogger-web/src/main/resources/ApplicationResources.properties
Modified: roller/trunk/weblogger-business/src/main/resources/org/apache/roller/weblogger/config/roller.properties
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/resources/org/apache/roller/weblogger/config/roller.properties?rev=1305130&r1=1305129&r2=1305130&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/resources/org/apache/roller/weblogger/config/roller.properties (original)
+++ roller/trunk/weblogger-business/src/main/resources/org/apache/roller/weblogger/config/roller.properties Sun Mar 25 21:02:21 2012
@@ -160,9 +160,17 @@ comment.throttle.threshold=25
comment.throttle.interval=60
comment.throttle.maxentries=250
+# default port is 389
+comment.authenticator.ldap.port=389
+comment.authenticator.ldap.host=
+# options are "none" "simple" "strong"
+comment.authenticator.ldap.securityLevel=
+
# Plugable comment authentication
comment.authenticator.classname=\
org.apache.roller.weblogger.ui.rendering.plugins.comments.MathCommentAuthenticator
+# custom comment authenticator, using LDAP to ensure the user is able to comment
+#org.apache.roller.weblogger.ui.rendering.plugins.comments.LdapCommentAuthenticator
# pluggable comment validation
comment.validator.classnames=\
Added: roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java?rev=1305130&view=auto
==============================================================================
--- roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java (added)
+++ roller/trunk/weblogger-web/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java Sun Mar 25 21:02:21 2012
@@ -0,0 +1,206 @@
+/*
+ * 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.ui.rendering.plugins.comments;
+
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.config.WebloggerConfig;
+import org.springframework.util.StringUtils;
+
+/**
+ * Requires the commenter to authenticate to a central LDAP server. Here are the roller.properties that need to
+ * be present for this {@link CommentAuthenticator} to work correctly:
+ * <br/>
+ * <pre>
+ * # default port is 389
+ * comment.authenticator.ldap.port=389
+ * # fully qualified host
+ * comment.authenticator.ldap.host=
+ * # name of dc to check against
+ * comment.authenticator.ldap.dc=
+ * # csv list of dc names, ex: example,com
+ * comment.authenticator.ldap.ou=
+ * # options are "none" "simple" "strong", not required
+ * comment.authenticator.ldap.securityLevel=
+ * </pre>
+ * <br/>
+ * You can add these properties to the roller-custom.properties to ensure correct operations. The property "securityLevel
+ * is not required, will use the settings from the registered service provider; sets this property {@link Context#SECURITY_AUTHENTICATION}.
+ * @author Nicholas Padilla (<a href="mailto:nicholas@monstersoftwarellc.com">nicholas@monstersoftwarellc.com</a>)
+ *
+ */
+public class LdapCommentAuthenticator implements CommentAuthenticator {
+
+ private transient ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources");
+
+ private static Log LOG = LogFactory.getLog(LdapCommentAuthenticator.class);
+
+ public String getHtml(HttpServletRequest request) {
+ String ldapUser = "";
+ String ldapPass = "";
+ HttpSession session = request.getSession(true);
+ if (session.getAttribute("ldapUser") == null) {
+ session.setAttribute("ldapUser", "");
+ session.setAttribute("ldapPass", "");
+ } else {
+ // preserve user data
+ String ldapUserTemp = request.getParameter("ldapUser");
+ String ldapPassTemp = request.getParameter("ldapPass");
+ ldapUser = ldapUserTemp != null ? ldapUserTemp : "";
+ ldapPass = ldapPassTemp != null ? ldapPassTemp : "";
+ }
+
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("<p>");
+ sb.append(bundle.getString("comments.ldapAuthenticatorUserName"));
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append("<input name=\"ldapUser\" value=\"");
+ sb.append(ldapUser + "\">");
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append(bundle.getString("comments.ldapAuthenticatorPassword"));
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append("<input type=\"password\" name=\"ldapPass\" value=\"");
+ sb.append(ldapPass + "\">");
+ sb.append("</p>");
+
+ return sb.toString();
+ }
+
+ public boolean authenticate(HttpServletRequest request) {
+ boolean validUser = false;
+ LdapContext context = null;
+
+ String ldapDc = WebloggerConfig.getProperty("comment.authenticator.ldap.dc");
+ String ldapOu = WebloggerConfig.getProperty("comment.authenticator.ldap.ou");
+ String ldapPort = WebloggerConfig.getProperty("comment.authenticator.ldap.port");
+ String ldapHost = WebloggerConfig.getProperty("comment.authenticator.ldap.host");
+ String ldapSecurityLevel = WebloggerConfig.getProperty("comment.authenticator.ldap.securityLevel");
+
+ boolean rollerPropertiesValid = validateRollerProperties(ldapDc, ldapOu, ldapPort, ldapHost);
+
+ String ldapUser = request.getParameter("ldapUser");
+ String ldapPass = request.getParameter("ldapPass");
+
+ boolean userDataValid = validateUsernamePass(ldapUser, ldapPass);
+
+ if(rollerPropertiesValid && userDataValid){
+ try {
+ Hashtable<String,String> env = new Hashtable<String,String>();
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
+ "com.sun.jndi.ldap.LdapCtxFactory");
+ if(ldapSecurityLevel != null
+ && (ldapSecurityLevel.equalsIgnoreCase("none")
+ || ldapSecurityLevel.equalsIgnoreCase("simple")
+ || ldapSecurityLevel.equalsIgnoreCase("strong"))){
+ env.put(Context.SECURITY_AUTHENTICATION, ldapSecurityLevel);
+ }
+ env.put(Context.SECURITY_PRINCIPAL, getQualifedDc(ldapDc, ldapOu, ldapUser));
+ env.put(Context.SECURITY_CREDENTIALS, ldapPass);
+ env.put(Context.PROVIDER_URL, "ldap://" + ldapHost + ":" + ldapPort);
+ context = new InitialLdapContext(env, null);
+ validUser = true;
+ LOG.info("LDAP Authentication Successful. user: " + ldapUser);
+ } catch (Exception e) {
+ // unexpected
+ LOG.error(e);
+ } finally {
+ if(context != null){
+ try {
+ context.close();
+ } catch (NamingException e) {
+ LOG.error(e);
+ }
+ }
+ }
+ }
+ return validUser;
+ }
+
+ /**
+ * Get the username string LDAP expects.
+ * @param ldapDc
+ * @param ldapOu
+ * @param ldapUser
+ * @return
+ */
+ private String getQualifedDc(String ldapDc, String ldapOu, String ldapUser) {
+ String qualifedDc = "";
+ for(String token : StringUtils.delimitedListToStringArray(ldapDc, ",")){
+ if(!qualifedDc.isEmpty()){
+ qualifedDc += ",";
+ }
+ qualifedDc += "dc=" + token;
+ }
+
+ String qualifedUser = "uid=" + ldapUser + ", ou=" + ldapOu + "," + qualifedDc;
+ return qualifedUser;
+ }
+
+ /**
+ * Validate user provided data.
+ * @param ldapUser
+ * @param ldapPass
+ * @return
+ */
+ private boolean validateUsernamePass(String ldapUser, String ldapPass) {
+ boolean ret = false;
+
+ if((ldapUser != null && !ldapUser.isEmpty())
+ && (ldapPass != null && !ldapPass.isEmpty())){
+ ret = true;
+ }
+
+ return ret;
+ }
+
+ /**
+ * Validate required roller.properties, specified in custom-roller.properties.
+ * @param ldapDc
+ * @param ldapOu
+ * @param ldapPort
+ * @param ldapHost
+ * @return
+ */
+ private boolean validateRollerProperties(String ldapDc, String ldapOu, String ldapPort, String ldapHost) {
+ boolean ret = false;
+
+ if((ldapDc != null && !ldapDc.isEmpty())
+ && (ldapOu != null && !ldapOu.isEmpty())
+ && (ldapPort != null && !ldapPort.isEmpty())
+ && (ldapHost != null && !ldapHost.isEmpty())){
+ ret = true;
+ }
+
+ return ret;
+ }
+
+}
Modified: roller/trunk/weblogger-web/src/main/resources/ApplicationResources.properties
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-web/src/main/resources/ApplicationResources.properties?rev=1305130&r1=1305129&r2=1305130&view=diff
==============================================================================
--- roller/trunk/weblogger-web/src/main/resources/ApplicationResources.properties (original)
+++ roller/trunk/weblogger-web/src/main/resources/ApplicationResources.properties Sun Mar 25 21:02:21 2012
@@ -221,6 +221,10 @@ comments.please=Please enter a comment.
comments.disabled=Comments are closed for this entry.
comments.mathAuthenticatorQuestion=Please answer this simple math question
+# not translated
+comments.ldapAuthenticatorUserName=Please provide your Active Directory Username.
+comments.ldapAuthenticatorPassword=Please provide your Active Directory Password.
+# end not translated!
error.commentAuthFailed=Comment authentication failed!
# -------------------------------------------------------- comment validators