/** * $Revision $ * $Date $ * * Copyright (C) 2005-2010 Jive Software. All rights reserved. * * 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.jivesoftware.openfire.plugin.ofsocial; import java.io.File; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import org.apache.tomcat.InstanceManager; import org.apache.tomcat.SimpleInstanceManager; import org.jivesoftware.util.*; import org.jivesoftware.openfire.SessionManager; import org.jivesoftware.openfire.session.LocalClientSession; import org.jivesoftware.openfire.container.Plugin; import org.jivesoftware.openfire.container.PluginManager; import org.jivesoftware.openfire.http.HttpBindManager; import org.jivesoftware.openfire.cluster.ClusterEventListener; import org.jivesoftware.openfire.cluster.ClusterManager; import org.jivesoftware.openfire.XMPPServer; import org.ifsoft.websockets.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.jetty.apache.jsp.JettyJasperInitializer; import org.eclipse.jetty.plus.annotation.ContainerInitializer; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.webapp.WebAppContext; public class OfSocialPlugin implements Plugin, ClusterEventListener { private static final Logger Log = LoggerFactory.getLogger(OfSocialPlugin.class); private final ConcurrentHashMap<String, XMPPServlet.XMPPWebSocket> sockets = new ConcurrentHashMap<String, XMPPServlet.XMPPWebSocket>(); public static OfSocialPlugin self; public String getName() { return "ofsocial"; } public String getDescription() { return "OfSocial Plugin"; } public void initializePlugin(final PluginManager manager, final File pluginDirectory) { ContextHandlerCollection contexts = HttpBindManager.getInstance().getContexts(); self = this; try { ClusterManager.addListener(this); setupWordPress(); Log.info("OfMeet Plugin - Initialize websockets "); // Ensure the JSP engine is initialized correctly (in order to be able to cope with Tomcat/Jasper precompiled JSPs). final List<ContainerInitializer> initializers = new ArrayList<>(); ServletContextHandler context = new ServletContextHandler(contexts, "/ofsocialws", ServletContextHandler.SESSIONS); context.addServlet(new ServletHolder(new XMPPServlet()),"/server"); initializers.add(new ContainerInitializer(new JettyJasperInitializer(), null)); context.setAttribute("org.eclipse.jetty.containerInitializers", initializers); context.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); Log.info("OfSocial Plugin - Initialize PHP"); // Ensure the JSP engine is initialized correctly (in order to be able to cope with Tomcat/Jasper precompiled JSPs). final List<ContainerInitializer> initializers2 = new ArrayList<>(); initializers2.add(new ContainerInitializer(new JettyJasperInitializer(), null)); WebAppContext context2 = new WebAppContext(contexts, pluginDirectory.getPath(), "/ofsocial"); context2.setClassLoader(this.getClass().getClassLoader()); context2.setAttribute("org.eclipse.jetty.containerInitializers", initializers2); context2.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); context2.setWelcomeFiles(new String[]{"index.php"}); } catch (Exception e) { Log.error("Could NOT start open fire meetings", e); } } public void destroyPlugin() { try { for (XMPPServlet.XMPPWebSocket socket : sockets.values()) { try { LocalClientSession session = socket.getSession(); session.close(); SessionManager.getInstance().removeSession( session ); session = null; } catch ( Exception e ) { } } cleanupWordPress(); ClusterManager.removeListener(this); sockets.clear(); } catch (Exception e) { } } public ConcurrentHashMap<String, XMPPServlet.XMPPWebSocket> getSockets() { return sockets; } @Override public void joinedCluster() { Log.info("OfSocial Plugin - joinedCluster"); } @Override public void joinedCluster(byte[] arg0) { } @Override public void leftCluster() { Log.info("OfSocial Plugin - leftCluster"); } @Override public void leftCluster(byte[] arg0) { } @Override public void markedAsSeniorClusterMember() { Log.info("OfSocial Plugin - markedAsSeniorClusterMember"); } private void setupWordPress() { Log.info("Setting WordPress as new auth Provider"); JiveGlobals.setProperty("jdbcAuthProvider.passwordSQL", "SELECT user_pass FROM wp_users WHERE user_login=?"); JiveGlobals.setProperty("jdbcAuthProvider.setPasswordSQL", ""); JiveGlobals.setProperty("jdbcAuthProvider.allowUpdate", "false"); JiveGlobals.setProperty("jdbcAuthProvider.passwordType", "md5"); JiveGlobals.setProperty("jdbcAuthProvider.useConnectionProvider", "true"); JiveGlobals.setProperty("provider.auth.className", "org.jivesoftware.openfire.auth.JDBCAuthProvider"); Log.info("Setting WordPress as user Provider"); JiveGlobals.setProperty("jdbcUserProvider.loadUserSQL", "SELECT user_login, display_name, user_email FROM wp_users WHERE user_login=?"); JiveGlobals.setProperty("jdbcUserProvider.userCountSQL", "SELECT COUNT(*) FROM wp_users"); JiveGlobals.setProperty("jdbcUserProvider.allUsersSQL", "SELECT user_login FROM wp_users"); JiveGlobals.setProperty("jdbcUserProvider.searchSQL", "SELECT user_login FROM wp_users WHERE"); JiveGlobals.setProperty("jdbcUserProvider.user_loginField", "user_login"); JiveGlobals.setProperty("jdbcUserProvider.nameField", "display_name"); JiveGlobals.setProperty("jdbcUserProvider.emailField", "user_email"); JiveGlobals.setProperty("jdbcUserProvider.useConnectionProvider", "true"); JiveGlobals.setProperty("provider.user.className", "org.jivesoftware.openfire.user.JDBCUserProvider"); Log.info("Setting WordPress as group Provider"); JiveGlobals.setProperty("jdbcGroupProvider.groupCountSQL", "SELECT count(*) FROM wp_bp_groups"); JiveGlobals.setProperty("jdbcGroupProvider.allGroupsSQL", "SELECT name FROM wp_bp_groups"); JiveGlobals.setProperty("jdbcGroupProvider.userGroupsSQL", "SELECT name FROM wp_bp_groups INNER JOIN wp_bp_groups_members ON wp_bp_groups.id = wp_bp_groups_members.group_id WHERE wp_bp_groups_members.user_id IN (SELECT ID FROM wp_users WHERE user_login=?) AND is_confirmed=1"); JiveGlobals.setProperty("jdbcGroupProvider.descriptionSQL", "SELECT description FROM wp_bp_groups WHERE name=?"); JiveGlobals.setProperty("jdbcGroupProvider.loadMembersSQL", "SELECT user_login FROM wp_users INNER JOIN wp_bp_groups_members ON wp_users.ID = wp_bp_groups_members.user_id WHERE wp_bp_groups_members.group_id IN (SELECT id FROM wp_bp_groups WHERE name=?) AND user_login<>'admin' AND is_confirmed=1"); JiveGlobals.setProperty("jdbcGroupProvider.loadAdminsSQL", "SELECT user_login FROM wp_users INNER JOIN wp_bp_groups_members ON wp_users.ID = wp_bp_groups_members.user_id WHERE wp_bp_groups_members.group_id IN (SELECT id FROM wp_bp_groups WHERE name=?) AND user_login='admin' AND is_confirmed=1"); JiveGlobals.setProperty("jdbcGroupProvider.useConnectionProvider", "true"); JiveGlobals.setProperty("provider.group.className", "org.jivesoftware.openfire.group.JDBCGroupProvider"); JiveGlobals.setProperty("cache.groupMeta.maxLifetime", "60000"); JiveGlobals.setProperty("cache.group.maxLifetime", "60000"); JiveGlobals.setProperty("cache.userCache.maxLifetime", "60000"); } private void cleanupWordPress() { Log.info("Cleanup WordPress as new auth Provider"); JiveGlobals.deleteProperty("jdbcAuthProvider.passwordSQL"); JiveGlobals.deleteProperty("jdbcAuthProvider.setPasswordSQL"); JiveGlobals.deleteProperty("jdbcAuthProvider.allowUpdate"); JiveGlobals.deleteProperty("jdbcAuthProvider.passwordType"); JiveGlobals.deleteProperty("jdbcAuthProvider.useConnectionProvider"); JiveGlobals.setProperty("provider.auth.className", "org.jivesoftware.openfire.auth.DefaultAuthProvider"); Log.info("Cleanup WordPress as user Provider"); JiveGlobals.deleteProperty("jdbcUserProvider.loadUserSQL"); JiveGlobals.deleteProperty("jdbcUserProvider.userCountSQL"); JiveGlobals.deleteProperty("jdbcUserProvider.allUsersSQL"); JiveGlobals.deleteProperty("jdbcUserProvider.searchSQL"); JiveGlobals.deleteProperty("jdbcUserProvider.user_loginField"); JiveGlobals.deleteProperty("jdbcUserProvider.nameField"); JiveGlobals.deleteProperty("jdbcUserProvider.emailField"); JiveGlobals.deleteProperty("jdbcUserProvider.useConnectionProvider"); JiveGlobals.setProperty("provider.user.className", "org.jivesoftware.openfire.user.DefaultUserProvider"); Log.info("Cleanup WordPress as group Provider"); JiveGlobals.deleteProperty("jdbcGroupProvider.groupCountSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.allGroupsSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.userGroupsSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.descriptionSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.loadMembersSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.loadAdminsSQL"); JiveGlobals.deleteProperty("jdbcGroupProvider.useConnectionProvider"); JiveGlobals.setProperty("provider.group.className", "org.jivesoftware.openfire.group.DefaultGroupProvider"); JiveGlobals.deleteProperty("cache.groupMeta.maxLifetime"); JiveGlobals.deleteProperty("cache.group.maxLifetime"); JiveGlobals.deleteProperty("cache.userCache.maxLifetime"); } }