Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,22 @@

package com.liferay.portlet.iframe.action;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.portlet.DefaultConfigurationAction;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portlet.iframe.util.IFrameUtil;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import javax.portlet.ReadOnlyException;

/**
* @author Brian Wing Shun Chan
Expand Down Expand Up @@ -65,4 +73,29 @@ public void processAction(
super.processAction(portletConfig, actionRequest, actionResponse);
}

@Override
protected void postProcess(
long companyId, PortletRequest portletRequest,
PortletPreferences portletPreferences)
throws PortalException, SystemException {

String formPassword = portletPreferences.getValue(
"formPassword", StringPool.BLANK);

if (Validator.isNotNull(formPassword) &&
formPassword.contains("@password@")) {

if (!IFrameUtil.isPasswordTokenEnabled(portletRequest)) {
formPassword = formPassword.replaceAll("@password@", "");

try {
portletPreferences.setValue("formPassword", formPassword);
}
catch (ReadOnlyException roe) {
throw new PortalException(roe);
}
}
}
}

}
48 changes: 37 additions & 11 deletions portal-impl/src/com/liferay/portlet/iframe/util/IFrameUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,14 @@ public static String getPassword(
PortletRequest portletRequest, String password)
throws PortalException, SystemException {

if (!isPasswordTokenEnabled(portletRequest)) {
return StringPool.BLANK;
if (Validator.isNotNull(password) && password.equals("@password@")) {
if (isPasswordTokenResolutionEnabled(portletRequest)) {
password = PortalUtil.getUserPassword(portletRequest);
}
}

if (Validator.isNull(password) || password.equals("@password@")) {
password = PortalUtil.getUserPassword(portletRequest);

if (password == null) {
password = StringPool.BLANK;
}
if (password == null) {
password = StringPool.BLANK;
}

return password;
Expand Down Expand Up @@ -82,19 +80,25 @@ else if (userName.equals("@screen_name@")) {
public static boolean isPasswordTokenEnabled(PortletRequest portletRequest)
throws PortalException, SystemException {

if (!PropsValues.SESSION_STORE_PASSWORD) {
return false;
}

ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);

Layout layout = themeDisplay.getLayout();

String roleName = PropsValues.IFRAME_PASSWORD_PASSWORD_TOKEN_ROLE;

if (Validator.isNull(roleName)) {
if (layout.isPrivateLayout() && layout.getGroup().isUser() &&
(themeDisplay.getRealUserId() == layout.getGroup().getClassPK())) {

return true;
}

if (layout.isPrivateLayout() && layout.getGroup().isUser()) {
return true;
if (Validator.isNull(roleName)) {
return false;
}

try {
Expand All @@ -118,6 +122,28 @@ public static boolean isPasswordTokenEnabled(PortletRequest portletRequest)
return false;
}

public static boolean isPasswordTokenResolutionEnabled(
PortletRequest portletRequest)
throws PortalException, SystemException {

if (!PropsValues.SESSION_STORE_PASSWORD) {
return false;
}

ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
WebKeys.THEME_DISPLAY);

Layout layout = themeDisplay.getLayout();

if (layout.isPrivateLayout() && layout.getGroup().isUser() &&
(themeDisplay.getRealUserId() != layout.getGroup().getClassPK())) {

return false;
}

return true;
}

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

}
52 changes: 14 additions & 38 deletions portal-impl/src/com/liferay/portlet/rss/util/RSSWebCacheItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,19 @@

package com.liferay.portlet.rss.util;

import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portal.kernel.util.Time;
import com.liferay.portal.kernel.webcache.WebCacheException;
import com.liferay.portal.kernel.webcache.WebCacheItem;
import com.liferay.portal.security.lang.DoPrivilegedBean;
import com.liferay.portal.util.HttpImpl;
import com.liferay.portal.util.PropsValues;

import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import java.io.InputStream;

/**
* @author Brian Wing Shun Chan
Expand All @@ -44,6 +41,8 @@ public RSSWebCacheItem(String url) {
public Object convert(String key) throws WebCacheException {
SyndFeed feed = null;

InputStream inputstream = null;

try {

// com.liferay.portal.kernel.util.HttpUtil will break the connection
Expand All @@ -61,46 +60,23 @@ public Object convert(String key) throws WebCacheException {
channel = FeedParser.parse(builder, reader);*/

HttpImpl httpImpl = null;

Object httpObject = HttpUtil.getHttp();

if (httpObject instanceof DoPrivilegedBean) {
DoPrivilegedBean doPrivilegedBean =
(DoPrivilegedBean)httpObject;

httpImpl = (HttpImpl)doPrivilegedBean.getActualBean();
}
else {
httpImpl = (HttpImpl)httpObject;
}

HostConfiguration hostConfiguration = httpImpl.getHostConfiguration(
_url);

HttpClient httpClient = httpImpl.getClient(hostConfiguration);

httpImpl.proxifyState(httpClient.getState(), hostConfiguration);

HttpClientParams httpClientParams = httpClient.getParams();

httpClientParams.setConnectionManagerTimeout(
PropsValues.RSS_CONNECTION_TIMEOUT);
httpClientParams.setSoTimeout(PropsValues.RSS_CONNECTION_TIMEOUT);
SyndFeedInput input = new SyndFeedInput();

GetMethod getMethod = new GetMethod(
httpImpl.encodeParameters(_url));
Http.Options options = new Http.Options();

httpClient.executeMethod(hostConfiguration, getMethod);
options.setLocation(_url);
options.setTimeout(PropsValues.RSS_CONNECTION_TIMEOUT);

SyndFeedInput input = new SyndFeedInput();
inputstream = HttpUtil.URLtoInputStream(options);

feed = input.build(
new XmlReader(getMethod.getResponseBodyAsStream()));
feed = input.build(new XmlReader(inputstream));
}
catch (Exception e) {
throw new WebCacheException(_url + " " + e.toString());
}
finally {
StreamUtil.cleanUp(inputstream);
}

return feed;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/

package com.liferay.portlet.wiki.model;

import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.ReflectionUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portlet.wiki.service.persistence.WikiPageUtil;

