org.apache.openmeetings.service.user.UserManager.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openmeetings.service.user.UserManager.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openmeetings.service.user;

import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.openmeetings.db.dao.label.LabelDao;
import org.apache.openmeetings.db.dao.server.ISessionManager;
import org.apache.openmeetings.db.dao.server.SessiondataDao;
import org.apache.openmeetings.db.dao.user.GroupDao;
import org.apache.openmeetings.db.dao.user.IUserManager;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.dto.basic.SearchResult;
import org.apache.openmeetings.db.entity.room.Client;
import org.apache.openmeetings.db.entity.server.Sessiondata;
import org.apache.openmeetings.db.entity.user.Address;
import org.apache.openmeetings.db.entity.user.GroupUser;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.db.entity.user.User.Right;
import org.apache.openmeetings.db.entity.user.User.Type;
import org.apache.openmeetings.db.entity.user.Userdata;
import org.apache.openmeetings.db.util.AuthLevelUtil;
import org.apache.openmeetings.db.util.TimezoneUtil;
import org.apache.openmeetings.service.mail.EmailManager;
import org.apache.openmeetings.util.DaoHelper;
import org.apache.wicket.util.string.Strings;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.scope.IScope;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
 * 
 * @author swagner
 * 
 */
@Transactional
public class UserManager implements IUserManager {
    private static final Logger log = Red5LoggerFactory.getLogger(UserManager.class, webAppRootKey);

    @PersistenceContext
    private EntityManager em;

    @Autowired
    private SessiondataDao sessiondataDao;
    @Autowired
    private ConfigurationDao cfgDao;
    @Autowired
    private GroupDao groupDao;
    @Autowired
    private UserDao userDao;
    @Autowired
    private EmailManager emailManagement;
    @Autowired
    private ScopeApplicationAdapter scopeApplicationAdapter;
    @Autowired
    private ISessionManager sessionManager;
    @Autowired
    private TimezoneUtil timezoneUtil;

    public SearchResult<User> getAllUserByRange(String search, int start, int max, String orderby, boolean asc) {
        try {
            SearchResult<User> sresult = new SearchResult<User>();
            sresult.setObjectName(User.class.getName());
            sresult.setRecords(userDao.count(search));

            String sort = null;
            if (orderby != null && orderby.length() > 0) {
                sort = orderby;
            }
            if (asc) {
                sort += " ASC ";
            } else {
                sort += " DESC ";
            }
            String hql = DaoHelper.getSearchQuery("User", "u", search, true, false, sort, UserDao.searchFields);

            log.debug("Show HQL: " + hql);

            TypedQuery<User> query = em.createQuery(hql, User.class);
            // query.setParameter("macomUserId", userId);

            // query
            // if (asc) ((Criteria) query).addOrder(Order.asc(orderby));
            // else ((Criteria) query).addOrder(Order.desc(orderby));
            query.setFirstResult(start);
            query.setMaxResults(max);
            List<User> ll = query.getResultList();

            sresult.setResult(ll);

            return sresult;

        } catch (Exception ex2) {
            log.error("[getAllUserByRange] ", ex2);
        }
        return null;
    }

    public User loginUserByRemoteHash(String SID, String remoteHash) {
        try {

            Sessiondata sessionData = sessiondataDao.get(remoteHash);

            if (sessionData != null) {

                User u = userDao.get(sessionData.getUserId());

                sessiondataDao.updateUserWithoutSession(SID, u.getId());

                return u;
            }

        } catch (Exception ex2) {
            log.error("[loginUserByRemoteHash]: ", ex2);
        }
        return null;
    }

    @Override
    public Long logout(String SID, long userId) {
        sessiondataDao.updateUser(SID, null, false, 0);
        return -12L;
    }

