| /* |
| * 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.webservice; |
| |
| import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; |
| import static org.apache.openmeetings.webservice.Constants.TNS; |
| import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_NAME; |
| import static org.apache.openmeetings.webservice.Constants.USER_SERVICE_PORT_NAME; |
| |
| import java.util.Date; |
| import java.util.List; |
| import java.util.Locale; |
| |
| import javax.jws.WebMethod; |
| import javax.jws.WebParam; |
| import javax.jws.WebService; |
| import javax.ws.rs.DELETE; |
| import javax.ws.rs.FormParam; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.POST; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.PathParam; |
| import javax.ws.rs.Produces; |
| import javax.ws.rs.QueryParam; |
| import javax.ws.rs.core.MediaType; |
| |
| import org.apache.cxf.feature.Features; |
| import org.apache.openmeetings.core.remote.ConferenceService; |
| import org.apache.openmeetings.db.dao.basic.ConfigurationDao; |
| import org.apache.openmeetings.db.dao.server.SOAPLoginDao; |
| import org.apache.openmeetings.db.dao.server.SessiondataDao; |
| import org.apache.openmeetings.db.dao.user.IUserManager; |
| import org.apache.openmeetings.db.dao.user.UserDao; |
| import org.apache.openmeetings.db.dto.basic.ServiceResult; |
| import org.apache.openmeetings.db.dto.basic.ServiceResult.Type; |
| import org.apache.openmeetings.db.dto.room.RoomOptionsDTO; |
| import org.apache.openmeetings.db.dto.user.ExternalUserDTO; |
| import org.apache.openmeetings.db.dto.user.UserDTO; |
| import org.apache.openmeetings.db.entity.server.RemoteSessionObject; |
| import org.apache.openmeetings.db.entity.server.Sessiondata; |
| import org.apache.openmeetings.db.entity.user.Address; |
| import org.apache.openmeetings.db.entity.user.User; |
| import org.apache.openmeetings.db.entity.user.User.Right; |
| import org.apache.openmeetings.db.util.AuthLevelUtil; |
| import org.apache.openmeetings.util.OmException; |
| import org.apache.openmeetings.webservice.cluster.UserService; |
| import org.apache.openmeetings.webservice.error.ServiceException; |
| import org.apache.wicket.util.string.Strings; |
| import org.red5.logging.Red5LoggerFactory; |
| import org.slf4j.Logger; |
| import org.springframework.beans.factory.annotation.Autowired; |
| |
| /** |
| * |
| * The Service contains methods to login and create hash to directly enter |
| * conference rooms, recordings or the application in general |
| * |
| * @author sebawagner |
| * |
| */ |
| @WebService(serviceName = USER_SERVICE_NAME, targetNamespace = TNS, portName = USER_SERVICE_PORT_NAME) |
| @Features(features = "org.apache.cxf.feature.LoggingFeature") |
| @Produces({MediaType.APPLICATION_JSON}) |
| @Path("/user") |
| public class UserWebService implements UserService { |
| private static final Logger log = Red5LoggerFactory.getLogger(UserWebService.class, webAppRootKey); |
| @Autowired |
| private ConfigurationDao cfgDao; |
| @Autowired |
| private IUserManager userManagement; |
| @Autowired |
| private SOAPLoginDao soapLoginDao; |
| @Autowired |
| private UserDao userDao; |
| @Autowired |
| private SessiondataDao sessionDao; |
| @Autowired |
| private ConferenceService conferenceService; |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#login(java.lang.String, java.lang.String) |
| */ |
| @Override |
| @WebMethod |
| @GET |
| @Path("/login") |
| public ServiceResult login(@WebParam(name="user") @QueryParam("user") String user, @WebParam(name="pass") @QueryParam("pass") String pass) { |
| try { |
| log.debug("Login user"); |
| User u = userDao.login(user, pass); |
| if (u == null) { |
| return new ServiceResult(-1L, "Login failed", Type.ERROR); |
| } |
| |
| Sessiondata sd = sessionDao.create(); |
| log.debug("Login user SID : " + sd.getSessionId()); |
| if (!sessionDao.updateUser(sd.getSessionId(), u.getId(), false, u.getLanguageId())) { |
| return new ServiceResult(-35L, "invalid Session-Object", Type.ERROR); |
| } |
| |
| return new ServiceResult(u.getId(), sd.getSessionId(), Type.SUCCESS); |
| } catch (OmException oe) { |
| return new ServiceResult(oe.getCode() == null ? -1 : oe.getCode(), oe.getMessage(), Type.ERROR); |
| } catch (Exception err) { |
| log.error("[login]", err); |
| return new ServiceResult(-1L, err.getMessage(), Type.ERROR); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#get(java.lang.String) |
| */ |
| @Override |
| @WebMethod |
| @GET |
| @Path("/") |
| public List<UserDTO> get(@WebParam(name="sid") @QueryParam("sid") String sid) throws ServiceException { |
| try { |
| Long authUserId = sessionDao.check(sid); |
| |
| if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(authUserId))) { |
| return UserDTO.list(userDao.getAllUsers()); |
| } else { |
| throw new ServiceException("Insufficient permissions"); //TODO code -26 |
| } |
| } catch (Exception err) { |
| log.error("addNewUser", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#add(java.lang.String, org.apache.openmeetings.db.dto.user.UserDTO, java.lang.Boolean) |
| */ |
| @Override |
| @WebMethod |
| @POST |
| @Path("/") |
| public UserDTO add( |
| @WebParam(name="sid") @QueryParam("sid") String sid |
| , @WebParam(name="user") @QueryParam("user") UserDTO user |
| , @WebParam(name="confirm") @QueryParam("confirm") Boolean confirm |
| ) throws ServiceException |
| { |
| try { |
| Long authUserId = sessionDao.check(sid); |
| |
| if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(authUserId))) { |
| User testUser = userDao.getExternalUser(user.getExternalId(), user.getExternalType()); |
| |
| if (testUser != null) { |
| throw new ServiceException("User does already exist!"); |
| } |
| |
| String jName_timeZone = cfgDao.getConfValue("default.timezone", String.class, ""); |
| if (user.getAddress() == null) { |
| user.setAddress(new Address()); |
| user.getAddress().setCountry(Locale.getDefault().getCountry()); |
| } |
| if (user.getLanguageId() == null) { |
| user.setLanguageId(1L); |
| } |
| Long userId = userManagement.registerUser(user.getLogin(), user.getPassword(), |
| user.getLastname(), user.getFirstname(), user.getAddress().getEmail(), new Date(), user.getAddress().getStreet(), |
| user.getAddress().getAdditionalname(), user.getAddress().getFax(), user.getAddress().getZip(), user.getAddress().getCountry() |
| , user.getAddress().getTown(), user.getLanguageId(), |
| "", false, true, // generate SIP Data if the config is enabled |
| jName_timeZone, confirm); |
| |
| if (userId == null || userId < 0) { |
| throw new ServiceException("Unknown error"); |
| } |
| |
| User u = userDao.get(userId); |
| |
| u.getRights().add(Right.Room); |
| if (Strings.isEmpty(user.getExternalId()) && Strings.isEmpty(user.getExternalType())) { |
| // activate the User |
| u.getRights().add(Right.Login); |
| u.getRights().add(Right.Dashboard); |
| } else { |
| u.setType(User.Type.external); |
| u.setExternalId(user.getExternalId()); |
| u.setExternalType(user.getExternalType()); |
| } |
| |
| u = userDao.update(u, authUserId); |
| |
| return new UserDTO(u); |
| } else { |
| throw new ServiceException("Insufficient permissions"); //TODO code -26 |
| } |
| } catch (Exception err) { |
| log.error("addNewUser", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| } |
| |
| //FIXME no update |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#delete(java.lang.String, long) |
| */ |
| @Override |
| @WebMethod |
| @DELETE |
| @Path("/{id}") |
| public ServiceResult delete(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="id") @PathParam("id") long id) throws ServiceException { |
| try { |
| Long authUserId = sessionDao.check(sid); |
| |
| if (AuthLevelUtil.hasAdminLevel(userDao.getRights(authUserId))) { |
| userDao.delete(userDao.get(id), authUserId); |
| |
| return new ServiceResult(id, "Deleted", Type.SUCCESS); |
| } else { |
| return new ServiceResult(-26L, "Insufficient permissions", Type.ERROR); |
| } |
| } catch (Exception err) { |
| log.error("deleteUserById", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#deleteExternal(java.lang.String, java.lang.String, java.lang.String) |
| */ |
| @Override |
| @DELETE |
| @Path("/{externaltype}/{externalid}") |
| public ServiceResult deleteExternal( |
| @WebParam(name="sid") @QueryParam("sid") String sid |
| , @WebParam(name="externaltype") @PathParam("externaltype") String externalType |
| , @WebParam(name="externalid") @PathParam("externalid") String externalId |
| ) throws ServiceException |
| { |
| try { |
| Long authUserId = sessionDao.check(sid); |
| |
| if (AuthLevelUtil.hasAdminLevel(userDao.getRights(authUserId))) { |
| User user = userDao.getExternalUser(externalId, externalType); |
| |
| // Setting user deleted |
| userDao.delete(user, authUserId); |
| |
| return new ServiceResult(user.getId(), "Deleted", Type.SUCCESS); |
| } else { |
| return new ServiceResult(-26L, "Insufficient permissions", Type.ERROR); |
| } |
| } catch (Exception err) { |
| log.error("deleteUserByExternalUserIdAndType", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#getRoomHash(java.lang.String, org.apache.openmeetings.db.dto.user.ExternalUserDTO, org.apache.openmeetings.db.dto.room.RoomOptionsDTO) |
| */ |
| @Override |
| @WebMethod |
| @POST |
| @Path("/hash") |
| public ServiceResult getRoomHash( |
| @WebParam(name="sid") @QueryParam("sid") String sid |
| , @WebParam(name="user") @FormParam("user") ExternalUserDTO user |
| , @WebParam(name="options") @FormParam("options") RoomOptionsDTO options |
| ) throws ServiceException |
| { |
| try { |
| Long userId = sessionDao.check(sid); |
| if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(userId))) { |
| RemoteSessionObject remoteSessionObject = new RemoteSessionObject( |
| user.getLogin(), user.getFirstname(), user.getLastname() |
| , user.getProfilePictureUrl(), user.getEmail() |
| , user.getExternalId(), user.getExternalType()); |
| |
| log.debug(remoteSessionObject.toString()); |
| |
| String xmlString = remoteSessionObject.toXml(); |
| |
| log.debug("xmlString " + xmlString); |
| |
| //TODO LandingZone are not configurable for now |
| String hash = soapLoginDao.addSOAPLogin(sid, options.getRoomId(), |
| options.isModerator(), options.isShowAudioVideoTest(), options.isAllowSameURLMultipleTimes(), |
| options.getRecordingId(), |
| options.isShowNickNameDialog(), |
| "room", // LandingZone, |
| options.isAllowRecording() |
| ); |
| |
| if (hash != null) { |
| Sessiondata sd = sessionDao.get(sid); |
| if (options.isAllowSameURLMultipleTimes()) { |
| sd.setPermanent(true); |
| } |
| sd.setXml(xmlString); |
| sessionDao.update(sd); |
| return new ServiceResult(0, hash, Type.SUCCESS); |
| } |
| } else { |
| return new ServiceResult(-26L, "Insufficient permissions", Type.ERROR); |
| } |
| } catch (Exception err) { |
| log.error("getRoomHash", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| return new ServiceResult(-1L, "Unknown error", Type.ERROR); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#kick(java.lang.String, java.lang.String) |
| */ |
| @Override |
| @WebMethod |
| @POST |
| @Path("/kick/{publicsid}") |
| public ServiceResult kick(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="publicsid") @PathParam("publicsid") String publicSID) throws ServiceException { |
| try { |
| Long userId = sessionDao.check(sid); |
| if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(userId))) { |
| Boolean success = userManagement.kickUserByPublicSID(sid, publicSID); |
| |
| return new ServiceResult(Boolean.TRUE.equals(success) ? 1L : 0L, Boolean.TRUE.equals(success) ? "deleted" : "not deleted", Type.SUCCESS); |
| } else { |
| return new ServiceResult(-26L, "Insufficient permissions", Type.ERROR); |
| } |
| } catch (Exception err) { |
| log.error("[kick]", err); |
| throw new ServiceException(err.getMessage()); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.openmeetings.webservice.cluster.UserService#count(java.lang.String, java.lang.Long) |
| */ |
| @Override |
| @WebMethod |
| @GET |
| @Path("/count/{roomid}") |
| public int count(@WebParam(name="sid") @QueryParam("sid") String sid, @WebParam(name="roomid") @PathParam("roomid") Long roomId) { |
| Long userId = sessionDao.check(sid); |
| |
| if (AuthLevelUtil.hasUserLevel(userDao.getRights(userId))) { |
| return conferenceService.getRoomClientsListByRoomId(roomId).size(); |
| } |
| return -1; |
| } |
| } |