/**
* @author Tomas Polesovsky
*/
public class CycleDetectorWikiPageModelListener
extends BaseModelListener<WikiPage> {

@Override
public void onBeforeCreate(WikiPage model) throws ModelListenerException {
if (isCycleDetectedInWikiPagesGraph(model)) {
throw new ModelListenerException(
"Unable to create wiki page " + model.getTitle() +
" because a cycle was detected");
}

super.onBeforeCreate(model);
}

@Override
public void onBeforeUpdate(WikiPage model) throws ModelListenerException {
if (isCycleDetectedInWikiPagesGraph(model)) {
throw new ModelListenerException(
"Unable to update wiki page " + model.getTitle() +
" because a cycle was detected");
}

super.onBeforeUpdate(model);
}

protected boolean isCycleDetectedInWikiPagesGraph(WikiPage wikiPage) {
String title = wikiPage.getTitle();

if (Validator.isBlank(title)) {
return false;
}

title = title.trim();

try {
while (wikiPage != null) {
String parentTitle = wikiPage.getParentTitle();

if (Validator.isBlank(parentTitle)) {
return false;
}

parentTitle = parentTitle.trim();

if (StringUtil.equalsIgnoreCase(title, parentTitle)) {
return true;
}

wikiPage = WikiPageUtil.fetchByN_T_H_First(
wikiPage.getNodeId(), wikiPage.getParentTitle(), true,
null);
}
}
catch (SystemException se) {
ReflectionUtil.throwException(se);
}

return false;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/

package com.liferay.portlet.workflowdefinitions.action;

import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.util.PropsValues;

/**
* @author Inácio Nery
*/
public class WorkflowDefinitionPermissionChecker {

public static boolean canPublishWorkflowDefinition(
PermissionChecker permissionChecker) {

if (permissionChecker == null) {
return true;
}

if (PropsValues.WORKFLOW_COMPANY_ADMINISTRATOR_CAN_PUBLISH &&
permissionChecker.isCompanyAdmin()) {

return true;
}

if (permissionChecker.isOmniadmin()) {
return true;
}

return false;
}

}
1 change: 1 addition & 0 deletions portal-impl/src/content/Language.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5679,6 +5679,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, Password, Email Address, First Name, and Last Name). These users will not be imported until these attributes are filled in.
the-address-of-the-email-recipient=The address of the email recipient
the-address-of-the-email-sender=The address of the email sender
the-application-cannot-include-itself=The application cannot include itself.
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below.
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name
the-asset-could-not-be-found=The asset could not be found.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ar.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, Password, Email Address, First Name, and Last Name). These users will not be imported until these attributes are filled in. (Automatic Copy)
the-address-of-the-email-recipient=عنوان البريد الإلكتروني للمستقبل
the-address-of-the-email-sender=عنوان البريد الإلكتروني للمستقبل
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name (Automatic Copy)
the-asset-could-not-be-found=لم يتم العثور على المستخدم.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_bg.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Предходните резултати включват потребители, за които липсват необходимите атрибути (потребителско име, парола, адрес на електронна поща, име и фамилия). Тези потребители няма да бъдат импортирани докато не се попълнят атрибутите.
the-address-of-the-email-recipient=Адрес на получателя на електронна поща
the-address-of-the-email-sender=Адрес на получателя на електронна поща
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Масив от всички стойности на формата, индексирани по име
the-asset-could-not-be-found=Потребителят не може да бъде намерен.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ca.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Els resultats de dalt inclouen usuaris que no tenen els camps requerits (nom d'usuari, contrasenya, adreça de correu electrònic, nom i cognom). Aquests usuaris no seran importats fins que es completin aquests camps.
the-address-of-the-email-recipient=L'adreça del destinatari del correu
the-address-of-the-email-sender=L'adreça del remitent del correu
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Les aplicacions en la pàgina {0} seran reemplaçades per les existents a la pàgina que seleccioni a continuació.
the-array-of-all-form-values-indexed-by-name=La matriu de tots els valors del formulari indexats per nom
the-asset-could-not-be-found=No s'ha trobat el contingut.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_cs.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Níže uvedené položky zahrnují uživatele, kterým chybí potřebné atributy (uživatelské jméno, heslo, e-mailová adresa, křestní jméno, příjmení). Tito uživatelé nebudou importováni, dokud nebudou chybějící atributy doplněny.
the-address-of-the-email-recipient=Adresa příjemce e-mailu
the-address-of-the-email-sender=Adresa odesílatele e-mailu
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Pole všech formulářových hodnot indexovaných podle jména
the-asset-could-not-be-found=Položka nebyla nalezena.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_da.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, adgangskode, e-mail-adresse, First Name, and Last Name). These users will not be imported until these attributes are filled in.
the-address-of-the-email-recipient=The adresse of the email recipient
the-address-of-the-email-sender=The adresse of the email sender
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name (Automatic Copy)
the-asset-could-not-be-found=The webindhold could not be found.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Die oben genannten Resultate umfassen Benutzer, denen erforderlichen Attribute fehlen (Benutzername, Kennwort, E-Mail-Adresse, Vorname und Nachname). Diese Benutzer werden erst importiert wenn diese Attribute ausgefüllt sind.
the-address-of-the-email-recipient=Die Adresse des E-Mail-Empfängers
the-address-of-the-email-sender=Die Adresse des E-Mail-Absenders
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Die Anwendungen auf Seite {0} werden mit denen der unten ausgewählten Seite ersetzt.
the-array-of-all-form-values-indexed-by-name=Alle Formwerte als Array, indiziert durch Namen
the-asset-could-not-be-found=Das Asset konnte nicht gefunden werden.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_el.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Τα ανωτέρω αποτελέσματα περιλαμβάνουν χρήστες από τους οποίους λείπου κάποιες απαραίτητες ιδιότητες (εμφανιζόμενο όνομα, κωδικός πρόσβασης, διεύθυνση email, όνομα, και επώνυμο). Αυτοί οι χρήστες δεν θα εισαχθούν έως ότου να αποκτήσουν τιμή αυτές οι ιδιότητες.
the-address-of-the-email-recipient=Η διεύθυνση του παραλήπτη του email
the-address-of-the-email-sender=Η διεύθυνση αποστολέα του email
the-application-cannot-include-itself=Η εφαρμογή δεν είναι δυνατό να περιλαμβάνουν ίδια. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Ο πίνακας όλων των τιμών της φόρμας με δείκτη το όνομά τους
the-asset-could-not-be-found=Το αντικείμενο δεν βρέθηκε.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, Password, Email Address, First Name, and Last Name). These users will not be imported until these attributes are filled in.
the-address-of-the-email-recipient=The address of the email recipient
the-address-of-the-email-sender=The address of the email sender
the-application-cannot-include-itself=The application cannot include itself.
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below.
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name
the-asset-could-not-be-found=The asset could not be found.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Los resultados de arriba incluyen usuarios que no tienen los campos requeridos (nombre de usuario, contraseña, dirección de correo electrónico, nombre, y apellido). Estos usuarios no serán importados hasta que se completen estos campos.
the-address-of-the-email-recipient=La dirección del receptor del correo electrónico
the-address-of-the-email-sender=La dirección del remitente del email
the-application-cannot-include-itself=La aplicación no puede incluir a sí mismo. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Las aplicaciones en la página {0} serán reemplazadas por las existentes en la página que seleccione a continuación.
the-array-of-all-form-values-indexed-by-name=El array de todos los valores del formulario, indexados por nombre
the-asset-could-not-be-found=El usuario no existe.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_et.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Ülalolevad tulemused sisaldavad kasutajaid, kellel puuduvad nõutud atribuudid (Kuva nimi , Salasõna, E-postiaadress, Eesnimi ja Perekonnanimi). Neid kasutajaid ei impordita kuni nimetatud atribuudid sisestatakse.
the-address-of-the-email-recipient=E-kirja saaja aadress
the-address-of-the-email-sender=E-kirja saaja aadress
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Kõikide vormi väärtuste massiiv, mis on indekseeritud nime järgi
the-asset-could-not-be-found=Kasutajat ei leitud.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_eu.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Goiko emaitzetan beharrezkoak diren atributuak ez dituzten erabiltzaileak daude (pantaila izena, pasahitza, posta elektronikoko helbidea, izena eta abizena). Erabiltzaile hauek ez dira inportatuko atributuak bete arte.
the-address-of-the-email-recipient=Posta elektronikoaren hartzailearen helbidea
the-address-of-the-email-sender=Posta elektronikoaren igorlearen helbidea
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Inprimakiko balio guztien array-a izenez indexatuta
the-asset-could-not-be-found=Edukia ezin izan da aurkitu.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_fa.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, Password, Email Address, First Name, and Last Name). These users will not be imported until these attributes are filled in. (Automatic Copy)
the-address-of-the-email-recipient=The address of the email recipient (Automatic Copy)
the-address-of-the-email-sender=The address of the email sender (Automatic Copy)
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name (Automatic Copy)
the-asset-could-not-be-found=کاربر يافت نشد
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_fi.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5595,6 +5595,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Yllä olevat tulokset sisältävät käyttäjät, joiden pakollisia attribuutteja (Tunnus, Salanasa, Sähköpostiosoite, Etunimi ja Sukunimi) puuttuvat. Näitä käyttäjiä ei tuoda ennen kuin nämä attribuutit on täytetty.
the-address-of-the-email-recipient=Sähköpostin vastaanottajan osoite
the-address-of-the-email-sender=Sähköpostin vastaanottajan osoite
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Sovellukset sivulla {0} tullaan korvaamaan niillä, jotka valitset alta.
the-array-of-all-form-values-indexed-by-name=Taulukko lomakkeen arvoista indeksoituna nimen perusteella.
the-asset-could-not-be-found=Sisältöä ei löydy.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Les résultats ci-dessus incluent les utilisateurs qui manquent les attributs priés (nom d'écran, mot de passe, email address, prénom, et nom de famille). Ces utilisateurs ne seront pas importés jusqu'à ce que ces attributs soient complétés.
the-address-of-the-email-recipient=L'adresse du destinataire d'email
the-address-of-the-email-sender=L'adresse de l'expéditeur d'email
the-application-cannot-include-itself=L’application ne peut pas s’inclure lui-même. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=L'application en page {0} sera remplacée par celles dans la page que vous avez sélectionnée ci-dessous.
the-array-of-all-form-values-indexed-by-name=Le choix de toutes les valeurs de forme a indexé de nom
the-asset-could-not-be-found=Le contenu ne peut être trouvé.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_gl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Os resultados anteditos inclúen aos usuarios que están faltando as calidades requiridas (nome de pantalla, contraseña, email address, nome, e apelido). Non importarán a estes usuarios ata que se completen estas calidades.
the-address-of-the-email-recipient=O enderezo do receptor do correo electrónico
the-address-of-the-email-sender=O enderezo do remitente de correo electrónico
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=A ristra de todos os valores do formulario indexados polo nome
the-asset-could-not-be-found=O elemento non foi atopado.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_hi_IN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=ऊपर परिणाम उपयोगकर्ताओं को जो याद आ रही है (स्क्रीन नाम, पासवर्ड, ईमेल पते, प्रथम नाम, और अंतिम नाम) आवश्यक विशेषताएँ शामिल हैं। इन उपयोगकर्ताओं को आयात नहीं की जा जाएगा जब तक इन विशेषताओं भर रहे हैं। (Automatic Translation)
the-address-of-the-email-recipient=ईमेल प्राप्तकर्ता के पते
the-address-of-the-email-sender=ईमेल sender के पते
the-application-cannot-include-itself=अनुप्रयोग ही शामिल नहीं कर सकते। (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=सभी प्रपत्र नाम से अनुक्रमित मानों की सरणी (Automatic Translation)
the-asset-could-not-be-found=User पाया नहीं जा सका|
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_hr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Gornji rezultati uključuju i korisnike kojma nedostaju neophodni atributi (Ime na zaslonu, lozinka, e-mail adresa, ime i prezime). Ti korisnici će biti uvezeni kad se ti atributi popune.
the-address-of-the-email-recipient=Adresa primatelja email poruke
the-address-of-the-email-sender=Adresu e-pošte pošiljatelja
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Niz svih oblika vrijednosti indeksirane po imenu
the-asset-could-not-be-found=Sadržaj nije pronađen.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_hu.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=A fenti eredmények tartalmazzák azokat a felhasználókat is, akiknek nincs meg a szükséges tulajdonsága (képernyőnév, jelszó, e-mail cím, keresztnév és vezetéknév). Ezek a felhasználók nem kerülnek importálásra, amíg ezeket a tulajdonságokat ki nem töltik.
the-address-of-the-email-recipient=E-mail címzettje
the-address-of-the-email-sender=E-mail feladója
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=A(z) {0} oldalon található alkalmazások le lesznek cserélve azokkal, amik az általad alább kiválasztott oldalon vannak.
the-array-of-all-form-values-indexed-by-name=űrlap összes értékét tartalmazó tömb, pozíció szerint indexelve.
the-asset-could-not-be-found=A tartalom nem található.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_in.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Hasil tersebut di atas termasuk pengguna yang hilang pada atribut yang diperlukan (Nama layar, Password, Alamat Email, Nama Pertama, dan Nama Belakang). Pengguna jenis ini tidak akan diimpor sampai atribut-atribut ini terisi
the-address-of-the-email-recipient=Alamat email penerima
the-address-of-the-email-sender=Nama pengirim email
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Susunan dari semua nilai Formulir diindeks oleh nama
the-asset-could-not-be-found=Pengguna tidak dapat ditemukan.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_it.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=I risultati di cui sopra includono gli utenti che stanno mancando gli attributi richiesti (nome di schermo, parola d'accesso, email address, nome e cognome). Questi utenti non saranno importati fino a riempire questi attributi.
the-address-of-the-email-recipient=Indirizzo del destinatario dell'email
the-address-of-the-email-sender=L'indirizzo del mittente dell'email
the-application-cannot-include-itself=L'applicazione non può includere se stesso. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Le applicazioni nella pagina {0} saranno rimpiazzate con quelle nella pagina che hai selezionato sotto.
the-array-of-all-form-values-indexed-by-name=L'allineamento di tutti i valori della forma ha spostato ad incrementi per nome
the-asset-could-not-be-found=L'utente non è stato trovato.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_iw.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=התוצאות מעלה כוללות משתמשים ללא המאפיינים הדרושים (שם מסך, סיסמא, כתובת דוא"ל, שם פרטי ושם משפחה). משתמשים אלה לא ייובאו עד שמאפיינים אלה ימולאו.
the-address-of-the-email-recipient=כתובת מקבל האימייל
the-address-of-the-email-sender=כתובת שולח האימייל
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=היישומים בדף {0} יוחלפו עם אלה שבדף שתבחר להלן.
the-array-of-all-form-values-indexed-by-name=מערך של כל ערכי הטפסים ממופתח לפי שם
the-asset-could-not-be-found=לא ניתן למצוא את הנכס.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ja.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=上記の結果は必須属性(スクリーン名、パスワード、電子メールアドレス、名および名字)がないユーザーを含んでいます。これらのユーザーはこれらの属性が記入されるまでインポートされません。
the-address-of-the-email-recipient=受信者のメールアドレス
the-address-of-the-email-sender=送信者のメールアドレス
the-application-cannot-include-itself=アプリケーションは、それ自体を含めることはできません。 (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=以下選択されたものは{0}ページに存在するアプリケーションと入れ替えられます。
the-array-of-all-form-values-indexed-by-name=名前によって指定された全てのフォーム値の配列
the-asset-could-not-be-found=データが見つかりません。
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ko.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5596,6 +5596,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=위 결과는 필수 속성 (스크린 이름, 암호, 이메일 주소, 이름 및 성)를 놓치고 있는 사용자를 포함한다. 이 사용자는 이 속성이 기입될 때까지 수입되지 않을 것이다.
the-address-of-the-email-recipient=전자 우편 수령인의 주소
the-address-of-the-email-sender=전자 우편 수령인의 주소
the-application-cannot-include-itself=응용 프로그램 자체를 포함할 수 없습니다. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=모든 형성 가치의 배열은 이름으로 색인을 붙였다
the-asset-could-not-be-found=사용자는 발견될 수 없었다.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_lo.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=ຜົນລັບຂ້າງເທິງປະກອບມີກຸ່ມຕ່າງທ ເຊິງຂາດລັກສະນະຕ່າງໆ(ຊື່ໜ້າຈໍ, ລະຫັດຜ່ານ, ທີ່ຢູ່ອີເມວ, ຊື່ ແລະນາມສະກຸນ). ຜູ້ເຫຼົ່ານີ້ຈະບໍ່ສາມາດນຳເຂົ້າຈົນກວ່າລັກສະນະຕ່າງໆນີ້ຈະຖືກເພີ່ມໃສ່
the-address-of-the-email-recipient=ທີ່ຢູ່ອີເມວຂອງຜູ້ຮັບ
the-address-of-the-email-sender=ທີ່ຢູ່ອີເມວຂອງຜູ້ສົ່ງ
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=ລັກສະນະຕ່າງຂອງມູນຄ່າລວມທັງໝົດແມ່ນຈັດຕາມຊື່
the-asset-could-not-be-found=ບໍ່ສາມາດຊອກຫາຊັບພະຍາກອນໄດ້
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_lt.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=The above results include users which are missing the required attributes (Screen Name, Password, Email Address, First Name, and Last Name). These users will not be imported until these attributes are filled in. (Automatic Copy)
the-address-of-the-email-recipient=The address of the email recipient (Automatic Copy)
the-address-of-the-email-sender=The address of the email sender (Automatic Copy)
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name (Automatic Copy)
the-asset-could-not-be-found=The asset could not be found. (Automatic Copy)
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_nb.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Resultatene inkluderer brukere som mangler påkrevde atributter (brukernavn, passord, e-postadresse, fornanv og etternavn). Disse brukerne vil ikke bli importert før disse atributtene er fylt inn.
the-address-of-the-email-recipient=Adressen til e-post mottakeren
the-address-of-the-email-sender=Adressen til e-postavsender
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Applikasjonene på siden {0} vil erstattes med applikasjonen på siden du velger nedenfor.
the-array-of-all-form-values-indexed-by-name=Rekken av alle skjemaverdier indeksert etter navn
the-asset-could-not-be-found=Resursen ble ikke funnet.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_nl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Bovenstaande resultaten bevatten groepen die de verplichte kenmerken (gebruikersnaam, wachtwoord, e-mailadres, voornaam en achternaam) missen. Deze groepen worden pas geïmporteerd als de betreffende kenmerken zijn opgegeven.
the-address-of-the-email-recipient=Adres van de e-mailontvanger
the-address-of-the-email-sender=Adres van de e-mailafzender
the-application-cannot-include-itself=De aanvraag kan niet zelf bevatten. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=De toepassingen in pagina {0} worden vervangen door de toepassingen in de pagina die u hieronder hebt geselecteerd.
the-array-of-all-form-values-indexed-by-name=Matrix van alle formulierwaarden, geïndexeerd op naam
the-asset-could-not-be-found=De content werd niet gevonden.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_nl_BE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=De bovengenoemde resultaten omvatten gebruikers die de vereiste eigenschappen missen (schermnaam, wachtwoord, e-mailadres, voornaam en achternaam). Deze gebruikers zullen niet ingevoerd worden tot deze eigenschappen worden ingevuld.
the-address-of-the-email-recipient=Adres van de e-mailontvanger
the-address-of-the-email-sender=Adres van de e-mailafzender
the-application-cannot-include-itself=De aanvraag kan niet zelf bevatten. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=De serie van alle formulierwaarden geïndexeerd op naam
the-asset-could-not-be-found=De gebruiker kon niet worden gevonden.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_pl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Powyższe wyniki zawierają użytkowników, którym brakuje wymaganych atrybutów (Nazwa użytkownika, Hasło, Adres email, Imię oraz Nazwisko). Użytkownicy Ci nie zostaną zaimportowani, dopóki atrybuty te nie zostaną wypełnione.
the-address-of-the-email-recipient=Adres odbiorcy emaila
the-address-of-the-email-sender=Adres email nadawcy
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Tablica wszystkich wartości formularza indeksowane po nazwie
the-asset-could-not-be-found=Treść nie została znaleziona.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_pt_BR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Os resultados acima incluem usuários em que estão faltando atributos obrigatórios (nome de exibição, senha, email, nome e sobrenome). Estes usuários não serão importados até que estes atributos estejam preenchidos.
the-address-of-the-email-recipient=O endereço de email do destinatário
the-address-of-the-email-sender=O endereço de email do remetente
the-application-cannot-include-itself=O aplicativo não é possível incluir em si. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=As aplicações na página {0} serão substituídas por aquelas da página selecionada abaixo.
the-array-of-all-form-values-indexed-by-name=O grupo todos os valores do formulário indexados pelo nome
the-asset-could-not-be-found=O conteúdo não pôde ser encontrado.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_pt_PT.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Os resultados acima incluem os usuários que estão faltando os atributos exigidos (nome de tela, senha, email address, nome, e apelido). Estes usuários não serão importados até que estes atributos estejam preenchidos.
the-address-of-the-email-recipient=O endereço do receptor do email
the-address-of-the-email-sender=O endereço do receptor do email
the-application-cannot-include-itself=O aplicativo não é possível incluir em si. (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=A disposição de todos os valores do formulário posicionados pelo nome
the-asset-could-not-be-found=O usuário não poderia ser encontrado.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ro.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Rezultatele de deasupra includ utilizatori carora le lipsesc atributele necesare (Nume se Utilziator, Adresa Email, Prenume și Nume de Familie).Acesti utilizatori nu vor fi importati pana cand aceste atribute sunt completate.
the-address-of-the-email-recipient=Adresa de Email a destinatarului.
the-address-of-the-email-sender=Adresa de Email a expeditorului.
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Lista a tuturor valorilor indexate dupa nume
the-asset-could-not-be-found=Utilizatorul nu a putut fi gasit.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_ru.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=В результаты выше включены пользователи, у которых отсутствуют обязательные атрибуты (Экранное имя, Пароль, Почтовый адрес(email), Имя, Фамилия). Эти пользователи не будут импортированы, пока не будут заполнены эти атрибуты.
the-address-of-the-email-recipient=Адрес получателя письма
the-address-of-the-email-sender=Адрес отправителя письма
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Приложения на странице {0} будут заменены на приложения со страницы выбранной ниже.
the-array-of-all-form-values-indexed-by-name=Массив всех значений формы, индексированный по названию
the-asset-could-not-be-found=Материал не найден.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_sk.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Horeuvedené výsledky zahŕňajú používateľov, ktorým chýbajú povinné atribúty (používateľské meno, heslo, e-mailová adresa, krstné meno, priezvisko). Títo používatelia nebudú importovaní pokiaľ nebudú mať tieto atribúty vyplnené.
the-address-of-the-email-recipient=E-mail adresa adresáta.
the-address-of-the-email-sender=Adresa odosielateľa e-mailu.
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=Aplikácie na stránke {0} budú nahradené aplikáciami zo stránky, ktorú ste vybrali nižšie.
the-array-of-all-form-values-indexed-by-name=Pole všetkých formulárových hodnôt indexovaných podľa mena
the-asset-could-not-be-found=Príspevok sa nenašiel.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_sl.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Med zgornjimi rezultati so tudi uporabniki, ki nimajo določenih vseh zahtevanih lastnosti (prikazno ime, geslo, e-pošta, ime, priimek). Ti uporabniki ne bodo uvoženi, dokler ne bodo vnešene vse zahtevane lastnosti.
the-address-of-the-email-recipient=Naslov prejemnika e-pošte
the-address-of-the-email-sender=Naslov prejemnika e-pošte
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Niz vseh vrednosti obrazca urejen po imenu
the-asset-could-not-be-found=Uporabnika ni moč najti.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_sr_RS.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Резултати изнад укључују кориснике којима недостају потребни атрибути (Екранско Име, Лозинка, Е-мејл Адреса, Име и Презиме). Ови корисници неће бити увезени све док ови атрибути не буду попуњени.
the-address-of-the-email-recipient=Адреса од примаоца е-поште
the-address-of-the-email-sender=Адреса од пошиљаоца е-поште
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Низ свих облика вредности индексирани по имену
the-asset-could-not-be-found=Средство није пронађено.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_sr_RS_latin.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Rezultati iznad uključuju korisnike kojima nedostaju potrebni atributi (Ekransko Ime, Lozinka, E-mejl Adresa, Ime i Prezime). Ovi korisnici neće biti uvezeni sve dok ovi atributi ne budu popunjeni.
the-address-of-the-email-recipient=Adresa od primaoca e-pošte
the-address-of-the-email-sender=Adresa od pošiljaoca e-pošte
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Niz svih oblika vrednosti indeksirani po imenu
the-asset-could-not-be-found=Sredstvo nije pronađeno.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_sv.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Resultaten ovan innehåller användare som saknar något av de obligatoriska fälten (användarnamn, lösenord, epost, förnamn, efternamn). Dessa användare kommer inte importeras förrän dessa fält har fyllts i.
the-address-of-the-email-recipient=Adressen till e-postmottagaren
the-address-of-the-email-sender=Adressen till e-postavsändaren
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=En array med alla fältvärden indexerad på namn.
the-asset-could-not-be-found=Innehållet kunde inte hittas.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_tr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=YUkarıdaki sonuçlar gerekli nitelikleri (Ekran Adı, Şifre, E-posta Adresi, Adı, Soyadı) eksik olan kullanıcıları gösterir. Bu kullanıcılar bu nitelikleri doldurulmadıkça içe aktarılmayacaktır.
the-address-of-the-email-recipient=E-posta alıcısının adresi
the-address-of-the-email-sender=E-posta alıcısının adresi
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=The array of all form values indexed by name (Automatic Copy)
the-asset-could-not-be-found=Kullanıcı bulunamadı.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_uk.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=В результаті вище включені користувачі, у яких відсутні обов'язкові атрибути (екранне ім'я, ароль, поштова адреса(email), ім'я, прізвище). Ці користувачі не будуть импортовані, доки не будуть заповнені ці атрибути.
the-address-of-the-email-recipient=Адреса отримувача пошти
the-address-of-the-email-sender=Адреса отримувача пошти
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Масив всіх значень форми, індексований по назві
the-asset-could-not-be-found=Користувач не знайдений.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_vi.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=Kết quả dưới đây chứa những người dùng thiếu những thuộc tính bắt buộc (Tên giao diện, mật khẩu, địa chỉ thư điện tử, tên và họ). Những người dùng này sẽ không được nhập khẩu cho đến khi các thuộc tính này có đầy đủ.
the-address-of-the-email-recipient=Địa chỉ thư điện tử của người nhận
the-address-of-the-email-sender=Địa chỉ thư điện tử của người gửi
the-application-cannot-include-itself=The application cannot include itself. (Automatic Copy)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=The applications in page {0} will be replaced with the ones in the page you select below. (Automatic Copy)
the-array-of-all-form-values-indexed-by-name=Mảng của toàn bộ giá trị được sắp xếp theo tên
the-asset-could-not-be-found=Tài sản không thể được tìm thấy.
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_zh_CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=上述结果包括缺少必要属性(屏幕显示名称、密码、邮箱地址、姓名)的用户。除非这些属性被填写否则这些用户将不被导入。
the-address-of-the-email-recipient=邮件收件人地址
the-address-of-the-email-sender=邮件发件人地址
the-application-cannot-include-itself=应用程序不能包括本身。 (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=在页面{0}的应用程序将被你在下面选中的应用程序所代替。
the-array-of-all-form-values-indexed-by-name=按名称索引的所有表单值的数组
the-asset-could-not-be-found=找不到相应asset。
Expand Down
1 change: 1 addition & 0 deletions portal-impl/src/content/Language_zh_TW.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5597,6 +5597,7 @@ the-above-results-include-groups-which-are-missing-the-required-attributes-(grou
the-above-results-include-users-which-are-missing-the-required-attributes-(screen-name,-password,-email-address,-first-name,-and-last-name).-these-users-will-not-be-imported-until-these-attributes-are-filled-in=上述結果包括漏掉必須的屬性(螢幕名稱、密碼、電子郵件位址、名與姓)的使用者。這些使用者將不會匯入直到這些屬性被填上。
the-address-of-the-email-recipient=電子郵件接收人位址
the-address-of-the-email-sender=電子郵件寄件人位址
the-application-cannot-include-itself=應用程式不能包括本身。 (Automatic Translation)
the-applications-in-page-x-will-be-replaced-with-the-ones-in-the-page-you-select-below=這應用程式在頁面 {0} 將會以您在以下選擇的頁面中的應用程式所取代。
the-array-of-all-form-values-indexed-by-name=所有表單值陣列以名稱索引
the-asset-could-not-be-found=找不到資產。
Expand Down
330 changes: 308 additions & 22 deletions portal-impl/src/portal.properties

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions portal-impl/src/system.properties
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,15 @@
#
#org.apache.lucene.writeLockTimeout=30000

##
## Tika
##

#
# Set the location of the Tika configuration.
#
tika.config=tika/tika.xml

##
## Quartz
##
Expand Down
59 changes: 59 additions & 0 deletions portal-impl/src/tika/tika.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0"?>

<properties>
<parsers>
<parser class="org.apache.tika.parser.asm.ClassParser" />
<parser class="org.apache.tika.parser.audio.AudioParser" />
<parser class="org.apache.tika.parser.audio.MidiParser" />
<parser class="org.apache.tika.parser.chm.ChmParser" />
<parser class="org.apache.tika.parser.code.SourceCodeParser" />
<parser class="org.apache.tika.parser.dif.DIFParser" />
<parser class="org.apache.tika.parser.dwg.DWGParser" />
<parser class="org.apache.tika.parser.epub.EpubParser" />
<parser class="org.apache.tika.parser.executable.ExecutableParser" />
<parser class="org.apache.tika.parser.external.CompositeExternalParser" />
<parser class="org.apache.tika.parser.feed.FeedParser" />
<parser class="org.apache.tika.parser.font.AdobeFontMetricParser" />
<parser class="org.apache.tika.parser.font.TrueTypeParser" />
<parser class="org.apache.tika.parser.gdal.GDALParser" />
<parser class="org.apache.tika.parser.grib.GribParser" />
<parser class="org.apache.tika.parser.hdf.HDFParser" />
<parser class="org.apache.tika.parser.html.HtmlParser" />
<parser class="org.apache.tika.parser.image.BPGParser" />
<parser class="org.apache.tika.parser.image.ImageParser" />
<parser class="org.apache.tika.parser.image.PSDParser" />
<parser class="org.apache.tika.parser.image.TiffParser" />
<parser class="org.apache.tika.parser.image.WebPParser" />
<parser class="org.apache.tika.parser.iptc.IptcAnpaParser" />
<parser class="org.apache.tika.parser.isatab.ISArchiveParser" />
<parser class="org.apache.tika.parser.iwork.IWorkPackageParser" />
<parser class="org.apache.tika.parser.jdbc.SQLite3Parser" />
<parser class="org.apache.tika.parser.jpeg.JpegParser" />
<parser class="org.apache.tika.parser.mail.RFC822Parser" />
<parser class="org.apache.tika.parser.mat.MatParser" />
<parser class="org.apache.tika.parser.mbox.MboxParser" />
<parser class="org.apache.tika.parser.mbox.OutlookPSTParser" />
<parser class="org.apache.tika.parser.microsoft.OfficeParser" />
<parser class="org.apache.tika.parser.microsoft.OldExcelParser" />
<parser class="org.apache.tika.parser.microsoft.TNEFParser" />
<parser class="org.apache.tika.parser.microsoft.ooxml.OOXMLParser" />
<parser class="org.apache.tika.parser.mp3.Mp3Parser" />
<parser class="org.apache.tika.parser.mp4.MP4Parser" />
<parser class="org.apache.tika.parser.netcdf.NetCDFParser" />
<parser class="org.apache.tika.parser.ocr.TesseractOCRParser" />
<parser class="org.apache.tika.parser.odf.OpenDocumentParser" />
<parser class="org.apache.tika.parser.pdf.PDFParser" />
<parser class="org.apache.tika.parser.pkg.CompressorParser" />
<parser class="org.apache.tika.parser.pkg.PackageParser" />
<parser class="org.apache.tika.parser.rtf.RTFParser" />
<parser class="org.apache.tika.parser.txt.TXTParser" />
<parser class="org.apache.tika.parser.video.FLVParser" />
<parser class="org.apache.tika.parser.xml.DcXMLParser" />
<parser class="org.apache.tika.parser.xml.FictionBookParser" />
<parser class="org.gagravarr.tika.FlacParser" />
<parser class="org.gagravarr.tika.OggParser" />
<parser class="org.gagravarr.tika.OpusParser" />
<parser class="org.gagravarr.tika.SpeexParser" />
<parser class="org.gagravarr.tika.VorbisParser" />
</parsers>
</properties>
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/

package com.liferay.portlet.wiki.model;

import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.test.ExecutionTestListeners;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.model.Group;
import com.liferay.portal.service.GroupLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.ServiceTestUtil;
import com.liferay.portal.test.EnvironmentExecutionTestListener;
import com.liferay.portal.test.LiferayIntegrationJUnitTestRunner;
import com.liferay.portal.test.Sync;
import com.liferay.portal.test.SynchronousDestinationExecutionTestListener;
import com.liferay.portal.util.GroupTestUtil;
import com.liferay.portal.util.TestPropsValues;
import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
import com.liferay.portlet.wiki.util.WikiTestUtil;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
* @author Tomas Polesovsky
*/
@ExecutionTestListeners(listeners = {
EnvironmentExecutionTestListener.class,
SynchronousDestinationExecutionTestListener.class
})
@RunWith(LiferayIntegrationJUnitTestRunner.class)
@Sync
public class CycleDetectorWikiPageModelListenerTest {

@Before
public void setUp() throws Exception {
ServiceTestUtil.setUser(TestPropsValues.getUser());

_group = GroupTestUtil.addGroup();

_node = WikiTestUtil.addNode(
TestPropsValues.getUserId(), _group.getGroupId(),
ServiceTestUtil.randomString(), ServiceTestUtil.randomString(50));
}

@After
public void tearDown() throws Exception {
GroupLocalServiceUtil.deleteGroup(_group);
}

@Test
public void testCycle() throws Exception {
WikiPage wikiPage1 = WikiPageLocalServiceUtil.addPage(
TestPropsValues.getUserId(), _node.getNodeId(), "Title1",
StringPool.BLANK, StringPool.BLANK, true, new ServiceContext());

WikiPage wikiPage2 = WikiPageLocalServiceUtil.addPage(
TestPropsValues.getUserId(), _node.getNodeId(), "Title2",
StringPool.BLANK, StringPool.BLANK, true, new ServiceContext());

WikiPage wikiPage3 = WikiPageLocalServiceUtil.addPage(
TestPropsValues.getUserId(), _node.getNodeId(), "Title3",
StringPool.BLANK, StringPool.BLANK, true, new ServiceContext());

try {
wikiPage1.setParentTitle("Title2");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage1);

wikiPage2.setParentTitle("Title3");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage2);

wikiPage3.setParentTitle("Title1");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage3);

Assert.fail();
}
catch (ModelListenerException mle) {
String message = mle.getMessage();

Assert.assertEquals(
"Unable to update wiki page Title3 because a cycle was " +
"detected",
message);
}

try {
wikiPage3.setParentTitle("Other");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage3);

wikiPage1.setTitle("Other");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage1);

Assert.fail();
}
catch (ModelListenerException mle) {
String message = mle.getMessage();

Assert.assertEquals(
"Unable to update wiki page Other because a cycle was detected",
message);
}
}

@Test
public void testSelfReferencingWikiPage() throws Exception {
String title = "Cycling Page";

String parentTitle = title;

try {
WikiPageLocalServiceUtil.addPage(
TestPropsValues.getUserId(), _node.getNodeId(), title,
WikiPageConstants.VERSION_DEFAULT, StringPool.BLANK,
StringPool.BLANK, false, "creole", false, parentTitle,
StringPool.BLANK, new ServiceContext());

Assert.fail();
}
catch (ModelListenerException mle) {
String message = mle.getMessage();

Assert.assertEquals(
"Unable to create wiki page " + title +
" because a cycle was detected",
message);
}
}

@Test
public void testSelfReferencingWikiPageDelayedSet() throws Exception {
WikiPage wikiPage1 = WikiPageLocalServiceUtil.addPage(
TestPropsValues.getUserId(), _node.getNodeId(), "Title",
StringPool.BLANK, StringPool.BLANK, true, new ServiceContext());

try {
wikiPage1.setParentTitle("Title");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage1);

Assert.fail();
}
catch (ModelListenerException mle) {
String message = mle.getMessage();

Assert.assertEquals(
"Unable to update wiki page Title because a cycle was detected",
message);
}

try {
wikiPage1.setParentTitle("Other Title");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage1);

wikiPage1.setTitle("Other Title");

WikiPageLocalServiceUtil.updateWikiPage(wikiPage1);

Assert.fail();
}
catch (ModelListenerException mle) {
String message = mle.getMessage();

Assert.assertEquals(
"Unable to update wiki page Other Title because a cycle was " +
"detected",
message);
}
}

private Group _group;

private WikiNode _node;

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@

package com.liferay.portal.jsonwebservice;

import com.liferay.portal.jsonwebservice.action.JSONWebServiceInvokerAction;
import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceAction;
import com.liferay.portal.kernel.util.StringBundler;

import jodd.typeconverter.TypeConversionException;

import junit.framework.TestCase;

import org.junit.BeforeClass;
Expand Down Expand Up @@ -96,4 +99,63 @@ public void testAttack2() throws Exception {
}
}