    @Override
    public List<Userdata> getUserdataDashBoard(Long userId) {
        if (userId != null && userId.longValue() > 0) {
            try {
                TypedQuery<Userdata> query = em.createQuery(
                        "select c from Userdata as c where c.userId = :userId AND c.deleted = false",
                        Userdata.class);
                query.setParameter("userId", userId);
                List<Userdata> ll = query.getResultList();
                return ll;
            } catch (Exception ex2) {
                log.error("getUserdataDashBoard", ex2);
            }
        }
        return null;
    }

    public Userdata getUserdataByKey(Long userId, String key) {
        Userdata userdata = new Userdata();
        if (userId != null && userId.longValue() > 0) {
            try {
                TypedQuery<Userdata> query = em.createQuery(
                        "select c from Userdata as c where c.userId = :userId AND c.key = :key AND c.deleted = false",
                        Userdata.class);
                query.setParameter("userId", userId);
                query.setParameter("key", key);
                for (Iterator<Userdata> it2 = query.getResultList().iterator(); it2.hasNext();) {
                    userdata = it2.next();
                }
            } catch (Exception ex2) {
                log.error("getUserdataByKey", ex2);
            }
        } else {
            userdata.setComment("Error: No user id given");
        }
        return userdata;
    }

    public String updateUserdata(int dataId, long userId, String key, String data, String comment) {
        String res = "Fehler beim Update";
        try {
            String hqlUpdate = "update userdata set key= :key, userId = :userId, data = :data, updated = :updated, comment = :comment where id= :id";
            int updatedEntities = em.createQuery(hqlUpdate).setParameter("key", key).setParameter("userId", userId)
                    .setParameter("data", data).setParameter("updated", -1L).setParameter("comment", comment)
                    .setParameter("id", dataId).executeUpdate();
            res = "Success" + updatedEntities;
        } catch (Exception ex2) {
            log.error("updateUserdata", ex2);
        }
        return res;
    }

    public String updateUserdataByKey(Long userId, String key, String data, String comment) {
        String res = "Fehler beim Update";
        try {
            String hqlUpdate = "UPDATE Userdata set data = :data, updated = :updated, "
                    + "comment = :comment where userId= :userId AND key = :key";
            int updatedEntities = em.createQuery(hqlUpdate).setParameter("data", data).setParameter("updated", -1L)
                    .setParameter("comment", comment).setParameter("userId", userId).setParameter("key", key)
                    .executeUpdate();
            res = "Success" + updatedEntities;
        } catch (Exception ex2) {
            log.error("updateUserdataByKey", ex2);
        }
        return res;
    }

    public String addUserdata(long userId, String key, String data, String comment) {
        String ret = "Fehler beim speichern der Userdata";
        Userdata userdata = new Userdata();
        userdata.setKey(key);
        userdata.setData(data);
        userdata.setInserted(new Date());
        userdata.setUpdated(null);
        userdata.setComment(comment);
        userdata.setUserId(userId);
        userdata.setDeleted(false);
        try {
            em.merge(userdata);
            ret = "success";
        } catch (Exception ex2) {
            log.error("addUserdata", ex2);
        }
        return ret;
    }

    /**
     * Method to register a new User, User will automatically be added to the
     * default user_level(1) new users will be automatically added to the
     * Group with the id specified in the configuration value
     * default_group_id
     * 
     * @param login
     * @param Userpass
     * @param lastname
     * @param firstname
     * @param email
     * @param age
     * @param street
     * @param additionalname
     * @param fax
     * @param zip
     * @param stateId
     * @param town
     * @param languageId
     * @param phone
     * @param sendSMS
     * @param generateSipUserData
     * @param jNameTimeZone
     * @param sendConfirmation
     * @return
     */
    @Override
    public Long registerUser(String login, String Userpass, String lastname, String firstname, String email,
            Date age, String street, String additionalname, String fax, String zip, String country, String town,
            long languageId, String phone, boolean sendSMS, boolean generateSipUserData, String jNameTimeZone,
            Boolean sendConfirmation) {
        try {
            // Checks if FrontEndUsers can register
            if ("1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0"))) {
                if (sendConfirmation == null) {
                    String baseURL = cfgDao.getBaseUrl();
                    sendConfirmation = baseURL != null && !baseURL.isEmpty()
                            && 1 == cfgDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");
                }
                // TODO: Read and generate SIP-Data via RPC-Interface Issue 1098

                Long userId = registerUserInit(UserDao.getDefaultRights(), login, Userpass, lastname, firstname,
                        email, age, street, additionalname, fax, zip, country, town, languageId, true,
                        Arrays.asList(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)), phone,
                        sendSMS, sendConfirmation, timezoneUtil.getTimeZone(jNameTimeZone), false, "", "", false,
                        true, null);

