Author: solomax
Date: Fri Jan 20 16:45:00 2017
New Revision: 1779645

URL: http://svn.apache.org/viewvc?rev=1779645&view=rev
Log:
[OPENMEETINGS-1533] appointment with meeting-meetingmembers saved via service

Modified:
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
    
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
    
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
    
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
    
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
    
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 Fri Jan 20 16:45:00 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -46,7 +47,13 @@ public class MeetingMemberDTO implements
        public MeetingMember get(UserDao userDao) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
-               mm.setUser(user.get(userDao));
+               if (user.getId() != null) {
+                       mm.setUser(userDao.get(user.getId()));
+               } else {
+                       mm.setUser(user.get(userDao));
+                       mm.getUser().setType(User.Type.contact);
+                       mm.getUser().getRights().clear();
+               }
                return mm;
        }
 

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 Fri Jan 20 16:45:00 2017
@@ -379,6 +379,10 @@ public class RoomDTO implements Serializ
                return r;
        }
 
+       public static JSONObject json(RoomDTO r) {
+               return new JSONObject(r).put("type", r.getType().name());
+       }
+
        @Override
        public String toString() {
                return new JSONObject(this).toString();

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 Fri Jan 20 16:45:00 2017
@@ -213,7 +213,18 @@ public class UserDTO implements Serializ
                u.timeZoneId = o.optString("timeZoneId");
                u.externalId = o.optString("externalId");
                u.externalType = o.optString("externalType");
-               u.type = Type.valueOf(o.optString("type"));
+               String t = o.optString("type", null);
+               u.type = t == null ? null : Type.valueOf(t);
                return u;
        }
+
+       public static JSONObject json(UserDTO u) {
+               JSONObject o = new JSONObject(u)
+                               .put("type", u.getType().name());
+               JSONArray rr = new JSONArray();
+               for (Right r : u.getRights()) {
+                       rr.put(r.name());
+               }
+               return o.put("rights", rr);
+       }
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 Fri Jan 20 16:45:00 2017
@@ -28,9 +28,8 @@ import org.apache.wicket.util.tester.Wic
 import org.junit.After;
 
 public class AbstractWicketTester extends AbstractJUnitDefaults {
-
        protected WicketTester tester;
-               
+
        @Override
        public void setUp() throws Exception {
                super.setUp();
@@ -46,11 +45,11 @@ public class AbstractWicketTester extend
                }
                assertTrue("Web session is not signed in for user: " + (login 
!= null ? login : username), WebSession.get().isSignedIn());
        }
-       
+
        @After
        public void tearDown() {
                if (tester != null) {
-                       //can be null in case exception on initialization 
+                       //can be null in case exception on initialization
                        tester.destroy();
                }
        }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 Fri Jan 20 16:45:00 2017
@@ -18,11 +18,16 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.util.Date;
 import java.util.UUID;
 
+import javax.ws.rs.core.Form;
+import javax.ws.rs.core.Response;
+
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
@@ -31,6 +36,9 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.AppointmentParamConverter;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +73,152 @@ public class TestCalendarService extends
        public void testGetByPublicRoom() throws Exception {
                actualTest(roomDao.get(5L)); //default public restricted room
        }