@Test(expected = TypeConversionException.class)
public void testAttack3NotOnWhitelistCall() throws Exception {
MockHttpServletRequest mockHttpServletRequest = createHttpRequest(
"/invoke");

mockHttpServletRequest.setParameter("cmd", "{\"/open/run3\":{}}");
mockHttpServletRequest.setParameter(
"+object:java.io.ObjectInputStream", "{}");

JSONWebServiceAction jsonWebServiceAction =
new JSONWebServiceInvokerAction(mockHttpServletRequest);

jsonWebServiceAction.invoke();
}

@Test(expected = IllegalArgumentException.class)
public void testAttack3UtilCall() throws Exception {
MockHttpServletRequest mockHttpServletRequest = createHttpRequest(
"/invoke");

mockHttpServletRequest.setParameter("cmd", "{\"/open/run3\":{}}");
mockHttpServletRequest.setParameter(
"+object:com.liferay.portal.kernel.bean.PortalBeanLocatorUtil",
"{\"beanLocator\":null}");

JSONWebServiceAction jsonWebServiceAction =
new JSONWebServiceInvokerAction(mockHttpServletRequest);

jsonWebServiceAction.invoke();
}

@Test
public void testAttack3ValidCall() throws Exception {
MockHttpServletRequest mockHttpServletRequest = createHttpRequest(
"/invoke");

mockHttpServletRequest.setParameter("cmd", "{\"/open/run3\":{}}");
mockHttpServletRequest.setParameter("+object:java.lang.Object", "{}");

JSONWebServiceAction jsonWebServiceAction =
new JSONWebServiceInvokerAction(mockHttpServletRequest);

jsonWebServiceAction.invoke();
}

