/* * Juick * Copyright (C) 2008-2011, Ugnich Anton * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.www; import com.juick.Message; import com.juick.Tag; import com.juick.User; import com.juick.service.TagService; import com.juick.service.UserService; import com.juick.www.controllers.PageTemplates; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import rocks.xmpp.addr.Jid; import rocks.xmpp.core.XmppException; import rocks.xmpp.core.session.Extension; import rocks.xmpp.core.session.XmppSessionConfiguration; import rocks.xmpp.core.session.debug.LogbackDebugger; import rocks.xmpp.extensions.component.accept.ExternalComponent; import ru.sape.Sape; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Stream; /** * * @author Ugnich Anton */ public class WebApp implements AutoCloseable { private static Logger logger = LoggerFactory.getLogger(WebApp.class); private ExternalComponent xmpp; Environment env; PageTemplates templates; UserService userService; TagService tagService; private String imgDir; private String tmpDir; public WebApp(Environment env, PageTemplates templates, UserService userService, TagService tagService) { this.env = env; this.templates = templates; this.userService = userService; this.tagService = tagService; tmpDir = env.getProperty("upload_tmp_dir", "/var/www/juick.com/i/tmp/"); imgDir = env.getProperty("img_path", "/var/www/juick.com/i/"); boolean isXmppDisabled = BooleanUtils.toBoolean(env.getProperty("xmpp_disabled")); if (!isXmppDisabled) { setupXmppComponent(Jid.of(env.getProperty("www_xmpp_jid", "www.juick.local")), env.getProperty("xmpp_password"), NumberUtils.toInt(env.getProperty("xmpp_port", StringUtils.EMPTY), 5347)); } String sapeUser = env.getProperty("sape_user", StringUtils.EMPTY); if (!Objects.equals(sapeUser, StringUtils.EMPTY)) { templates.sape = new Sape(sapeUser, "juick.com", 2000, 3600); } else { logger.error("Sape is not initialized"); } } @Override public void close() { try { if (xmpp != null) xmpp.close(); logger.error("ExternalComponent on WWW destroyed"); } catch (Exception e) { logger.error("exception on destroy", e); } } public void setupXmppComponent(final Jid componentJid, final String password, final int port) { XmppSessionConfiguration configuration = XmppSessionConfiguration.builder() .extensions(Extension.of(Message.class)) .debugger(LogbackDebugger.class) .build(); xmpp = ExternalComponent.create(componentJid.toString(), password, configuration, "localhost", port); xmpp.addConnectionListener(e -> logger.error(e.toString(), e.getCause())); try { xmpp.connect(); } catch (XmppException e) { logger.error("xmpp extension", e); } } public ExternalComponent getXmpp() { return xmpp; } public com.juick.User getVisitorUser(HttpServletRequest request, HttpServletResponse response) { String hash = Utils.getCookie(request, "hash"); if (hash != null) { com.juick.User visitor = userService.getUserByHash(hash); if (response != null && visitor.getUid() > 0) { response.setHeader("X-Username", visitor.getName()); } return visitor; } else { return new User(); } } public String getImgDir() { return imgDir; } public String getTmpDir() { return tmpDir; } public List parseTags(String tagsStr) { List tags = new ArrayList<>(); if (tagsStr != null && !tagsStr.isEmpty()) { Stream tagsList = Arrays.stream(tagsStr.split("[ \\,]")) .distinct().map( t -> { if (t.startsWith("*")) { t = t.substring(1); } if (t.length() > 64) { t = t.substring(0, 64); } return t; }); tags = tagService.getTags(tagsList.toArray(String[]::new), true); while (tags.size() > 5) { tags.remove(5); } } return tags; } }