+
+       private static JSONObject createAppointment() {
+               return new JSONObject()
+                       .put("title", "test")
+                       .put("start", "2017-01-20T20:30:03+0300")
+                       .put("end", "2017-01-20T21:30:03+0300")
+                       .put("description", "Русский Тест")
+                       .put("reminder", "none")
+                       .put("room", new JSONObject()
+                                       .put("name", "test24")
+                                       .put("comment", "appointment test room")
+                                       .put("type", "conference")
+                                       .put("numberOfPartizipants", 15)
+                                       .put("appointment", true)
+                                       .put("isPublic", false)
+                                       .put("demo", false)
+                                       .put("closed", false)
+                                       .put("externalId", 10)
+                                       .put("externalType", "HuntingLabCMS")
+                                       .put("redirectUrl", "")
+                                       .put("moderated", true)
+                                       .put("allowUserQuestions", true)
+                                       .put("allowRecording", false)
+                                       .put("waitForRecording", false)
+                                       .put("audioOnly", true)
+                                       .put("topBarHidden", false)
+                                       .put("chatHidden", false)
+                                       .put("activitiesHidden", false)
+                                       .put("filesExplorerHidden", false)
+                                       .put("actionsMenuHidden", false)
+                                       .put("screenSharingHidden", false)
+                                       .put("whiteboardHidden", false))
+                       .put("languageId", 9)
+                       .put("passwordProtected", false)
+                       .put("connectedEvent", false)
+                       .put("reminderEmailSend", false);
+       }
+
+       @Test
+       public void testCreate() throws Exception {
+               JSONObject o = createAppointment();
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testDelete() {
+               ServiceResult sr = login();
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/" + Long.MAX_VALUE) //non-existent ID
+                               .query("sid", sr.getMessage())
+                               .delete();
+
+               assertNotEquals("Call should NOT be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+       }
+
+       @Test
+       public void testCreateWithOmMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testCreateWithMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 1")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 2")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               );
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 2 attendees", 2, 
dto.getMeetingMembers().size());
+
+               //try to change MM list
+               JSONObject o1 = AppointmentParamConverter.json(dto)
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o1.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 1 attendees", 1, 
dto.getMeetingMembers().size());
+       }
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 Fri Jan 20 16:45:00 2017
@@ -18,8 +18,10 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static 
org.apache.openmeetings.db.util.ApplicationHelper.getWicketTester;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.Response;
@@ -28,9 +30,22 @@ import org.apache.openmeetings.db.dto.ba
 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.web.app.WebSession;
+import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.After;
 import org.junit.Test;
 
 public class TestUserService extends AbstractWebServiceTest {
+       protected WicketTester tester;
+
+       @Override
+       public void setUp() throws Exception {
+               super.setUp();
+               tester = getWicketTester();
+               assertNotNull("Web session should not be null", 
WebSession.get());
+       }
+
        @Test
        public void loginTest() {
                ServiceResult r = login();
@@ -58,5 +73,17 @@ public class TestUserService extends Abs
                assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
                ServiceResult r1 = resp.readEntity(ServiceResult.class);
                assertEquals("OM Call should be successful", r1.getType(), 
Type.SUCCESS.name());
+
+               WebSession ws = WebSession.get();
+               ws.checkHashes(StringValue.valueOf(r1.getMessage()), 
StringValue.valueOf(""));
+               assertTrue("Login via secure hash should be successful", 
ws.isSignedIn());
+       }
+
+       @After
+       public void tearDown() {
+               if (tester != null) {
+                       //can be null in case exception on initialization
+                       tester.destroy();
+               }
        }
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 Fri Jan 20 16:45:00 2017
@@ -293,7 +293,9 @@ public class CalendarWebService {
                        Long userId = sessionDao.check(sid);
                        log.debug("save userId:" + userId);
                        User u = userDao.get(userId);
-                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights()) && 
appointment.getOwner() != null)
+                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+                                       && appointment.getOwner() != null
+                                       && 
!appointment.getOwner().getId().equals(u.getId()))
                        {
                                //TODO maybe additional checks are required
                                log.error("USER/Room modification as SOAP");

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 Fri Jan 20 16:45:00 2017
@@ -20,6 +20,8 @@ package org.apache.openmeetings.webservi
 
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
+import java.util.Date;
+
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
@@ -47,7 +49,8 @@ public class AppointmentParamConverter i
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
                a.setDeleted(o.optBoolean("inserted"));
-               a.setReminder(Reminder.valueOf(o.optString("reminder")));
+               String r = o.optString("reminder", null);
+               a.setReminder(r == null ? null : Reminder.valueOf(r));
                a.setRoom(RoomDTO.get(o.optJSONObject("room")));
                a.setIcalId(o.optString("icalId"));
                JSONArray mm = o.optJSONArray("meetingMembers");
@@ -64,13 +67,20 @@ public class AppointmentParamConverter i
                return a;
        }
 