@Test
public void testAttack3WhitelistedByPropertiesCall() throws Exception {
MockHttpServletRequest mockHttpServletRequest = createHttpRequest(
"/invoke");

mockHttpServletRequest.setParameter("cmd", "{\"/open/run3\":{}}");
mockHttpServletRequest.setParameter("+object:java.util.Date", "0");

JSONWebServiceAction jsonWebServiceAction =
new JSONWebServiceInvokerAction(mockHttpServletRequest);

jsonWebServiceAction.invoke();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@ public static void run1(List<Long> fooIds) {
public static void run2(byte[] bytes) {
}

public static void run3(Object object) {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.liferay.portal.kernel.portlet;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
Expand Down Expand Up @@ -75,6 +76,12 @@ public String getParameter(PortletRequest portletRequest, String name) {
return ParamUtil.getString(portletRequest, name);
}

protected void postProcess(
long companyId, PortletRequest portletRequest,
PortletPreferences portletPreferences)
throws PortalException, SystemException {
}

@Override
public void processAction(
PortletConfig portletConfig, ActionRequest actionRequest,
Expand Down Expand Up @@ -126,6 +133,9 @@ public void processAction(
}
}

postProcess(
themeDisplay.getCompanyId(), actionRequest, portletPreferences);

if (SessionErrors.isEmpty(actionRequest)) {
try {
portletPreferences.store();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,6 @@ public static void write(

try {
outputStream = response.getOutputStream();

Range fullRange = new Range(0, fullLength - 1, fullLength);

Range firstRange = null;
Expand All @@ -338,7 +337,7 @@ public static void write(
setHeaders(
request, response, fileName, contentType, null, fullRange);

copyRange(
_copyRange(
inputStream, outputStream, fullRange.getStart(),
fullRange.getLength());
}
Expand All @@ -356,7 +355,7 @@ else if (ranges.size() == 1) {

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

copyRange(
_copyRange(
inputStream, outputStream, range.getStart(),
range.getLength());
}
Expand All @@ -381,22 +380,38 @@ else if (ranges.size() > 1 ) {

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

for (int i = 0; i < ranges.size(); i++) {
Range range = ranges.get(i);
boolean sequentialRangeList = _isSequentialRangeList(ranges);

if (!sequentialRangeList) {
inputStream = _toRandomAccessInputStream(inputStream);
}

Range previousRange = null;

for (Range curRange : ranges) {
servletOutputStream.println();
servletOutputStream.println(
StringPool.DOUBLE_DASH + boundary);
servletOutputStream.println(
HttpHeaders.CONTENT_TYPE + ": " + contentType);
servletOutputStream.println(
HttpHeaders.CONTENT_RANGE + ": " +
range.getContentRange());
curRange.getContentRange());
servletOutputStream.println();

inputStream = copyRange(
inputStream, outputStream, range.getStart(),
range.getLength());
long start = curRange.getStart();

if (sequentialRangeList) {
if (previousRange != null) {
start -= previousRange.getEnd() + 1;
}

previousRange = curRange;
}

_copyRange(
inputStream, servletOutputStream, start,
curRange.getLength());
}

servletOutputStream.println();
Expand All @@ -405,11 +420,18 @@ else if (ranges.size() > 1 ) {
}
}
finally {
try {
inputStream.close();
}
catch (IOException ioe) {
if (outputStream != null) {
try {
outputStream.close();
}
catch (IOException ioe) {
if (_log.isDebugEnabled()) {
_log.debug(ioe);
}
}
}

StreamUtil.cleanUp(inputStream);
}
}

Expand Down Expand Up @@ -644,47 +666,17 @@ public static void write(HttpServletResponse response, String s)
}
}

/**
* @deprecated As of 7.0.0, with no direct replacement
*/
@Deprecated
protected static InputStream copyRange(
InputStream inputStream, OutputStream outputStream, long start,
long length)
throws IOException {

if (inputStream instanceof FileInputStream) {
FileInputStream fileInputStream = (FileInputStream)inputStream;

FileChannel fileChannel = fileInputStream.getChannel();

fileChannel.transferTo(
start, length, Channels.newChannel(outputStream));

return fileInputStream;
}
else if (inputStream instanceof ByteArrayInputStream) {
ByteArrayInputStream byteArrayInputStream =
(ByteArrayInputStream)inputStream;

byteArrayInputStream.reset();
byteArrayInputStream.skip(start);

StreamUtil.transfer(byteArrayInputStream, outputStream, length);

return byteArrayInputStream;
}
else if (inputStream instanceof RandomAccessInputStream) {
RandomAccessInputStream randomAccessInputStream =
(RandomAccessInputStream)inputStream;

randomAccessInputStream.seek(start);

StreamUtil.transfer(
randomAccessInputStream, outputStream, StreamUtil.BUFFER_SIZE,
false, length);

return randomAccessInputStream;
}

return copyRange(
new RandomAccessInputStream(inputStream), outputStream, start,
return _copyRange(
_toRandomAccessInputStream(inputStream), outputStream, start,
length);
}

Expand Down Expand Up @@ -809,6 +801,94 @@ protected static void setHeaders(
}
}

private static InputStream _copyRange(
InputStream inputStream, OutputStream outputStream, long start,
long length)
throws IOException {

if (inputStream instanceof ByteArrayInputStream) {
ByteArrayInputStream byteArrayInputStream =
(ByteArrayInputStream)inputStream;

byteArrayInputStream.reset();

byteArrayInputStream.skip(start);

StreamUtil.transfer(
byteArrayInputStream, outputStream, StreamUtil.BUFFER_SIZE,
false, length);

return byteArrayInputStream;
}
else if (inputStream instanceof FileInputStream) {
FileInputStream fileInputStream = (FileInputStream)inputStream;

FileChannel fileChannel = fileInputStream.getChannel();

fileChannel.transferTo(
start, length, Channels.newChannel(outputStream));

return fileInputStream;
}
else if (inputStream instanceof RandomAccessInputStream) {
RandomAccessInputStream randomAccessInputStream =
(RandomAccessInputStream)inputStream;

randomAccessInputStream.seek(start);

StreamUtil.transfer(
randomAccessInputStream, outputStream, StreamUtil.BUFFER_SIZE,
false, length);

return randomAccessInputStream;
}

inputStream.skip(start);

StreamUtil.transfer(
inputStream, outputStream, StreamUtil.BUFFER_SIZE, false, length);

return inputStream;
}

private static boolean _isRandomAccessSupported(InputStream inputStream) {
if (inputStream instanceof ByteArrayInputStream ||
inputStream instanceof FileInputStream ||
inputStream instanceof RandomAccessInputStream) {

return true;
}

return false;
}

private static boolean _isSequentialRangeList(List<Range> ranges) {
Range previousRange = null;

for (Range range : ranges) {
if ((previousRange != null) &&
(range.getStart() <= previousRange.getEnd())) {

return false;
}

previousRange = range;
}

return true;
}

private static InputStream _toRandomAccessInputStream(
InputStream inputStream)
throws IOException {

if (_isRandomAccessSupported(inputStream)) {
return inputStream;
}

return new RandomAccessInputStream(inputStream);
}

private static final String _CLIENT_ABORT_EXCEPTION =
"org.apache.catalina.connector.ClientAbortException";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@
*/
public interface TemplateConstants {

public static final String[] ALLOWED_LANG_TYPES = {
TemplateConstants.LANG_TYPE_CSS, TemplateConstants.LANG_TYPE_FTL,
TemplateConstants.LANG_TYPE_TPL, TemplateConstants.LANG_TYPE_VM,
TemplateConstants.LANG_TYPE_XSL
};

public static final String CLASS_NAME_ID = "class_name_id";

public static final String DEFAUT_ENCODING = StringPool.UTF8;
Expand All @@ -34,6 +40,8 @@ public interface TemplateConstants {

public static final String LANG_TYPE_FTL = "ftl";

public static final String LANG_TYPE_TPL = "tpl";

public static final String LANG_TYPE_VM = "vm";

public static final String LANG_TYPE_XSL = "xsl";
Expand Down
18 changes: 18 additions & 0 deletions portal-service/src/com/liferay/portal/kernel/util/Http.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package com.liferay.portal.kernel.util;

import java.io.IOException;
import java.io.InputStream;

import java.net.URL;

Expand Down Expand Up @@ -170,6 +171,14 @@ public String parameterMapToString(
public byte[] URLtoByteArray(String location, boolean post)
throws IOException;

public InputStream URLtoInputStream(Http.Options options)
throws IOException;

public InputStream URLtoInputStream(String location) throws IOException;

public InputStream URLtoInputStream(String location, boolean post)
throws IOException;

public String URLtoString(Http.Options options) throws IOException;

public String URLtoString(String location) throws IOException;
Expand Down Expand Up @@ -390,6 +399,10 @@ public Response getResponse() {
return _response;
}

public int getTimeout() {
return _timeout;
}

public boolean isDelete() {
if (_method == Method.DELETE) {
return true;
Expand Down Expand Up @@ -540,6 +553,10 @@ public void setResponse(Response response) {
_response = response;
}

public void setTimeout(int timeout) {
_timeout = timeout;
}

private Auth _auth;
private Body _body;
private Cookie[] _cookies;
Expand All @@ -552,6 +569,7 @@ public void setResponse(Response response) {
private PortletRequest _portletRequest;
private String _progressId;
private Response _response = new Response();
private int _timeout;

}

Expand Down
25 changes: 25 additions & 0 deletions portal-service/src/com/liferay/portal/kernel/util/HttpUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.liferay.portal.kernel.security.pacl.permission.PortalSocketPermission;

import java.io.IOException;
import java.io.InputStream;

import java.net.URL;

Expand Down Expand Up @@ -397,6 +398,30 @@ public static byte[] URLtoByteArray(String location, boolean post)
return getHttp().URLtoByteArray(location, post);
}

public static InputStream URLtoInputStream(Http.Options options)
throws IOException {

PortalSocketPermission.checkConnect(options);

return getHttp().URLtoInputStream(options);
}

public static InputStream URLtoInputStream(String location)
throws IOException {

PortalSocketPermission.checkConnect(location);

return getHttp().URLtoInputStream(location);
}

public static InputStream URLtoInputStream(String location, boolean post)
throws IOException {

PortalSocketPermission.checkConnect(location);

return getHttp().URLtoInputStream(location, post);
}

public static String URLtoString(Http.Options options) throws IOException {
PortalSocketPermission.checkConnect(options);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,18 @@ public static InetAddress getLoopbackInetAddress()
return InetAddress.getByName("127.0.0.1");
}

public static boolean isLocalInetAddress(InetAddress inetAddress) {
if (inetAddress.isAnyLocalAddress() ||
inetAddress.isLinkLocalAddress() ||
inetAddress.isLoopbackAddress() ||
inetAddress.isSiteLocalAddress()) {

return true;
}

return false;
}

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

private static class LocalHostNameHolder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ public interface PropsKeys {

public static final String CACHE_CONTENT_THRESHOLD_SIZE = "cache.content.threshold.size";

public static final String CACHE_FILE_NAME_CONTRIBUTORS = "cache.file.name.contributors";

public static final String CALENDAR_EMAIL_EVENT_REMINDER_BODY = "calendar.email.event.reminder.body";

public static final String CALENDAR_EMAIL_EVENT_REMINDER_ENABLED = "calendar.email.event.reminder.enabled";
Expand Down Expand Up @@ -1267,6 +1269,8 @@ public interface PropsKeys {

public static final String JPA_PROVIDER_PROPERTY_PREFIX = "jpa.provider.property.";

public static final String JSON_DESERIALIZATION_WHITELIST_CLASS_NAMES = "json.deserialization.whitelist.class.names";

public static final String JSON_DESERIALIZER_STRICT_MODE = "json.deserializer.strict.mode";

public static final String JSON_SERVICE_AUTH_TOKEN_ENABLED = "json.service.auth.token.enabled";
Expand All @@ -1281,6 +1285,8 @@ public interface PropsKeys {

public static final String JSONWS_WEB_SERVICE_INVALID_HTTP_METHODS = "jsonws.web.service.invalid.http.methods";

public static final String JSONWS_WEB_SERVICE_PARAMETER_TYPE_WHITELIST_CLASS_NAMES = "jsonws.web.service.parameter.type.whitelist.class.names";

public static final String JSONWS_WEB_SERVICE_PATHS_EXCLUDES = "jsonws.web.service.paths.excludes";

public static final String JSONWS_WEB_SERVICE_PATHS_INCLUDES = "jsonws.web.service.paths.includes";
Expand Down Expand Up @@ -2791,6 +2797,8 @@ public interface PropsKeys {

public static final String WIKI_RSS_ABSTRACT_LENGTH = "wiki.rss.abstract.length";

public static final String WORKFLOW_COMPANY_ADMINISTRATOR_CAN_PUBLISH = "workflow.company.administrator.can.publish";

public static final String XML_SECURITY_ENABLED = "xml.security.enabled";

public static final String XML_VALIDATION_ENABLED = "xml.validation.enabled";
Expand Down
2 changes: 2 additions & 0 deletions portal-service/src/com/liferay/portal/util/Portal.java
Original file line number Diff line number Diff line change
Expand Up @@ -1300,6 +1300,8 @@ public boolean isLoginRedirectRequired(HttpServletRequest request)

public boolean isOmniadmin(long userId);

public boolean isOmniadmin(User user);

public boolean isReservedParameter(String name);

public boolean isRightToLeft(HttpServletRequest request);
Expand Down
4 changes: 4 additions & 0 deletions portal-service/src/com/liferay/portal/util/PortalUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -1822,6 +1822,10 @@ public static boolean isOmniadmin(long userId) {
return getPortal().isOmniadmin(userId);
}

public static boolean isOmniadmin(User user) {
return getPortal().isOmniadmin(user);
}

public static boolean isReservedParameter(String name) {
return getPortal().isReservedParameter(name);
}
Expand Down
2 changes: 1 addition & 1 deletion portal-web/docroot/WEB-INF/liferay-portlet.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1522,7 +1522,7 @@
<portlet-url-class>com.liferay.portal.struts.StrutsActionPortletURL</portlet-url-class>
<control-panel-entry-category>configuration</control-panel-entry-category>
<control-panel-entry-weight>4.0</control-panel-entry-weight>
<control-panel-entry-class>com.liferay.portal.workflow.WorkflowControlPanelEntry</control-panel-entry-class>
<control-panel-entry-class>com.liferay.portal.workflow.ControlPanelWorkflowControlPanelEntry</control-panel-entry-class>
<preferences-owned-by-group>true</preferences-owned-by-group>
<use-default-template>false</use-default-template>
<private-request-attributes>false</private-request-attributes>
Expand Down
5 changes: 1 addition & 4 deletions portal-web/docroot/WEB-INF/portlet-custom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1053,10 +1053,7 @@
<preferences-validator>org.portletbridge.portlet.PortletBridgePortletValidator</preferences-validator>
</portlet-preferences>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
<role-name>administrator</role-name>
</security-role-ref>
</portlet>
<portlet>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ portletURL.setParameter("struts_action", "/workflow_definitions/view");
<aui:input name="file" type="file" />

<aui:button-row>
<aui:button type="submit" />
<c:if test="<%= WorkflowDefinitionPermissionChecker.canPublishWorkflowDefinition(permissionChecker) %>">
<aui:button type="submit" />
</c:if>

<aui:button href="<%= redirect %>" type="cancel" />
</aui:button-row>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<%@ page import="com.liferay.portal.kernel.deploy.DeployManagerUtil" %><%@
page import="com.liferay.portal.kernel.workflow.RequiredWorkflowDefinitionException" %><%@
page import="com.liferay.portal.kernel.workflow.WorkflowDefinitionFileException" %><%@
page import="com.liferay.portal.kernel.workflow.WorkflowException" %>
page import="com.liferay.portal.kernel.workflow.WorkflowException" %><%@
page import="com.liferay.portlet.workflowdefinitions.action.WorkflowDefinitionPermissionChecker" %>

<%@ include file="/html/portlet/workflow_definitions/init-ext.jsp" %>
34 changes: 18 additions & 16 deletions portal-web/docroot/html/portlet/workflow_definitions/toolbar.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,29 @@ String toolbarItem = ParamUtil.getString(request, "toolbarItem");

<aui:nav-bar>
<aui:nav>
<portlet:renderURL var="viewDefinitionsURL">
<portlet:param name="struts_action" value="/workflow_definitions/view" />
<portlet:param name="tabs1" value="workflow-definitions" />
</portlet:renderURL>
<c:if test="<%= WorkflowDefinitionPermissionChecker.canPublishWorkflowDefinition(permissionChecker) %>">
<portlet:renderURL var="viewDefinitionsURL">
<portlet:param name="struts_action" value="/workflow_definitions/view" />
<portlet:param name="tabs1" value="workflow-definitions" />
</portlet:renderURL>

<portlet:renderURL var="addWorkflowDefinitionURL">
<portlet:param name="struts_action" value="/workflow_definitions/edit_workflow_definition" />
<portlet:param name="tabs1" value="workflow-definitions" />
<portlet:param name="redirect" value="<%= viewDefinitionsURL %>" />
<portlet:param name="backURL" value="<%= viewDefinitionsURL %>" />
</portlet:renderURL>
<portlet:renderURL var="addWorkflowDefinitionURL">
<portlet:param name="struts_action" value="/workflow_definitions/edit_workflow_definition" />
<portlet:param name="tabs1" value="workflow-definitions" />
<portlet:param name="redirect" value="<%= viewDefinitionsURL %>" />
<portlet:param name="backURL" value="<%= viewDefinitionsURL %>" />
</portlet:renderURL>

<c:if test='<%= DeployManagerUtil.isDeployed("kaleo-designer-portlet") %>'>
<c:if test='<%= DeployManagerUtil.isDeployed("kaleo-designer-portlet") %>'>

<%
String taglibHREF = "javascript:Liferay.Util.getOpener()." + renderResponse.getNamespace() + "openKaleoDesigner('', '0', '', Liferay.Util.getWindowName());";
%>
<%
String taglibHREF = "javascript:Liferay.Util.getOpener()." + renderResponse.getNamespace() + "openKaleoDesigner('', '0', '', Liferay.Util.getWindowName());";
%>

<aui:nav-item href="<%= taglibHREF %>" iconCssClass="icon-plus" label='<%= LanguageUtil.format(pageContext, "add-new-x", "definition") %>' />
<aui:nav-item href="<%= taglibHREF %>" iconCssClass="icon-plus" label='<%= LanguageUtil.format(pageContext, "add-new-x", "definition") %>' />
</c:if>
<aui:nav-item href="<%= addWorkflowDefinitionURL %>" iconCssClass="icon-upload" label="upload-definition" selected='<%= toolbarItem.equals("add") %>' />
</c:if>
<aui:nav-item href="<%= addWorkflowDefinitionURL %>" iconCssClass="icon-upload" label="upload-definition" selected='<%= toolbarItem.equals("add") %>' />
</aui:nav>
</aui:nav-bar>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,23 @@ WorkflowDefinition workflowDefinition = (WorkflowDefinition)row.getObject();
%>

<liferay-ui:icon-menu>
<portlet:renderURL var="editURL">
<portlet:param name="struts_action" value="/workflow_definitions/edit_workflow_definition" />
<portlet:param name="<%= Constants.CMD %>" value="<%= Constants.UPDATE %>" />
<portlet:param name="redirect" value="<%= currentURL %>" />
<portlet:param name="name" value="<%= workflowDefinition.getName() %>" />
<portlet:param name="version" value="<%= String.valueOf(workflowDefinition.getVersion()) %>" />
</portlet:renderURL>
<c:if test="<%= WorkflowDefinitionPermissionChecker.canPublishWorkflowDefinition(permissionChecker) %>">
<portlet:renderURL var="editURL">
<portlet:param name="struts_action" value="/workflow_definitions/edit_workflow_definition" />
<portlet:param name="<%= Constants.CMD %>" value="<%= Constants.UPDATE %>" />
<portlet:param name="redirect" value="<%= currentURL %>" />
<portlet:param name="name" value="<%= workflowDefinition.getName() %>" />
<portlet:param name="version" value="<%= String.valueOf(workflowDefinition.getVersion()) %>" />
</portlet:renderURL>

<liferay-ui:icon
image="post"
message='<%= LanguageUtil.format(pageContext, "add-new-x", "file") %>'
url="<%= editURL %>"
/>
<liferay-ui:icon
image="post"
message='<%= LanguageUtil.format(pageContext, "add-new-x", "file") %>'
url="<%= editURL %>"
/>
</c:if>

<c:if test='<%= DeployManagerUtil.isDeployed("kaleo-designer-portlet") %>'>
<c:if test='<%= WorkflowDefinitionPermissionChecker.canPublishWorkflowDefinition(permissionChecker) && DeployManagerUtil.isDeployed("kaleo-designer-portlet") %>'>

<%
String taglibOnClick = "javascript:Liferay.Util.getOpener()." + renderResponse.getNamespace() + "openKaleoDesigner('" + HtmlUtil.escapeJS(workflowDefinition.getName()) + "', '" + workflowDefinition.getVersion() + "', '', Liferay.Util.getWindowName());";
Expand All @@ -49,7 +51,7 @@ WorkflowDefinition workflowDefinition = (WorkflowDefinition)row.getObject();
/>
</c:if>

<c:if test="<%= !workflowDefinition.isActive() %>">
<c:if test="<%= WorkflowDefinitionPermissionChecker.canPublishWorkflowDefinition(permissionChecker) && !workflowDefinition.isActive() %>">
<portlet:actionURL var="restoreWorkflowDefinitionURL">
<portlet:param name="struts_action" value="/workflow_definitions/edit_workflow_definition" />
<portlet:param name="<%= Constants.CMD %>" value="<%= Constants.RESTORE %>" />
Expand Down
25 changes: 25 additions & 0 deletions portal-web/docroot/html/taglib/portlet/runtime/error.jsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<%--
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
--%>

<%@ include file="/html/taglib/init.jsp" %>

<%
String errorMessage = (String)request.getAttribute("liferay-portlet:runtime:errorMessage");
%>

<div class="alert alert-warning lfr-configurator-visibility lfr-meta-actions">
<%= errorMessage %>
</div>
35 changes: 35 additions & 0 deletions util-taglib/src/com/liferay/taglib/portletext/RuntimeTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletContainerUtil;
Expand All @@ -25,6 +26,8 @@
import com.liferay.portal.kernel.portlet.RestrictPortletServletRequest;
import com.liferay.portal.kernel.servlet.DynamicServletRequest;
import com.liferay.portal.kernel.servlet.PipingServletResponse;
import com.liferay.portal.kernel.servlet.PortalIncludeUtil;
import com.liferay.portal.kernel.util.AutoResetThreadLocal;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.PrefixPredicateFilter;
import com.liferay.portal.kernel.util.StringPool;
Expand All @@ -40,6 +43,7 @@

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -103,6 +107,26 @@ public static void doTag(
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);

Stack<String> embeddedPortletIds = _embeddedPortletIds.get();

if (embeddedPortletIds == null) {
embeddedPortletIds = new Stack<String>();

_embeddedPortletIds.set(embeddedPortletIds);
}

if (embeddedPortletIds.search(portletId) > -1) {
String errorMessage = LanguageUtil.get(
pageContext, "the-application-cannot-include-itself");

request.setAttribute(
"liferay-portlet:runtime:errorMessage", errorMessage);

PortalIncludeUtil.include(pageContext, _ERROR_PAGE);

return;
}

if (themeDisplay.isStateMaximized()) {
LayoutTypePortlet layoutTypePortlet =
themeDisplay.getLayoutTypePortlet();
Expand Down Expand Up @@ -150,8 +174,12 @@ public static void doTag(
PortletJSONUtil.writeHeaderPaths(response, jsonObject);
}

embeddedPortletIds.push(portletId);

PortletContainerUtil.render(request, response, portlet);

embeddedPortletIds.pop();

if (jsonObject != null) {
PortletJSONUtil.writeFooterPaths(response, jsonObject);
}
Expand Down Expand Up @@ -223,8 +251,15 @@ protected static Portlet getPortlet(long companyId, String portletId)
return portlet;
}

private static final String _ERROR_PAGE =
"/html/taglib/portlet/runtime/error.jsp";

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

private static final ThreadLocal<Stack<String>> _embeddedPortletIds =
new AutoResetThreadLocal<Stack<String>>(
RuntimeTag.class + "._embeddedPortletIds");

private String _defaultPreferences;
private String _portletName;
private String _queryString;
Expand Down