Featured post

Docker setup for Liferay 7 with MySQL

Tuesday, 6 November 2012

Reset or Recover Admin / User's password by Hook

Sometimes we go through such kind of problem that we lost all the details of Admin user/User or other users and unable to access portal.

One thing we can to rid out of this problem is to change the User_ table directly
 i.e. change it manually.
For That you can follow this link .

But in production we don't have that much access on server side, so what else we can do?
Thanks to Samuel Liu and Lisa Simpson who make this way so easy.

You can create a hook to reset user's password by specifying some properties like user's name, screenName, virtualHost or webId depends on which liferay version you are using.

Here is the link from where you can download/checkout this Hooks as per your liferay version.

If it's not matching your liferay version then create your own hook for this.

1) Create a startup hook.
2) Use PasswordUpdater.java in application.startup.events .


package hu.bzz.liferay;

import java.util.Date;
import java.util.Properties;

import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.model.Company;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.service.persistence.CompanyUtil;

public class PasswordUpdater extends SimpleAction {

public void run(String[] arg0) throws ActionException {
Properties props = new Properties();
try {
String type = props.getProperty("type");

                        //If Liferay version is less than 6.1
String virtualHost = props.getProperty("virtualhost");
Company c = CompanyUtil.fetchByVirtualHost(virtualHost);

                        /* If Liferay version is  6.1

                        String webId = props.getProperty("webId");
Company c = CompanyUtil.fetchByWebId(webId);

User u = null;
String name = null;
if ("screenname".equals(type)) {
String screenName = props.getProperty("screenname");
u = UserLocalServiceUtil.getUserByScreenName(c.getCompanyId(), screenName);
name = screenName;
} else if ("e-mail".equals(type)) {
String emailAddress = props.getProperty("emailaddress");
u = UserLocalServiceUtil.getUserByEmailAddress(c.getCompanyId(), emailAddress);
name = emailAddress;
else {
_log.error("You should set type to screenname or e-mail if you want to use the password updater.");
String password = props.getProperty("password");
UserLocalServiceUtil.updatePasswordManually(u.getUserId(), password, false, true, new Date());
_log.info("Password for " + name + " was updated.");
} catch (Exception e) {

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


3) create "password.changer.properties" in src and put required details.


# type should be e-mail or screenname

# This is the webId of the company (not of communities or organizations!), if you have 1 instance, it's webId most of the time

# This is the virtualhost of the company (not of communities or organizations!), if you have 1 instance, it's localhost most of the time

# Read only if the type is e-mail

# Read only if the type is screename


3) Deploy hook & login with new password which you set in property file.
4) After login, liferay will ask to set up a new password.
5) Undeploy the Hook, so it will not set the password again after server restart.

You are just done, Try & Enjoy the function.............:))

Friday, 7 September 2012

Be careful when you assign user management role to any user

Liferay has very fine grained permission system. But some of the issues require much attention from administrator side.

There is a threat i want to let you know that if you assign any user a role of User Management,
that means He/She has all the rights to change all the users information including Administrator.

So, be careful while you assign this kind of permission to any user.

You are just done, Try & Enjoy the function.............:))

ckEditor does not let copy paste microsoft word formatting like tables, colouring inside table cells

Liferay is using ckeditor, but not responsible for any bug ckeditor has.

Let us see first that how this bug stop us to use copy paste function with formatting from MS Word.

1. Log to the system.
2. Go to control panel > Wiki.
3. Create wiki and add wiki page.
4. Open MicroSoft Word.
5. Create tables format them with colours or etc.
6. Click on this word icon

7. Copy and Paste this content from MS Word to ckeditor.

Expected result : It should copy paste all content with formatting.
Actual Result : It will format the content without any formatting.

Workaround :
1) Create a hook of tomcat-6.0.29\webapps\ROOT\html\js\editor\ckeditor\ckconfig.jsp
2) Append below lines in end of file -


3) Deploy hook & you are done.

You are just done, Try & Enjoy the function.............:))

Monday, 21 May 2012

Create Hook Inside a Portlet, Liferay

Hi Folks,

Yesterday i tried something new, it's easy but useful.

Sometimes we have a requirement where we need a portlet which depends on some extended functionality of Liferay. So in that case we have to create a external hook and provide two wars separately.

Their is an answer, we can create a Portlet which also contains a Hook.

Steps to Go -
1) Create a simple portlet.
2) Put a liferay-hook.xml in WEB-Inf in your portlet.
3) Map the entry, which functionality you want to extend, e.g. portal.properties,stratup-events.
4) Put the require file in place as you put in Hook.

Example : Create a Portlet which extends an startup events by Hook.
1) Create a Hello Portlet.
2) Put liferay-hook.xml in WEB-Inf.
3) Put this entry in liferay-hook.xml file -


4) Create portal.properties in src of Hello portlet.
5) Copy below line to portal.properties -


6) StartupAction is the class which extends SimpleAction and executes strartup events.

You are just done, Try & Enjoy the function.............:))

Tuesday, 15 May 2012

LDAP Group import fails if email address is null for a user

We are trying to import users based on specific groups.

Our Import Search Filter is set properly -

The issue one facing is for one user the email address is not set. So the import is failing.

Question :
Ideally it should skip that user and import the other users but the whole process fails.

Answer :
Here is a response to that question.  It is not a bug.  In order for a user to be authenticated in the
Liferay Portal, five pieces of user data are needed.  Without these, user authentication will fail.

They are:

1.  Screen name
2.  First name
3.  Last name
4.  Email
5.  Password

Resolution :
 So in this case, you need to set:

     users.email.address.required=true to "false."

If require, please take reference from portal.properties in Liferay Source or leave a comment here.

You are just done, Try & Enjoy the function.............:))

Liferay authentication fails for screen name authentication when "mail" attribute is not set in LDAP (AD)

Context : 
1) A valid user in Active Directory exists
2) The "mail" entry is missing in the Active Directory for the user
3) The authentication is set by Screen Name

When tries to login, the authentication fails. This issue is not occurring in other applications using Active Directory

Question :
If it is intended behavior for authentication to fail if email is not configured in LDAP. Is this correct?  If so,

Answer :
Here is a response to that question.  It is not a bug.  In order for a user to be authenticated in the
Liferay Portal, five pieces of user data are needed.  Without these, user authentication will fail.

They are:

1.  Screen name
2.  First name
3.  Last name
4.  Email
5.  Password

Problem :
In My Company all the accounts do not have “mail” attribute set in LDAP. None of the other application has any issue with this. These application can authenticate for all the users. If this is a requirement from liferay that all the users should have their “mail” set in LDAP, that would be a major task.

If the validation is through screen-name. So mail should not be mandatory.

Resolution :
 So in this case, you need to set:

      users.email.address.required=true to "false."
        # Set this to false if you want to be able to create users without an email
        # address. An email address will be automatically assigned to a user based
        # on the property "users.email.address.auto.suffix".

Also, notice this following property from portal.properties.

You can set the suffix of the email address that you desire to be generated for a user who does not have an email address.  This can only be used if the previous property  is set to false.
        # Set the suffix of the email address that will be automatically generated
        # for a user that does not have an email address. This property is not used
        # unless the property "users.email.address.required" is set to false. The
        # autogenerated email address will be the user id plus the specified suffix.


You are just done, Try & Enjoy the function.............:))

Monday, 9 April 2012

Unable to create friendly url mapping with javascript in Liferay

I've set up friendly URL routing for my Liferay portlet, and it's working fine when I generate URLs with the standard JSP tags like so:
<portlet:renderURL var="resetUrl">
    <portlet:param name="start" value="5" />
which, given my mapping, produces a lovely URL like:
But when I generate URLs using the JavaScript PortletURL module, I get the full unfriendly URL. For instance:
var filterUrl = Liferay.PortletURL.createRenderURL();
filterUrl.setPortletId("<%= portletDisplay.getId() %>");
filterUrl.setParameter("start", "5");
location.href = filterUrl;
will generate
So the question is: How can I generate friendly URLs from JavaScript?

Solution : Here is the Hack - Just give it a try
<portlet:renderURL var="resetUrl">
    <portlet:param name="start" value="changeStart" />
then write javascript and replace param values like this -
function createStart(copyNavigationPointURL) {
    var start = document.getElementById("navigationPointId").value;

    copyNavigationPointURL = copyNavigationPointURL.replace(/changeStart/i,start);
    submitForm(document.hrefFm, copyNavigationPointURL);
And you have your friendly url ....

Your are just done, Try & Enjoy the function.....:)