-       @Override
-       public String toString(AppointmentDTO val) {
-               return new JSONObject(this)
+       public static JSONObject json(AppointmentDTO val) {
+               Date i = val.getInserted(), u = val.getUpdated();
+               return new JSONObject(val)
+                               .put("owner", UserDTO.json(val.getOwner()))
+                               .put("room", RoomDTO.json(val.getRoom()))
+                               .put("reminder", val.getReminder() == null ? 
null : val.getReminder().name())
                                .put("start", 
ISO8601_FULL_FORMAT.format(val.getStart()))
                                .put("end", 
ISO8601_FULL_FORMAT.format(val.getEnd()))
-                               .put("inserted", 
ISO8601_FULL_FORMAT.format(val.getInserted()))
-                               .put("updated", 
ISO8601_FULL_FORMAT.format(val.getUpdated()))
-                               .toString();
+                               .put("inserted", i == null ? null : 
ISO8601_FULL_FORMAT.format(i))
+                               .put("updated", u == null ? null : 
ISO8601_FULL_FORMAT.format(u));
+       }
+
+       @Override
+       public String toString(AppointmentDTO val) {
+               return json(val).toString();
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 Fri Jan 20 16:45:00 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -46,7 +47,13 @@ public class MeetingMemberDTO implements
        public MeetingMember get(UserDao userDao) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
-               mm.setUser(user.get(userDao));
+               if (user.getId() != null) {
+                       mm.setUser(userDao.get(user.getId()));
+               } else {
+                       mm.setUser(user.get(userDao));
+                       mm.getUser().setType(User.Type.contact);
+                       mm.getUser().getRights().clear();
+               }
                return mm;
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 Fri Jan 20 16:45:00 2017
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
-import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -58,7 +57,7 @@ public class RoomDTO implements Serializ
        private boolean allowRecording;
        private boolean waitForRecording;
        private boolean audioOnly;
-       private Set<RoomElement> hiddenElements;
+       private Set<RoomElement> hiddenElements = new HashSet<>();
 
        public RoomDTO() {}
 
@@ -318,6 +317,15 @@ public class RoomDTO implements Serializ
                return r;
        }
 
+       public static JSONObject json(RoomDTO r) {
+               JSONArray rr = new JSONArray();
+               for (RoomElement h : r.getHiddenElements()) {
+                       rr.put(h.name());
+               }
+               return new JSONObject(r).put("hiddenElements", rr)
+                               .put("type", r.getType().name());
+       }
+
        @Override
        public String toString() {
                return new JSONObject(this).toString();

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 Fri Jan 20 16:45:00 2017
@@ -213,7 +213,18 @@ public class UserDTO implements Serializ
                u.timeZoneId = o.optString("timeZoneId");
                u.externalId = o.optString("externalId");
                u.externalType = o.optString("externalType");
-               u.type = Type.valueOf(o.optString("type"));
+               String t = o.optString("type", null);
+               u.type = t == null ? null : Type.valueOf(t);
                return u;
        }
+
+       public static JSONObject json(UserDTO u) {
+               JSONObject o = new JSONObject(u)
+                               .put("type", u.getType().name());
+               JSONArray rr = new JSONArray();
+               for (Right r : u.getRights()) {
+                       rr.put(r.name());
+               }
+               return o.put("rights", rr);
+       }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 Fri Jan 20 16:45:00 2017
@@ -28,9 +28,8 @@ import org.apache.wicket.util.tester.Wic
 import org.junit.After;
 
 public class AbstractWicketTester extends AbstractJUnitDefaults {
-
        protected WicketTester tester;
-               
+
        @Override
        public void setUp() throws Exception {
                super.setUp();
@@ -46,11 +45,11 @@ public class AbstractWicketTester extend
                }
                assertTrue("Web session is not signed in for user: " + (login 
!= null ? login : username), WebSession.get().isSignedIn());
        }
-       
+
        @After
        public void tearDown() {
                if (tester != null) {
-                       //can be null in case exception on initialization 
+                       //can be null in case exception on initialization
                        tester.destroy();
                }
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 Fri Jan 20 16:45:00 2017
@@ -18,11 +18,16 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.util.Date;
 import java.util.UUID;
 
+import javax.ws.rs.core.Form;
+import javax.ws.rs.core.Response;
+
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
@@ -31,6 +36,9 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.AppointmentParamConverter;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +73,152 @@ public class TestCalendarService extends
        public void testGetByPublicRoom() throws Exception {
                actualTest(roomDao.get(5L)); //default public restricted room
        }
+
+       private static JSONObject createAppointment() {
+               return new JSONObject()
+                       .put("title", "test")
+                       .put("start", "2017-01-20T20:30:03+0300")
+                       .put("end", "2017-01-20T21:30:03+0300")
+                       .put("description", "Русский Тест")
+                       .put("reminder", "none")
+                       .put("room", new JSONObject()
+                                       .put("name", "test24")
+                                       .put("comment", "appointment test room")
+                                       .put("type", "conference")
+                                       .put("numberOfPartizipants", 15)
+                                       .put("appointment", true)
+                                       .put("isPublic", false)
+                                       .put("demo", false)
+                                       .put("closed", false)
+                                       .put("externalId", 10)
+                                       .put("externalType", "HuntingLabCMS")
+                                       .put("redirectUrl", "")
+                                       .put("moderated", true)
+                                       .put("allowUserQuestions", true)
+                                       .put("allowRecording", false)
+                                       .put("waitForRecording", false)
+                                       .put("audioOnly", true)
+                                       .put("topBarHidden", false)
+                                       .put("chatHidden", false)
+                                       .put("activitiesHidden", false)
+                                       .put("filesExplorerHidden", false)
+                                       .put("actionsMenuHidden", false)
+                                       .put("screenSharingHidden", false)
+                                       .put("whiteboardHidden", false))
+                       .put("languageId", 9)
+                       .put("passwordProtected", false)
+                       .put("connectedEvent", false)
+                       .put("reminderEmailSend", false);
+       }
+
+       @Test
+       public void testCreate() throws Exception {
+               JSONObject o = createAppointment();
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testDelete() {
+               ServiceResult sr = login();
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/" + Long.MAX_VALUE) //non-existent ID
+                               .query("sid", sr.getMessage())
+                               .delete();
+
+               assertNotEquals("Call should NOT be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+       }
+
+       @Test
+       public void testCreateWithOmMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testCreateWithMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 1")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 2")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               );
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 2 attendees", 2, 
dto.getMeetingMembers().size());
+
+               //try to change MM list
+               JSONObject o1 = AppointmentParamConverter.json(dto)
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o1.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 1 attendees", 1, 
dto.getMeetingMembers().size());
+       }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 Fri Jan 20 16:45:00 2017
@@ -18,8 +18,10 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static 
org.apache.openmeetings.db.util.ApplicationHelper.getWicketTester;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.Response;
@@ -28,9 +30,22 @@ import org.apache.openmeetings.db.dto.ba
 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.web.app.WebSession;