                if (userId > 0 && sendConfirmation) {
                    return -40L;
                }

                return userId;
            }
        } catch (Exception e) {
            log.error("[registerUser]", e);
        }
        return null;
    }

    /**
     * @param user_level
     * @param availible
     * @param status
     * @param login
     * @param password
     * @param lastname
     * @param firstname
     * @param email
     * @param age
     * @param street
     * @param additionalname
     * @param fax
     * @param zip
     * @param stateId
     * @param town
     * @param languageId
     * @param sendWelcomeMessage
     * @param groups
     * @param phone
     * @param sendSMS
     * @param sendConfirmation
     * @param timezone
     * @param forceTimeZoneCheck
     * @param userOffers
     * @param userSearchs
     * @param showContactData
     * @param showContactDataToContacts
     * @return new users_id OR null if an exception, -1 if an error, -4 if mail
     *         already taken, -5 if username already taken, -3 if login or pass
     *         or mail is empty
     * @throws Exception
     */
    @Override
    public Long registerUserInit(Set<Right> rights, String login, String password, String lastname,
            String firstname, String email, Date age, String street, String additionalname, String fax, String zip,
            String country, String town, long languageId, boolean sendWelcomeMessage, List<Long> groups,
            String phone, boolean sendSMS, Boolean sendConfirmation, TimeZone timezone, Boolean forceTimeZoneCheck,
            String userOffers, String userSearchs, Boolean showContactData, Boolean showContactDataToContacts,
            String activatedHash) throws Exception {
        // TODO: make phone number persistent
        // Check for required data
        if (login.length() >= getMinLoginLength(cfgDao)) {
            // Check for duplicates
            boolean checkName = userDao.checkLogin(login, User.Type.user, null, null);
            boolean checkEmail = Strings.isEmpty(email) || userDao.checkEmail(email, User.Type.user, null, null);
            if (checkName && checkEmail) {

                String link = cfgDao.getBaseUrl();
                String hash = Strings.isEmpty(activatedHash) ? UUID.randomUUID().toString() : activatedHash;
                link += "activate?u=" + hash;

                if (sendWelcomeMessage && email.length() != 0) {
                    String sendMail = emailManagement.sendMail(login, password, email, link, sendConfirmation,
                            languageId);
                    if (!sendMail.equals("success")) {
                        return -19L;
                    }
                }
                Address adr = userDao.getAddress(street, zip, town, country, additionalname, fax, phone, email);

                // If this user needs first to click his E-Mail verification
                // code then set the status to 0
                if (sendConfirmation && rights.contains(Right.Login)) {
                    rights.remove(Right.Login);
                }

                User u = userDao.addUser(rights, firstname, login, lastname, languageId, password, adr, sendSMS,
                        age, hash, timezone, forceTimeZoneCheck, userOffers, userSearchs, showContactData,
                        showContactDataToContacts, null, null, groups, null);
                if (u == null) {
                    return -111L;
                }
                log.debug("Added user-Id " + u.getId());

                if (adr.getId() > 0 && u.getId() > 0) {
                    return u.getId();
                } else {
                    return -16L;
                }
            } else {
                if (!checkName) {
                    return -15L;
                } else if (!checkEmail) {
                    return -17L;
                }
            }
        }
        return -1L;
    }

    /**
     * @param admin
     * @param room_id
     * @return
     */
    @Override
    public boolean kickUserByStreamId(String SID, Long room_id) {
        try {
            Long users_id = sessiondataDao.check(SID);

            // admins only
            if (AuthLevelUtil.hasAdminLevel(userDao.getRights(users_id))) {

                sessiondataDao.clearSessionByRoomId(room_id);

                for (Client rcl : sessionManager.getClientListByRoom(room_id)) {
                    if (rcl == null) {
                        return true;
                    }
                    String scopeName = "hibernate";
                    if (rcl.getRoomId() != null) {
                        scopeName = rcl.getRoomId().toString();
                    }
                    IScope currentScope = scopeApplicationAdapter.getRoomScope(scopeName);
                    scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);

                    HashMap<Integer, String> messageObj = new HashMap<Integer, String>();
                    messageObj.put(0, "kick");
                    scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), currentScope);
                }
                return true;
            }
        } catch (Exception err) {
            log.error("[kickUserByStreamId]", err);
        }
        return false;
    }

    @Override
    public boolean kickUserByPublicSID(String SID, String publicSID) {
        try {
            Long userId = sessiondataDao.check(SID);

            // admins only
            if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(userId))) {
                Client rcl = sessionManager.getClientByPublicSID(publicSID, null);

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

                String scopeName = "hibernate";
                if (rcl.getRoomId() != null) {
                    scopeName = rcl.getRoomId().toString();
                }
                IScope currentScope = scopeApplicationAdapter.getRoomScope(scopeName);

                HashMap<Integer, String> messageObj = new HashMap<Integer, String>();
                messageObj.put(0, "kick");
                scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), currentScope);

                scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);

                return true;
            }
        } catch (Exception err) {
            log.error("[kickUserByStreamId]", err);
        }
        return false;
    }

    @Override
    public Long getLanguage(Locale loc) {
        if (loc != null) {
            for (Map.Entry<Long, Locale> e : LabelDao.languages.entrySet()) {
                if (loc.equals(e.getValue())) {
                    return e.getKey();
                }
            }
        }
        return cfgDao.getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1");
    }

    @Override
    public User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
        String login = params.get("login");
        String email = params.get("email");
        String lastname = params.get("lastname");
        String firstname = params.get("firstname");
        if (firstname == null) {
            firstname = "";
        }
        if (lastname == null) {
            lastname = "";
        }
        if (!userDao.validLogin(login)) {
            log.error("Invalid login, please check parameters");
            return null; //TODO FIXME need to be checked
        }
        User u = userDao.getByLogin(login, Type.oauth, serverId);
        if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getId())) {
            log.error("Another user with the same email exists");
            return null; //TODO FIXME need to be checked
        }
        // generate random password
        byte[] rawPass = new byte[25];
        Random rnd = new Random();
        for (int i = 0; i < rawPass.length; ++i) {
            rawPass[i] = (byte) ('!' + rnd.nextInt(93));
        }
        String pass = new String(rawPass, StandardCharsets.UTF_8);
        // check if the user already exists and register new one if it's needed
        if (u == null) {
            u = userDao.getNewUserInstance(null);
            u.setType(Type.oauth);
            u.getRights().remove(Right.Login);
            ;
            u.setDomainId(serverId);
            u.getGroupUsers().add(
                    new GroupUser(groupDao.get(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, "-1")), u));
            u.setLogin(login);
            u.setShowContactDataToContacts(true);
            u.setLastname(lastname);
            u.setFirstname(firstname);
            u.getAddress().setEmail(email);
            String picture = params.get("picture");
            if (picture != null) {
                u.setPictureuri(picture);
            }
            String locale = params.get("locale");
            if (locale != null) {
                Locale loc = Locale.forLanguageTag(locale);
                if (loc != null) {
                    u.setLanguageId(getLanguage(loc));
                    u.getAddress().setCountry(loc.getCountry());
                }
            }
        }
        //TODO FIXME should we update fields on login ????
        u.setLastlogin(new Date());
        u = userDao.update(u, pass, Long.valueOf(-1));

        return u;
    }
}