org.exoplatform.acceptance.ui.model.CurrentUser.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.acceptance.ui.model.CurrentUser.java

Source

/*
 * Copyright (C) 2011-2014 eXo Platform SAS.
 *
 * This file is part of eXo Acceptance Webapp.
 *
 * eXo Acceptance Webapp 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 3 of
 * the License, or (at your option) any later version.
 *
 * eXo Acceptance Webapp software 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.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with eXo Acceptance Webapp; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see <http://www.gnu.org/licenses/>.
 */
package org.exoplatform.acceptance.ui.model;

import org.exoplatform.acceptance.security.AppAuthority;
import org.exoplatform.acceptance.security.ICrowdUserDetails;

import com.google.common.base.Objects;
import com.google.common.base.Strings;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

/**
 * <p>CurrentUser class.</p>
 *
 * @author Arnaud Hritier ( aheritier@exoplatform.com )
 * @since 2.0.0
 */
@Named("user")
public class CurrentUser {
    @Inject
    @Named("userDetailsService")
    private UserDetailsService userDetailsService;

    private ICrowdUserDetails currentUser;

    /**
     * Returns the user's first name
     *
     * @return a {@link java.lang.String} object.
     */
    public String getFirstName() {
        return getCurrentUser().getFirstName();
    }

    /**
     * Returns the user's last name
     *
     * @return a {@link java.lang.String} object.
     */
    public String getLastName() {
        return getCurrentUser().getLastName();
    }

    /**
     * Returns the user's fullname
     *
     * @return a {@link java.lang.String} object.
     */
    public String getFullName() {
        return getCurrentUser().getFullName();
    }

    /**
     * Returns the user's email
     *
     * @return a {@link java.lang.String} object.
     */
    public String getEmail() {
        return getCurrentUser().getEmail();
    }

    /**
     * Returns the authorities granted to the user. Cannot return <code>null</code>.
     *
     * @return the authorities, sorted by natural key (never <code>null</code>)
     */
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return getCurrentUser().getAuthorities();
    }

    /**
     * Returns the password used to authenticate the user.
     *
     * @return the password
     */
    public String getPassword() {
        return getCurrentUser().getPassword();
    }

    /**
     * Indicates whether the user's account has expired. An expired account cannot be authenticated.
     *
     * @return <code>true</code> if the user's account is valid (ie non-expired), <code>false</code> if no longer valid
     * (ie expired)
     */
    public boolean isAccountNonExpired() {
        return getCurrentUser().isAccountNonExpired();
    }

    /**
     * Indicates whether the user is locked or unlocked. A locked user cannot be authenticated.
     *
     * @return <code>true</code> if the user is not locked, <code>false</code> otherwise
     */
    public boolean isAccountNonLocked() {
        return getCurrentUser().isAccountNonLocked();
    }

    /**
     * Indicates whether the user's credentials (password) has expired. Expired credentials prevent
     * authentication.
     *
     * @return <code>true</code> if the user's credentials are valid (ie non-expired), <code>false</code> if no longer
     * valid (ie expired)
     */
    public boolean isCredentialsNonExpired() {
        return getCurrentUser().isCredentialsNonExpired();
    }

    /**
     * Indicates whether the user is enabled or disabled. A disabled user cannot be authenticated.
     *
     * @return <code>true</code> if the user is enabled, <code>false</code> otherwise
     */
    public boolean isEnabled() {
        return getCurrentUser().isEnabled();
    }

    /**
     * Is the user authenticated ?
     *
     * @return true if the user is authenticated
     */
    public boolean isAuthenticated() {
        return SecurityContextHolder.getContext().getAuthentication() != null
                && SecurityContextHolder.getContext().getAuthentication().isAuthenticated();
    }

    /**
     * Returns the username used to authenticate the user. Cannot return <code>null</code>.
     *
     * @return the username (never <code>null</code>)
     */
    public String getUsername() {
        if (isAuthenticated()) {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof UserDetails) {
                return ((UserDetails) principal).getUsername();
            } else {
                return principal.toString();
            }
        } else {
            throw new UsernameNotFoundException("User not authenticated");
        }
    }

    /**
     * Simple searches for an exactly matching {@link org.springframework.security.core.GrantedAuthority#getAuthority()}.
     * Will always return false if the SecurityContextHolder contains an Authentication with nullprincipal and/or GrantedAuthority[] objects.
     *
     * @param role the GrantedAuthorityString representation to check for
     * @return true if an exact (case sensitive) matching granted authority is located, false otherwise
     */
    public boolean hasRole(String role) {
        if (isAuthenticated()) {
            for (GrantedAuthority authority : SecurityContextHolder.getContext().getAuthentication()
                    .getAuthorities()) {
                if (authority.getAuthority().equals(role)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Checks if the current user is anonymous.
     *
     * @return true only if the user isn't authenticated or has the role ANONYMOUS
     */
    public boolean isAnonymous() {
        return !isAuthenticated() || hasRole(AppAuthority.ROLE_ANONYMOUS.getAuthority());
    }

    /**
     * Checks if the current user has the application USER role.
     *
     * @return true only if the user has the application USER role.
     */
    public boolean isUser() {
        return hasRole(AppAuthority.ROLE_USER.getAuthority());
    }

    /**
     * Checks if the current user has the application ADMIN role.
     *
     * @return true only if the user has the application ADMIN role.
     */
    public boolean isAdmin() {
        return hasRole(AppAuthority.ROLE_ADMIN.getAuthority());
    }

    /**
     * Computes the gravatar URL associated to the user email
     *
     * @param size  The size (width) of the image to generate
     * @param https If the URL must be in HTTPs or no
     * @return The URL of the gravatar
     * @throws java.security.NoSuchAlgorithmException If MD5 Algorithm isn't available
     */
    public String getGravatarUrl(int size, boolean https) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(getCurrentUser().getEmail().trim().toLowerCase().getBytes(Charset.defaultCharset()));
        String hash = Strings.padStart(new BigInteger(1, digest.digest()).toString(16), 32, '0');
        if (https) {
            return "https://secure.gravatar.com/avatar/" + hash + "?s=" + size + "&d=mm";
        } else {
            return "http://www.gravatar.com/avatar/" + hash + "?s=" + size + "&d=mm";
        }
    }

    /**
     * Retrieves the current crowd user.
     *
     * @return a {@link org.exoplatform.acceptance.security.ICrowdUserDetails} object.
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException if any.
     */
    private ICrowdUserDetails getCurrentUser() throws UsernameNotFoundException {
        if (currentUser == null) {
            currentUser = (ICrowdUserDetails) userDetailsService.loadUserByUsername(getUsername());
        }
        return currentUser;
    }

    /**
     * {@inheritDoc}
     * Returns a string representation of the object. In general, the
     * {@code toString} method returns a string that
     * "textually represents" this object. The result should
     * be a concise but informative representation that is easy for a
     * person to read.
     * It is recommended that all subclasses override this method.
     * The {@code toString} method for class {@code Object}
     * returns a string consisting of the name of the class of which the
     * object is an instance, the at-sign character `{@code @}', and
     * the unsigned hexadecimal representation of the hash code of the
     * object. In other words, this method returns a string equal to the
     * value of:
     * <blockquote>
     * <pre>
     * getClass().getName() + '@' + Integer.toHexString(hashCode())
     * </pre></blockquote>
     */
    @Override
    public String toString() {
        return Objects.toStringHelper(this).add("username", getUsername()).add("roles", getAuthorities())
                .toString();
    }

}