+import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.After;
 import org.junit.Test;
 
 public class TestUserService extends AbstractWebServiceTest {
+       protected WicketTester tester;
+
+       @Override
+       public void setUp() throws Exception {
+               super.setUp();
+               tester = getWicketTester();
+               assertNotNull("Web session should not be null", 
WebSession.get());
+       }
+
        @Test
        public void loginTest() {
                ServiceResult r = login();
@@ -58,5 +73,17 @@ public class TestUserService extends Abs
                assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
                ServiceResult r1 = resp.readEntity(ServiceResult.class);
                assertEquals("OM Call should be successful", r1.getType(), 
Type.SUCCESS.name());
+
+               WebSession ws = WebSession.get();
+               ws.checkHashes(StringValue.valueOf(r1.getMessage()), 
StringValue.valueOf(""));
+               assertTrue("Login via secure hash should be successful", 
ws.isSignedIn());
+       }
+
+       @After
+       public void tearDown() {
+               if (tester != null) {
+                       //can be null in case exception on initialization
+                       tester.destroy();
+               }
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 Fri Jan 20 16:45:00 2017
@@ -294,7 +294,9 @@ public class CalendarWebService {
                        Sessiondata sd = sessionDao.check(sid);
                        log.debug("save userId:" + sd);
                        User u = userDao.get(sd.getUserId());
-                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights()) && 
appointment.getOwner() != null)
+                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+                                       && appointment.getOwner() != null
+                                       && 
!appointment.getOwner().getId().equals(u.getId()))
                        {
                                //TODO maybe additional checks are required
                                log.error("USER/Room modification as SOAP");

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 Fri Jan 20 16:45:00 2017
@@ -20,6 +20,8 @@ package org.apache.openmeetings.webservi
 
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
+import java.util.Date;
+
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
@@ -47,7 +49,8 @@ public class AppointmentParamConverter i
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
                a.setDeleted(o.optBoolean("inserted"));
-               a.setReminder(Reminder.valueOf(o.optString("reminder")));
+               String r = o.optString("reminder", null);
+               a.setReminder(r == null ? null : Reminder.valueOf(r));
                a.setRoom(RoomDTO.get(o.optJSONObject("room")));
                a.setIcalId(o.optString("icalId"));
                JSONArray mm = o.optJSONArray("meetingMembers");
@@ -64,13 +67,20 @@ public class AppointmentParamConverter i
                return a;
        }
 
