All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jpaoletti.jpm.hibernate.security.db.PMSecurityDBConnector Maven / Gradle / Ivy

The newest version!
package jpaoletti.jpm.hibernate.security.db;

import java.util.ArrayList;
import java.util.List;
import jpaoletti.jpm.core.PMException;
import jpaoletti.jpm.core.exception.ConnectionNotFoundException;
import jpaoletti.jpm.hibernate.security.*;
import jpaoletti.jpm.security.core.*;
import org.hibernate.Session;

import org.hibernate.criterion.Restrictions;

/**
 * Security connector that uses an hibernate session and a database support
 * for authentication.
 *
 */
public class PMSecurityDBConnector extends PMSecurityAbstractConnector {

    /**
     * Get hibernate session from the context
     */
    protected Session getDb() {
        return (Session) getCtx().getPersistenceManager().getConnection();
    }

    @Override
    public PMSecurityUser getUser(String username) throws PMSecurityException {
        try {
            final SECUser dbuser = getDBUser(username);
            if (dbuser == null) {
                throw new UserNotFoundException();
            }
            return convert(dbuser);
        } catch (ConnectionNotFoundException ex) {
            throw new PMSecurityException(ex);
        }
    }

    public SECUser getDBUser(String username) throws PMSecurityException, ConnectionNotFoundException {
        final Session db = getDb();
        SECUser u = null;
        try {
            u = (SECUser) db.createCriteria(SECUser.class).add(Restrictions.eq("nick", username)).uniqueResult();
            if (u != null) {
                db.refresh(u);
            }
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
        return u;
    }

    @Override
    public List getUsers() throws PMSecurityException {
        final List result = new ArrayList();
        try {
            final List users = getDb().createCriteria(SECUser.class).list();
            for (SECUser u : users) {
                result.add(convert(u));
            }
        } catch (PMSecurityException e) {
            throw e;
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
        return result;
    }

    @Override
    public void addUser(PMSecurityUser user) throws PMSecurityException {
        try {
            if (getDBUser(user.getUsername().toLowerCase()) != null) {
                throw new UserAlreadyExistException();
            }
            checkUserRules(user.getUsername(), user.getPassword());
            final SECUser secuser = unconvert(null, user);
            secuser.setPassword(encrypt(user.getPassword()));
            getDb().save(secuser);
        } catch (PMSecurityException e) {
            throw e;
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
    }

    @Override
    public void updateUser(PMSecurityUser user) throws PMSecurityException {
        try {
            checkUserRules(user.getUsername(), user.getPassword());
            SECUser secuser = getDBUser(user.getUsername());
            secuser = unconvert(secuser, user);
            getDb().update(secuser);
        } catch (PMSecurityException e) {
            throw e;
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
    }

    @Override
    public PMSecurityUserGroup getGroup(String groupname) throws PMSecurityException {
        return convert(getDBGroup(groupname));
    }

    public SECUserGroup getDBGroup(String groupname) throws PMSecurityException {
        try {
            return (SECUserGroup) getDb().createCriteria(SECUserGroup.class).add(Restrictions.eq("name", groupname)).uniqueResult();
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
    }

    @Override
    public List getGroups() throws PMSecurityException {
        final List groups = new ArrayList();
        final List ug = getDb().createCriteria(SECUserGroup.class).list();
        for (SECUserGroup g : ug) {
            groups.add(convert(g));
        }
        return groups;
    }

    @Override
    public void addGroup(PMSecurityUserGroup group) throws PMSecurityException {
        try {
            if (getDBGroup(group.getName()) != null) {
                throw new GroupAlreadyExistException();
            }

            final SECUserGroup secuserg = unconvert(null, group);

            getDb().save(secuserg);
        } catch (PMSecurityException e) {
            throw e;
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
    }

    @Override
    public void updateGroup(PMSecurityUserGroup group) throws PMSecurityException {
        try {
            final Session db = getDb();
            SECUserGroup secuserg = getDBGroup(group.getName());
            db.refresh(secuserg);
            secuserg = unconvert(secuserg, group);
            db.update(secuserg);
        } catch (PMException ex) {
            throw new PMSecurityException(ex);
        }

    }

    @Override
    public List getPermissions() throws PMSecurityException {
        final List perms = new ArrayList();
        final List ps = getDb().createCriteria(SECPermission.class).list();
        for (SECPermission p : ps) {
            perms.add(convert(p));
        }
        return perms;
    }

    /*Converters*/
    protected PMSecurityUser convert(SECUser u) throws PMSecurityException {
        final PMSecurityUser user = new PMSecurityUser();
        load(u, user);
        return user;
    }

    protected void load(SECUser u, PMSecurityUser user) throws PMSecurityException {
        user.setActive(u.isActive());
        user.setChangePassword(u.isChangePassword());
        user.setDeleted(u.isDeleted());
        user.setEmail(u.getEmail());
        user.setName(u.getName());
        user.setPassword(u.getPassword());
        user.setUsername(u.getNick());
        for (SECUserGroup g : u.getGroups()) {
            user.getGroups().add(convert(g));
        }
    }

    protected PMSecurityUserGroup convert(SECUserGroup g) {
        if (g == null) {
            return null;
        }
        final PMSecurityUserGroup group = new PMSecurityUserGroup();
        group.setActive(g.isActive());
        group.setDescription(g.getDescription());
        group.setName(g.getName());
        for (SECPermission p : g.getPermissions()) {
            group.getPermissions().add(convert(p));
        }

        return group;
    }

    protected PMSecurityPermission convert(SECPermission p) {
        if (p == null) {
            return null;
        }
        final PMSecurityPermission perm = new PMSecurityPermission();
        perm.setDescription(p.getDescription());
        perm.setName(p.getName());
        return perm;
    }

    protected SECUser unconvert(SECUser secuser, PMSecurityUser u) throws PMSecurityException {
        if (u == null) {
            return null;
        }
        SECUser user = secuser;
        if (secuser == null) {
            user = new SECUser();
        }
        unload(u, secuser, user);
        return user;
    }

    protected void unload(PMSecurityUser u, SECUser secuser, SECUser output) throws PMSecurityException {
        output.getGroups().clear();
        output.setActive(u.isActive());
        output.setChangePassword(u.isChangePassword());
        output.setDeleted(u.isDeleted());
        output.setEmail(u.getEmail());
        output.setName(u.getName());
        output.setPassword(u.getPassword());
        if (secuser == null) {
            output.setNick(u.getUsername().toLowerCase());
        }
        for (PMSecurityUserGroup g : u.getGroups()) {
            output.getGroups().add(getDBGroup(g.getName()));
        }
    }

    protected SECUserGroup unconvert(SECUserGroup secgroup, PMSecurityUserGroup g) throws PMException {
        if (g == null) {
            return null;
        }
        SECUserGroup group = secgroup;
        if (secgroup == null) {
            group = new SECUserGroup();
        }
        group.setActive(g.isActive());
        group.setDescription(g.getDescription());
        if (secgroup == null) {
            group.setName(g.getName());
        }
        group.getPermissions().clear();
        for (PMSecurityPermission p : g.getPermissions()) {
            group.getPermissions().add(getDBPerm(p.getName()));
        }
        return group;
    }

    protected SECPermission getDBPerm(String name) throws PMException {
        final Session db = getDb();
        SECPermission p = null;
        try {
            p = (SECPermission) db.createCriteria(SECPermission.class).add(Restrictions.eq("name", name)).uniqueResult();
            if (p != null) {
                db.refresh(p);
            }
        } catch (Exception e) {
            throw new PMSecurityException(e);
        }
        return p;
    }

    protected SECPermission unconvert(PMSecurityPermission p) {
        if (p == null) {
            return null;
        }
        final SECPermission perm = new SECPermission();
        perm.setDescription(p.getDescription());
        perm.setName(p.getName());
        return perm;
    }

    @Override
    public void removeGroup(PMSecurityUserGroup group) throws PMSecurityException {
        getDb().delete(getDBGroup(group.getName()));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy