Foren

Envoi d'un lien de desabonnement d'une communauté par mail

AMAYAS ABBOUTE, geändert vor 8 Jahren.

Envoi d'un lien de desabonnement d'une communauté par mail

New Member Beiträge: 5 Beitrittsdatum: 26.10.15 Neueste Beiträge
Bonjour,

Je souhaiterai implémenter la fonctionnalité de désabonnement d'une communauté (Wiki, Forum, blog, bibliothèques, etc...) via un lien envoyé par mail.
Prenant l'exemple de la bibliothèque DLLibrary, c'est la classe DLSubscriptionAction.java qui gère l'abonnement et le désabonnement, voici le code de la classe :


package fr.smile.mcc.semaphore.portlet.documentlibrary;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.struts.BaseStrutsPortletAction;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Subscription;
import com.liferay.portal.service.SubscriptionLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortletKeys;

public class DLSubscriptionAction extends BaseStrutsPortletAction {
	@Override
	public void processAction(PortletConfig portletConfig,
			ActionRequest actionRequest, ActionResponse actionResponse)
			throws Exception {
		String actionRequested = actionRequest.getParameter(Constants.CMD);
		_log.info("ACTION REQUESTED = " + actionRequested);
		ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest
				.getAttribute(WebKeys.THEME_DISPLAY);
		if ("subscribe".equals(actionRequested)) {
			SubscriptionLocalServiceUtil.addSubscription(
					themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
					PortletKeys.DOCUMENT_LIBRARY_DISPLAY,
					themeDisplay.getScopeGroupId());
		} else if ("unsubscribe".equals(actionRequested)) {
			Subscription userSub = SubscriptionLocalServiceUtil
					.getSubscription(themeDisplay.getCompanyId(),
							themeDisplay.getUserId(),
							PortletKeys.DOCUMENT_LIBRARY_DISPLAY,
							themeDisplay.getScopeGroupId());
			SubscriptionLocalServiceUtil.deleteSubscription(userSub);
		} else {
			_log.info("Unknown action requested indocuement library : "
					+ actionRequested);
		}
		String redirect = actionRequest.getParameter("redirect");
		_log.info("REDIRECT = " + redirect);
		addSuccessMessage(actionRequest, actionResponse);
		actionResponse.sendRedirect(redirect);
	}
	
	

	protected void addSuccessMessage(ActionRequest actionRequest,
			ActionResponse actionResponse) {

		PortletConfig portletConfig = (PortletConfig) actionRequest
				.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);

		boolean addProcessActionSuccessMessage = GetterUtil.getBoolean(
				portletConfig
						.getInitParameter("add-process-action-success-action"),
				true);

		if (!addProcessActionSuccessMessage) {
			return;
		}

		String successMessage = ParamUtil.getString(actionRequest,
				"successMessage");

		SessionMessages.add(actionRequest, "request_processed", successMessage);
	}

	private static Log _log = LogFactoryUtil.getLog(DLSubscriptionAction.class);
}


Comment utiliser le lien de désabonnement afin que je puisse l'envoyer par mail pour qu'un utilisateur puisse se désabonner sachant que j'ai l'erreur ci-dessous quand j'utilise directement le lien généré par le bouton "se désabonner".


14:01:03,294 ERROR [http-bio-8080-exec-5][render_portlet_jsp:154] com.liferay.portal.security.auth.PrincipalException: /group/comite-semaphore/bibliotheque?p_p_id=110_INSTANCE_bibli1&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_110_INSTANCE_bibli1_struts_action=%2Fdocument_library_display%2Fsubscribe&_110_INSTANCE_bibli1_cmd=unsubscribe&_110_INSTANCE_bibli1_redirect=http%3A%2F%2Flocalhost%3A8080%2Fgroup%2Fcomite-semaphore%2Fbibliotheque%3Fp_p_id%3D110_INSTANCE_bibli1%26p_p_lifecycle%3D0%26p_p_state%3Dnormal%26p_p_mode%3Dview%26p_p_col_id%3Dcolumn-1%26p_p_col_count%3D1
	at com.liferay.portal.struts.PortletRequestProcessor.process(PortletRequestProcessor.java:165)
	at com.liferay.portlet.StrutsPortlet.processAction(StrutsPortlet.java:212)
	at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:70)
	at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:48)
	at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:548)
	at com.liferay.portlet.InvokerPortletImpl.invokeAction(InvokerPortletImpl.java:579)
	at com.liferay.portlet.InvokerPortletImpl.processAction(InvokerPortletImpl.java:294)
	at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:944)
	at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:688)
	at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:249)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:176)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:560)
	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:537)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)


Cordialement,

Amayas
thumbnail
Eric COQUELIN, geändert vor 8 Jahren.

RE: Envoi d'un lien de desabonnement d'une communauté par mail

Expert Beiträge: 254 Beitrittsdatum: 03.11.13 Neueste Beiträge
Vous avez un PrincipalException car vous redirigez vers une page privée (/group/comite-semaphore/bibliotheque) qui nécessite une authentification.
Le mieux est surement de rediriger vers une page publique qui n'en nécessitera pas (/web/comite-semaphore/bibliotheque).
AMAYAS ABBOUTE, geändert vor 8 Jahren.

RE: Envoi d'un lien de desabonnement d'une communauté par mail

New Member Beiträge: 5 Beitrittsdatum: 26.10.15 Neueste Beiträge
Bonjour,

Merci pour votre réponse.

Je ne pense pas que cela vienne du fait que ce soit une page privée d'autant plus que l'authentification est nécessaire pour accéder à cette page là.

Dans la stack trace de l'erreur, j'ai :

at com.liferay.portal.struts.PortletRequestProcessor.process(PortletRequestProcessor.java:165)


ce qui correspond à :

                             if (!PortalUtil.isMethodPost(actionRequest)) {
					String currentURL = PortalUtil.getCurrentURL(actionRequest);

					if (_log.isWarnEnabled()) {
						_log.warn(
							"This URL can only be invoked using POST: " +
								currentURL);
					}
					throw new PrincipalException(currentURL);
				}


La requête est envoyée en POST d'où la PrincipalException.
Darryl Kpizingui, geändert vor 8 Jahren.

RE: Envoi d'un lien de desabonnement d'une communauté par mail

Junior Member Beiträge: 82 Beitrittsdatum: 10.01.13 Neueste Beiträge
Bonjour,

Le code est assez clair à mon avis. L'action ne peut être appelée que par une requête HTTP POST. En mettant le lien dans un e-mail ou en recopiant dans un navigateur, vous effectuez une requête HTTP GET. C'est pour cette raison que vous avez un PrincipalException qui indique que vous n'aviez pas le droit d'aller plus dans cette méthode.

Pour éviter ce contrôle, vous devez surcharger dans votre PortletAction, la méthode protected boolean isCheckMethodOnProcessAction() pour qu'elle retourner false.

En espérant vous avoir aidé.

Cordialement,
Darryl.