-       @Override
-       public String toString(AppointmentDTO val) {
-               return new JSONObject(this)
+       public static JSONObject json(AppointmentDTO val) {
+               Date i = val.getInserted(), u = val.getUpdated();
+               return new JSONObject(val)
+                               .put("owner", UserDTO.json(val.getOwner()))
+                               .put("room", RoomDTO.json(val.getRoom()))
+                               .put("reminder", val.getReminder() == null ? 
null : val.getReminder().name())
                                .put("start", 
ISO8601_FULL_FORMAT.format(val.getStart()))
                                .put("end", 
ISO8601_FULL_FORMAT.format(val.getEnd()))
-                               .put("inserted", 
ISO8601_FULL_FORMAT.format(val.getInserted()))
-                               .put("updated", 
ISO8601_FULL_FORMAT.format(val.getUpdated()))
-                               .toString();
+                               .put("inserted", i == null ? null : 
ISO8601_FULL_FORMAT.format(i))
+                               .put("updated", u == null ? null : 
ISO8601_FULL_FORMAT.format(u));
+       }
+
+       @Override
+       public String toString(AppointmentDTO val) {
+               return json(val).toString();
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 Fri Jan 20 16:45:00 2017
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRoot
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.ajax.json.JSONObject;
 
 @XmlRootElement
@@ -46,7 +47,13 @@ public class MeetingMemberDTO implements
        public MeetingMember get(UserDao userDao) {
                MeetingMember mm = new MeetingMember();
                mm.setId(id);
-               mm.setUser(user.get(userDao));
+               if (user.getId() != null) {
+                       mm.setUser(userDao.get(user.getId()));
+               } else {
+                       mm.setUser(user.get(userDao));
+                       mm.getUser().setType(User.Type.contact);
+                       mm.getUser().getRights().clear();
+               }
                return mm;
        }
 

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 Fri Jan 20 16:45:00 2017
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.db.dto.room;
 
 import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optInt;
-import static org.apache.openmeetings.db.dto.room.RoomOptionsDTO.optLong;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -58,7 +57,7 @@ public class RoomDTO implements Serializ
        private boolean allowRecording;
        private boolean waitForRecording;
        private boolean audioOnly;
-       private Set<RoomElement> hiddenElements;
+       private Set<RoomElement> hiddenElements = new HashSet<>();
 
        public RoomDTO() {}
 
@@ -318,6 +317,15 @@ public class RoomDTO implements Serializ
                return r;
        }
 
+       public static JSONObject json(RoomDTO r) {
+               JSONArray rr = new JSONArray();
+               for (RoomElement h : r.getHiddenElements()) {
+                       rr.put(h.name());
+               }
+               return new JSONObject(r).put("hiddenElements", rr)
+                               .put("type", r.getType().name());
+       }
+
        @Override
        public String toString() {
                return new JSONObject(this).toString();

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 Fri Jan 20 16:45:00 2017
@@ -213,7 +213,18 @@ public class UserDTO implements Serializ
                u.timeZoneId = o.optString("timeZoneId");
                u.externalId = o.optString("externalId");
                u.externalType = o.optString("externalType");
-               u.type = Type.valueOf(o.optString("type"));
+               String t = o.optString("type", null);
+               u.type = t == null ? null : Type.valueOf(t);
                return u;
        }
+
+       public static JSONObject json(UserDTO u) {
+               JSONObject o = new JSONObject(u)
+                               .put("type", u.getType().name());
+               JSONArray rr = new JSONArray();
+               for (Right r : u.getRights()) {
+                       rr.put(r.name());
+               }
+               return o.put("rights", rr);
+       }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/AbstractWicketTester.java
 Fri Jan 20 16:45:00 2017
@@ -28,9 +28,8 @@ import org.apache.wicket.util.tester.Wic
 import org.junit.After;
 
 public class AbstractWicketTester extends AbstractJUnitDefaults {
-
        protected WicketTester tester;
-               
+
        @Override
        public void setUp() throws Exception {
                super.setUp();
@@ -46,11 +45,11 @@ public class AbstractWicketTester extend
                }
                assertTrue("Web session is not signed in for user: " + (login 
!= null ? login : username), WebSession.get().isSignedIn());
        }
-       
+
        @After
        public void tearDown() {
                if (tester != null) {
-                       //can be null in case exception on initialization 
+                       //can be null in case exception on initialization
                        tester.destroy();
                }
        }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestCalendarService.java
 Fri Jan 20 16:45:00 2017
@@ -18,11 +18,16 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.util.Date;
 import java.util.UUID;
 
+import javax.ws.rs.core.Form;
+import javax.ws.rs.core.Response;
+
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
@@ -31,6 +36,9 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.webservice.util.AppointmentParamConverter;
+import org.apache.wicket.ajax.json.JSONArray;
+import org.apache.wicket.ajax.json.JSONObject;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -65,4 +73,152 @@ public class TestCalendarService extends
        public void testGetByPublicRoom() throws Exception {
                actualTest(roomDao.get(5L)); //default public restricted room
        }
+
+       private static JSONObject createAppointment() {
+               return new JSONObject()
+                       .put("title", "test")
+                       .put("start", "2017-01-20T20:30:03+0300")
+                       .put("end", "2017-01-20T21:30:03+0300")
+                       .put("description", "Русский Тест")
+                       .put("reminder", "none")
+                       .put("room", new JSONObject()
+                                       .put("name", "test24")
+                                       .put("comment", "appointment test room")
+                                       .put("type", "conference")
+                                       .put("numberOfPartizipants", 15)
+                                       .put("appointment", true)
+                                       .put("isPublic", false)
+                                       .put("demo", false)
+                                       .put("closed", false)
+                                       .put("externalId", 10)
+                                       .put("externalType", "HuntingLabCMS")
+                                       .put("redirectUrl", "")
+                                       .put("moderated", true)
+                                       .put("allowUserQuestions", true)
+                                       .put("allowRecording", false)
+                                       .put("waitForRecording", false)
+                                       .put("audioOnly", true)
+                                       .put("topBarHidden", false)
+                                       .put("chatHidden", false)
+                                       .put("activitiesHidden", false)
+                                       .put("filesExplorerHidden", false)
+                                       .put("actionsMenuHidden", false)
+                                       .put("screenSharingHidden", false)
+                                       .put("whiteboardHidden", false))
+                       .put("languageId", 9)
+                       .put("passwordProtected", false)
+                       .put("connectedEvent", false)
+                       .put("reminderEmailSend", false);
+       }
+
+       @Test
+       public void testCreate() throws Exception {
+               JSONObject o = createAppointment();
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testDelete() {
+               ServiceResult sr = login();
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/" + Long.MAX_VALUE) //non-existent ID
+                               .query("sid", sr.getMessage())
+                               .delete();
+
+               assertNotEquals("Call should NOT be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+       }
+
+       @Test
+       public void testCreateWithOmMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+       }
+
+       @Test
+       public void testCreateWithMm() throws Exception {
+               JSONObject o = createAppointment()
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 1")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               
.put("firstname", "Jhon 2")
+                                                               
.put("lastname", "Doe")
+                                                               .put("Address", 
new JSONObject().put("email", "[email protected]"))
+                                                               ))
+                                               );
+
+               String uuid = UUID.randomUUID().toString();
+               User u = getUser(uuid);
+               u.getGroupUsers().add(new GroupUser(groupDao.get(1L), u));
+               u = createUser(u);
+               ServiceResult sr = login(u.getLogin(), getRandomPass(uuid));
+
+               Response resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               AppointmentDTO dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 2 attendees", 2, 
dto.getMeetingMembers().size());
+
+               //try to change MM list
+               JSONObject o1 = AppointmentParamConverter.json(dto)
+                               .put("meetingMembers", new JSONArray()
+                                               .put(new 
JSONObject().put("user", new JSONObject()
+                                                               .put("id", 
1))));
+
+               resp = getClient(CALENDAR_SERVICE_URL)
+                               .path("/")
+                               .query("sid", sr.getMessage())
+                               .form(new Form().param("appointment", 
o1.toString()));
+
+               assertNotNull("Valid AppointmentDTO should be returned", resp);
+               assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
+               dto = resp.readEntity(AppointmentDTO.class);
+               assertNotNull("Valid DTO should be returned", dto);
+               assertNotNull("DTO id should be valid", dto.getId());
+               assertEquals("DTO should have 1 attendees", 1, 
dto.getMeetingMembers().size());
+       }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestUserService.java
 Fri Jan 20 16:45:00 2017
