/* * Symphony - A modern community (forum/SNS/blog) platform written in Java. * Copyright (C) 2012-2017, b3log.org & hacpai.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.b3log.symphony.processor.advice.validate; import org.apache.commons.lang.StringUtils; import org.b3log.latke.Keys; import org.b3log.latke.ioc.LatkeBeanManager; import org.b3log.latke.ioc.Lifecycle; import org.b3log.latke.ioc.inject.Inject; import org.b3log.latke.ioc.inject.Named; import org.b3log.latke.ioc.inject.Singleton; import org.b3log.latke.service.LangPropsService; import org.b3log.latke.service.LangPropsServiceImpl; import org.b3log.latke.servlet.HTTPRequestContext; import org.b3log.latke.servlet.advice.BeforeRequestProcessAdvice; import org.b3log.latke.servlet.advice.RequestProcessAdviceException; import org.b3log.latke.util.Requests; import org.b3log.latke.util.Strings; import org.b3log.symphony.model.Comment; import org.b3log.symphony.service.ArticleQueryService; import org.b3log.symphony.service.CommentQueryService; import org.b3log.symphony.service.OptionQueryService; import org.b3log.symphony.util.StatusCodes; import org.json.JSONObject; import javax.servlet.http.HttpServletRequest; import java.util.Map; /** * Validates for comment updating locally. * * @author <a href="http://88250.b3log.org">Liang Ding</a> * @version 1.0.0.0, May 6, 2017 * @since 2.1.0 */ @Named @Singleton public class CommentUpdateValidation extends BeforeRequestProcessAdvice { /** * Max comment content length. */ public static final int MAX_COMMENT_CONTENT_LENGTH = 2000; /** * Language service. */ @Inject private LangPropsService langPropsService; /** * Comment query service. */ @Inject private CommentQueryService commentQueryService; /** * Article query service. */ @Inject private ArticleQueryService articleQueryService; /** * Option query service. */ @Inject private OptionQueryService optionQueryService; /** * Validates comment fields. * * @param requestJSONObject the specified request object * @throws RequestProcessAdviceException if validate failed */ private static void validateCommentFields(final JSONObject requestJSONObject) throws RequestProcessAdviceException { final LatkeBeanManager beanManager = Lifecycle.getBeanManager(); final LangPropsService langPropsService = beanManager.getReference(LangPropsServiceImpl.class); final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class); final JSONObject exception = new JSONObject(); exception.put(Keys.STATUS_CODE, StatusCodes.ERR); final String commentContent = StringUtils.trim(requestJSONObject.optString(Comment.COMMENT_CONTENT)); if (Strings.isEmptyOrNull(commentContent) || commentContent.length() > MAX_COMMENT_CONTENT_LENGTH) { throw new RequestProcessAdviceException(exception.put(Keys.MSG, langPropsService.get("commentErrorLabel"))); } if (optionQueryService.containReservedWord(commentContent)) { throw new RequestProcessAdviceException(exception.put(Keys.MSG, langPropsService.get("contentContainReservedWordLabel"))); } } @Override public void doAdvice(final HTTPRequestContext context, final Map<String, Object> args) throws RequestProcessAdviceException { final HttpServletRequest request = context.getRequest(); JSONObject requestJSONObject; try { requestJSONObject = Requests.parseRequestJSONObject(request, context.getResponse()); request.setAttribute(Keys.REQUEST, requestJSONObject); } catch (final Exception e) { throw new RequestProcessAdviceException(new JSONObject().put(Keys.MSG, e.getMessage()). put(Keys.STATUS_CODE, StatusCodes.ERR)); } validateCommentFields(requestJSONObject); } }