@@ -18,8 +18,10 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static 
org.apache.openmeetings.db.util.ApplicationHelper.getWicketTester;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.Response;
@@ -28,9 +30,22 @@ import org.apache.openmeetings.db.dto.ba
 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.web.app.WebSession;
+import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.After;
 import org.junit.Test;
 
 public class TestUserService extends AbstractWebServiceTest {
+       protected WicketTester tester;
+
+       @Override
+       public void setUp() throws Exception {
+               super.setUp();
+               tester = getWicketTester();
+               assertNotNull("Web session should not be null", 
WebSession.get());
+       }
+
        @Test
        public void loginTest() {
                ServiceResult r = login();
@@ -58,5 +73,17 @@ public class TestUserService extends Abs
                assertEquals("Call should be successful", 
Response.Status.OK.getStatusCode(), resp.getStatus());
                ServiceResult r1 = resp.readEntity(ServiceResult.class);
                assertEquals("OM Call should be successful", r1.getType(), 
Type.SUCCESS.name());
+
+               WebSession ws = WebSession.get();
+               ws.checkHashes(StringValue.valueOf(r1.getMessage()), 
StringValue.valueOf(""));
+               assertTrue("Login via secure hash should be successful", 
ws.isSignedIn());
+       }
+
+       @After
+       public void tearDown() {
+               if (tester != null) {
+                       //can be null in case exception on initialization
+                       tester.destroy();
+               }
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 Fri Jan 20 16:45:00 2017
@@ -294,7 +294,9 @@ public class CalendarWebService {
                        Sessiondata sd = sessionDao.check(sid);
                        log.debug("save userId:" + sd);
                        User u = userDao.get(sd.getUserId());
-                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights()) && 
appointment.getOwner() != null)
+                       if (!AuthLevelUtil.hasWebServiceLevel(u.getRights())
+                                       && appointment.getOwner() != null
+                                       && 
!appointment.getOwner().getId().equals(u.getId()))
                        {
                                //TODO maybe additional checks are required
                                log.error("USER/Room modification as SOAP");

Modified: 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java?rev=1779645&r1=1779644&r2=1779645&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 Fri Jan 20 16:45:00 2017
@@ -20,6 +20,8 @@ package org.apache.openmeetings.webservi
 
 import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
 
+import java.util.Date;
+
 import javax.ws.rs.ext.ParamConverter;
 
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
@@ -47,7 +49,8 @@ public class AppointmentParamConverter i
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
                a.setDeleted(o.optBoolean("inserted"));
-               a.setReminder(Reminder.valueOf(o.optString("reminder")));
+               String r = o.optString("reminder", null);
+               a.setReminder(r == null ? null : Reminder.valueOf(r));
                a.setRoom(RoomDTO.get(o.optJSONObject("room")));
                a.setIcalId(o.optString("icalId"));
                JSONArray mm = o.optJSONArray("meetingMembers");
@@ -64,13 +67,20 @@ public class AppointmentParamConverter i
                return a;
        }
 
-       @Override
-       public String toString(AppointmentDTO val) {
-               return new JSONObject(this)
+       public static JSONObject json(AppointmentDTO val) {
+               Date i = val.getInserted(), u = val.getUpdated();
+               return new JSONObject(val)
+                               .put("owner", UserDTO.json(val.getOwner()))
+                               .put("room", RoomDTO.json(val.getRoom()))
+                               .put("reminder", val.getReminder() == null ? 
null : val.getReminder().name())
                                .put("start", 
ISO8601_FULL_FORMAT.format(val.getStart()))
                                .put("end", 
ISO8601_FULL_FORMAT.format(val.getEnd()))
-                               .put("inserted", 
ISO8601_FULL_FORMAT.format(val.getInserted()))
-                               .put("updated", 
ISO8601_FULL_FORMAT.format(val.getUpdated()))
-                               .toString();
+                               .put("inserted", i == null ? null : 
ISO8601_FULL_FORMAT.format(i))
+                               .put("updated", u == null ? null : 
ISO8601_FULL_FORMAT.format(u));
+       }
+
+       @Override
+       public String toString(AppointmentDTO val) {
+               return json(val).toString();
        }
 }


Reply via email to