This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b9c20ee8 [OPENMEETINGS-2835] user rights are properly checked on 
appointment save
9b9c20ee8 is described below

commit 9b9c20ee8808efdde4efde2ced825852cc15e36e
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed Sep 9 08:13:54 2026 +0700

    [OPENMEETINGS-2835] user rights are properly checked on appointment save
---
 .../db/dao/calendar/AppointmentDao.java            |  4 +-
 .../db/dto/calendar/AppointmentDTO.java            | 45 ++++++++++++-------
 .../db/dto/calendar/MeetingMemberDTO.java          |  8 +++-
 .../apache/openmeetings/db/dto/user/UserDTO.java   | 13 +++++-
 .../openmeetings/db/mapper/CalendarMapper.java     |  4 +-
 .../apache/openmeetings/util/CalendarHelper.java   |  9 ++--
 .../org/apache/openmeetings/web/TestCalendar.java  |  2 +-
 .../openmeetings/ws/TestCalendarService.java       | 41 ++++++++++++++---
 .../apache/openmeetings/ws/TestWebConverters.java  | 11 -----
 .../webservice/CalendarWebService.java             | 19 +++++---
 .../schema/AppointmentDTOListWrapper.java          | 26 +----------
 .../webservice/schema/AppointmentDTOWrapper.java   | 38 ++++------------
 .../util/AppointmentListMessageBodyWriter.java     |  2 +-
 .../util/AppointmentMessageBodyWriter.java         |  2 +-
 .../webservice/util/AppointmentParamConverter.java | 19 ++------
 .../webservice/util/CalendarParamConverter.java    | 51 ----------------------
 .../webservice/util/OmParamConverterProvider.java  |  5 +--
 .../webservice/util/UserMessageBodyWriter.java     |  2 +-
 .../webservice/util/UserParamConverter.java        |  6 +--
 19 files changed, 127 insertions(+), 180 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
index 1d7cca6df..a2d41e646 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
@@ -125,8 +125,8 @@ public class AppointmentDao implements 
IDataProviderDao<Appointment>{
                                        || !CS.equals(a0.getTitle(), 
a.getTitle())
                                        || !CS.equals(a0.getDescription(), 
a.getDescription())
                                        || !CS.equals(a0.getLocation(), 
a.getLocation())
-                                       || 
!a0.getStart().getTime().equals(a.getStart())
-                                       || 
!a0.getEnd().getTime().equals(a.getEnd());
+                                       || !a0.getStart().equals(a.getStart())
+                                       || !a0.getEnd().equals(a.getEnd());
                        List<MeetingMember> mmList = a.getMeetingMembers();
                        if (mmList != null){
                                for (MeetingMember mm : mmList) {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
index f197924a2..297a2770f 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
@@ -18,12 +18,12 @@
  */
 package org.apache.openmeetings.db.dto.calendar;
 
+import static org.apache.openmeetings.util.CalendarHelper.getISO;
+
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
-import java.util.TimeZone;
 
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
@@ -34,8 +34,8 @@ import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
-import org.apache.openmeetings.db.util.TimezoneUtil;
 
+import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
 @XmlRootElement
@@ -45,8 +45,8 @@ public class AppointmentDTO implements Serializable {
        private Long id;
        private String title;
        private String location;
-       private Calendar start;
-       private Calendar end;
+       private Date start;
+       private Date end;
        private String description;
        private UserDTO owner;
        private Date inserted;
@@ -70,11 +70,8 @@ public class AppointmentDTO implements Serializable {
                id = a.getId();
                title = a.getTitle();
                location = a.getLocation();
-               TimeZone tz = TimezoneUtil.getTimeZone(a.getOwner());
-               start = Calendar.getInstance(tz);
-               start.setTime(a.getStart());
-               end = Calendar.getInstance(tz);
-               end.setTime(a.getEnd());
+               start = a.getStart();
+               end = a.getEnd();
                description = a.getDescription();
                owner = new UserDTO(a.getOwner());
                inserted = a.getInserted();
@@ -118,19 +115,19 @@ public class AppointmentDTO implements Serializable {
                this.location = location;
        }
 
-       public Calendar getStart() {
+       public Date getStart() {
                return start;
        }
 
-       public void setStart(Calendar start) {
+       public void setStart(Date start) {
                this.start = start;
        }
 
-       public Calendar getEnd() {
+       public Date getEnd() {
                return end;
        }
 
-       public void setEnd(Calendar end) {
+       public void setEnd(Date end) {
                this.end = end;
        }
 
@@ -254,8 +251,26 @@ public class AppointmentDTO implements Serializable {
                this.password = password;
        }
 
+       public JSONObject toJson() {
+               JSONObject o = new JSONObject(this)
+                       .put("start", getISO(start, owner.getTimeZoneId()))
+                       .put("end", getISO(end, owner.getTimeZoneId()))
+                       .put("inserted", getISO(inserted, 
owner.getTimeZoneId()))
+                       .put("updated", getISO(updated, owner.getTimeZoneId()));
+               if (meetingMembers != null && !meetingMembers.isEmpty()) {
+                       JSONArray arr = new JSONArray();
+                       for (MeetingMemberDTO m : meetingMembers) {
+                               arr.put(m.toJson());
+                       }
+                       o.put("meetingMembers", arr);
+               } else {
+                       o.remove("meetingMembers");
+               }
+               return o;
+       }
+
        @Override
        public String toString() {
-               return new JSONObject(this).toString();
+               return toJson().toString();
        }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
index 0a5875132..48fdb2376 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
@@ -70,8 +70,14 @@ public class MeetingMemberDTO implements Serializable {
                return m;
        }
 
+       public JSONObject toJson() {
+               return new JSONObject()
+                       .put("id", id)
+                       .put("user", user.toJson());
+       }
+
        @Override
        public String toString() {
-               return new JSONObject(this).toString();
+               return toJson().toString();
        }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
index dbd77aa15..8fe245d16 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
@@ -21,6 +21,7 @@ package org.apache.openmeetings.db.dto.user;
 import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
 import static org.apache.openmeetings.db.util.DtoHelper.optEnumList;
 import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+import static org.apache.openmeetings.util.CalendarHelper.getISO;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -217,8 +218,18 @@ public class UserDTO implements Serializable {
                return u;
        }
 
+       public JSONObject toJson() {
+               JSONObject u = new JSONObject(this);
+               if (address != null) {
+                       JSONObject a = u.getJSONObject("address");
+                       a.put("inserted", getISO(address.getInserted(), 
timeZoneId))
+                               .put("updated", getISO(address.getUpdated(), 
timeZoneId));
+               }
+               return u;
+       }
+
        @Override
        public String toString() {
-               return new JSONObject(this).toString();
+               return toJson().toString();
        }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
index ce69bcacd..e55d6dbad 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
@@ -52,8 +52,8 @@ public class CalendarMapper {
                a.setId(dto.getId());
                a.setTitle(dto.getTitle());
                a.setLocation(dto.getLocation());
-               a.setStart(dto.getStart().getTime());
-               a.setEnd(dto.getEnd().getTime());
+               a.setStart(dto.getStart());
+               a.setEnd(dto.getEnd());
                a.setDescription(sanitize(dto.getDescription()));
                a.setOwner(dto.getOwner() == null ? u : 
userDao.get(dto.getOwner().getId()));
                a.setInserted(dto.getInserted());
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
index 1a5ee5989..c2ef25bfd 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/CalendarHelper.java
@@ -18,11 +18,11 @@
  */
 package org.apache.openmeetings.util;
 
-import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
@@ -47,8 +47,7 @@ public class CalendarHelper {
        }
 
        public static ZonedDateTime getZoneDateTime(Date d, String tzId) {
-               long milli = (d == null ? new Date() : d).getTime();
-               return Instant.ofEpochMilli(milli).atZone(getZoneId(tzId));
+               return ZonedDateTime.ofInstant((d == null ? new Date() : 
d).toInstant(), getZoneId(tzId));
        }
 
        public static LocalDate getDate(Date d, String tzId) {
@@ -59,6 +58,10 @@ public class CalendarHelper {
                return getZoneDateTime(d == null ? new Date() : d, 
tzId).toLocalDateTime();
        }
 
+       public static String getISO(Date d, String tzId) {
+               return d == null ? null : getZoneDateTime(d, 
tzId).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+       }
+
        public static String formatMillis(long millis) {
                long m = millis;
                long hours = TimeUnit.MILLISECONDS.toHours(m);
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java 
b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
index 1013cdb6c..22fc5538a 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
@@ -36,7 +36,7 @@ import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.util.tester.FormTester;
 import org.junit.jupiter.api.Test;
 
-import org.wicketstuff.jquery.ui.calendar6.CalendarView;
+import org.wicketstuff.jquery.ui.calendar7.CalendarView;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar;
 
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestCalendarService.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestCalendarService.java
index 255dacd25..a60c5b310 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestCalendarService.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestCalendarService.java
@@ -34,6 +34,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Stream;
 
 import jakarta.ws.rs.core.Form;
@@ -55,7 +56,6 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.mapper.CalendarMapper;
 import org.apache.openmeetings.util.CalendarHelper;
-import org.apache.openmeetings.webservice.util.AppointmentParamConverter;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
@@ -190,6 +190,35 @@ class TestCalendarService extends AbstractWebServiceTest {
                createApp("test");
        }
 
+       @Test
+       void testUpdateWrongOwner() throws Exception {
+               JSONObject o1 = createAppointment("SOAP event");
+
+               String sid1 = loginNewUser();
+
+               Response resp1 = getClient(getCalendarUrl())
+                               .path("/")
+                               .query("sid", sid1)
+                               .form(new Form().param("appointment", 
o1.toString()));
+
+               assertNotNull(resp1, "Valid AppointmentDTO should be returned");
+               assertEquals(Response.Status.OK.getStatusCode(), 
resp1.getStatus(), "Call should be successful");
+               AppointmentDTO dto = resp1.readEntity(AppointmentDTO.class);
+               assertNotNull(dto, "Valid DTO should be returned");
+               assertNotNull(dto.getId(), "DTO id should be valid");
+
+               JSONObject o2 = dto.toJson();
+               o2.put("title", "hijacked").put("owner", null);
+
+               String sid2 = loginNewUser();
+               Response resp2 = getClient(getCalendarUrl())
+                               .path("/")
+                               .query("sid", sid2)
+                               .form(new Form().param("appointment", 
o2.toString()));
+               assertNotNull(resp2, "Valid AppointmentDTO should be returned");
+               
assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), 
resp2.getStatus(), "Call should NOT be successful");
+       }
+
        @Test
        void testDelete() {
                ServiceResult sr = login();
@@ -204,9 +233,9 @@ class TestCalendarService extends AbstractWebServiceTest {
        @Test
        void testCreateWithOmMm() throws Exception {
                JSONObject o = createAppointment("test")
-                               .put("meetingMembers", new JSONArray()
-                                               .put(new 
JSONObject().put("user", new JSONObject()
-                                                               .put("id", 
1))));
+                               .put("meetingMembers", new JSONArray(List.of(
+                                               new JSONObject(Map.of("user", 
new JSONObject(Map.of("id", 1))))
+                               )));
 
                String uuid = randomUUID().toString();
                User u = getUser(uuid);
@@ -265,7 +294,7 @@ class TestCalendarService extends AbstractWebServiceTest {
                AppointmentDTO dto = createEventWithGuests(sid);
 
                //try to change MM list
-               JSONObject o1 = AppointmentParamConverter.json(dto)
+               JSONObject o1 = dto.toJson()
                                .put("meetingMembers", new JSONArray()
                                                .put(new 
JSONObject().put("user", new JSONObject()
                                                                .put("id", 
1))));
@@ -295,7 +324,7 @@ class TestCalendarService extends AbstractWebServiceTest {
                dto.getMeetingMembers().remove(initialList.size() - 1);
 
                //try to change MM list
-               JSONObject o = AppointmentParamConverter.json(dto);
+               JSONObject o = dto.toJson();
                Response resp = getClient(getCalendarUrl())
                                .path("/")
                                .query("sid", sid)
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestWebConverters.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestWebConverters.java
index ed3f4765a..2ac9382ff 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestWebConverters.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/ws/TestWebConverters.java
@@ -24,11 +24,9 @@ import java.time.LocalDate;
 import java.time.Month;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
-import java.util.Calendar;
 import java.util.Date;
 
 import org.apache.openmeetings.db.dto.user.UserDTO;
-import org.apache.openmeetings.webservice.util.CalendarParamConverter;
 import org.apache.openmeetings.webservice.util.DateParamConverter;
 import org.junit.jupiter.api.Test;
 
@@ -48,15 +46,6 @@ class TestWebConverters {
                                , "Date should be parsed");
        }
 
-       @Test
-       void testCalendarConverter() {
-               CalendarParamConverter c = new CalendarParamConverter();
-               assertEquals(null, c.fromString(null), "Null calendar should be 
parsed");
-               Calendar cal = Calendar.getInstance();
-               cal.setTime(Date.from(LocalDate.of(2017, Month.JANUARY, 
15).atStartOfDay(ZoneId.systemDefault()).toInstant()));
-               assertEquals(cal, c.fromString("2017-01-15"), "Calendar should 
be parsed");
-       }
-
        @Test
        void testUserConverter() {
                assertEquals(null, UserDTO.get((JSONObject)null), "Null UserDTO 
should be parsed");
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
index 9fc1c2d68..17a9049b0 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
@@ -292,7 +292,7 @@ public class CalendarWebService extends BaseWebService {
        @POST
        @Path("/")
        @Operation(
-                       description = "Create an appointment",
+                       description = "Create/update an appointment",
                        responses = {
                                        @ApiResponse(responseCode = "200", 
description = "appointment saved",
                                                content = @Content(schema = 
@Schema(implementation = AppointmentDTOWrapper.class))),
@@ -304,7 +304,6 @@ public class CalendarWebService extends BaseWebService {
                        , @Parameter(required = true, description = "calendar 
event") @FormParam("appointment") @WebParam(name="appointment") AppointmentDTO 
appointment
                        ) throws ServiceException
        {
-               //Seems to be create
                log.debug("save SID: {}", sid);
 
                return performCall(sid, sd -> {
@@ -313,9 +312,19 @@ public class CalendarWebService extends BaseWebService {
                                        log.error("save: not authorized");
                                        return false;
                                }
-                               return 
AuthLevelUtil.hasWebServiceLevel(u.getRights())
-                                               || appointment.getOwner() == 
null
-                                               || 
appointment.getOwner().getId().equals(u.getId());
+                               // short path
+                               if 
(AuthLevelUtil.hasWebServiceLevel(u.getRights())
+                                               || (appointment.getOwner() != 
null && appointment.getOwner().getId().equals(u.getId()))
+                                               || (appointment.getOwner() == 
null && appointment.getId() == null)
+                                       )
+                               {
+                                       return true;
+                               }
+                               if (appointment.getOwner() == null && 
appointment.getId() != null) {
+                                       Appointment a = 
dao.get(appointment.getId());
+                                       return 
a.getOwner().getId().equals(u.getId());
+                               }
+                               return false;
                        }, sd -> {
                                User u = userDao.get(sd.getUserId());
                                Appointment a = calMapper.get(appointment, u);
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOListWrapper.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOListWrapper.java
index fff1a718f..407349fe2 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOListWrapper.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOListWrapper.java
@@ -53,18 +53,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
                              "deleted": false,
                              "email": "[email protected]",
                              "id": 1,
-                             "inserted": {
-                               "date": 29,
-                               "day": 0,
-                               "hours": 10,
-                               "minutes": 59,
-                               "month": 7,
-                               "ownerField": 1,
-                               "seconds": 49,
-                               "time": 1630191589000,
-                               "timezoneOffset": -720,
-                               "year": 121
-                             }
+                             "inserted": "2021-09-19T10:59:49+1200"
                            },
                            "firstname": "firstname",
                            "id": 1,
@@ -89,18 +78,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
                          "deleted": false,
                          "email": "[email protected]",
                          "id": 1,
-                         "inserted": {
-                           "date": 29,
-                           "day": 0,
-                           "hours": 10,
-                           "minutes": 59,
-                           "month": 7,
-                           "ownerField": 1,
-                           "seconds": 49,
-                           "time": 1630191589000,
-                           "timezoneOffset": -720,
-                           "year": 121
-                         }
+                         "inserted": "2021-09-19T10:59:49+1200"
                        },
                        "firstname": "firstname",
                        "id": 1,
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOWrapper.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOWrapper.java
index 9199ce9a8..f1beefba9 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOWrapper.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/schema/AppointmentDTOWrapper.java
@@ -50,19 +50,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
                              "deleted": false,
                              "email":   "[email protected]",
                              "id": 1,
-                             "inserted": {
-                               "date": 29,
-                               "day": 0,
-                               "hours": 10,
-                               "minutes": 59,
-                               "month": 7,
-                               "ownerField": 1,
-                               "seconds": 49,
-                               "time": 1630191589000,
-                               "timezoneOffset": -720,
-                               "year": 121
-                           }
-                         },
+                             "inserted": "2021-09-19T10:59:49+1200"
+                           },
                            "firstname":   "firstname",
                            "id": 1,
                            "languageId": 1,
@@ -74,7 +63,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
                              "DASHBOARD",
                              "ADMIN",
                              "LOGIN  "
-                         ],
+                           ],
                            "timeZoneId":   "Europe/Berlin",
                            "type":   "USER"
                        }
@@ -86,19 +75,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
                          "deleted": false,
                          "email":   "[email protected]",
                          "id": 1,
-                         "inserted": {
-                           "date": 29,
-                           "day": 0,
-                           "hours": 10,
-                           "minutes": 59,
-                           "month": 7,
-                           "ownerField": 1,
-                           "seconds": 49,
-                           "time": 1630191589000,
-                           "timezoneOffset": -720,
-                           "year": 121
-                       }
-                     },
+                         "inserted": "2021-09-19T10:59:49+1200"
+                       },
                        "firstname":   "firstname",
                        "id": 1,
                        "languageId": 1,
@@ -110,10 +88,10 @@ import io.swagger.v3.oas.annotations.media.Schema;
                          "DASHBOARD",
                          "ADMIN",
                          "LOGIN"
-                     ],
+                       ],
                        "timeZoneId":   "Europe/Berlin",
                        "type":   "USER"
-                   },
+                     },
                      "passwordProtected": false,
                      "reminder":   "ICAL",
                      "reminderEmailSend": false,
@@ -136,7 +114,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
                        "type":   "CONFERENCE",
                        "waitModerator": false,
                        "waitRecording": false
-                   },
+                     },
                      "start":   "2021-09-23T11:31:00+1200",
                      "title":   "New Event"
                  }
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
index 3765fcf3b..f3813495e 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentListMessageBodyWriter.java
@@ -68,7 +68,7 @@ public class AppointmentListMessageBodyWriter implements 
MessageBodyWriter<List<
                Writer writer = new OutputStreamWriter(out, UTF_8);
                JSONArray rr = new JSONArray();
                for (AppointmentDTO dto : t) {
-                       rr.put(AppointmentParamConverter.json(dto));
+                       rr.put(dto.toJson());
                }
                writer.write(new JSONObject().put(ROOT, rr).toString());
                writer.flush();
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
index 42de63dc1..66e1f144f 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentMessageBodyWriter.java
@@ -57,7 +57,7 @@ public class AppointmentMessageBodyWriter implements 
MessageBodyWriter<Appointme
                        throws IOException
        {
                Writer writer = new OutputStreamWriter(out, UTF_8);
-               writer.write(new JSONObject().put(ROOT, 
AppointmentParamConverter.json(t)).toString());
+               writer.write(new JSONObject().put(ROOT, t.toJson()).toString());
                writer.flush();
        }
 }
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
index b557f1a8e..c1fd31217 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AppointmentParamConverter.java
@@ -20,9 +20,6 @@ package org.apache.openmeetings.webservice.util;
 
 import static org.apache.openmeetings.db.util.DtoHelper.optEnum;
 import static org.apache.openmeetings.db.util.DtoHelper.optLong;
-import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
-
-import java.util.Date;
 
 import jakarta.ws.rs.ext.ParamConverter;
 
@@ -49,9 +46,8 @@ public class AppointmentParamConverter implements 
ParamConverter<AppointmentDTO>
                a.setTitle(o.optString("title"));
                a.setLocation(o.optString("location"));
                a.setOwner(UserDTO.get(o.optJSONObject("owner")));
-               String tzId = a.getOwner() == null ? null : 
a.getOwner().getTimeZoneId();
-               a.setStart(CalendarParamConverter.get(o.optString("start"), 
tzId));
-               a.setEnd(CalendarParamConverter.get(o.optString("end"), tzId));
+               a.setStart(DateParamConverter.get(o.optString("start")));
+               a.setEnd(DateParamConverter.get(o.optString("end")));
                a.setDescription(o.optString("description"));
                a.setInserted(DateParamConverter.get(o.optString("inserted")));
                a.setUpdated(DateParamConverter.get(o.optString("updated")));
@@ -73,17 +69,8 @@ public class AppointmentParamConverter implements 
ParamConverter<AppointmentDTO>
                return a;
        }
 
-       public static JSONObject json(AppointmentDTO val) {
-               Date i = val.getInserted(), u = val.getUpdated();
-               return new JSONObject(val)
-                               .put("start", 
ISO8601_FULL_FORMAT.format(val.getStart()))
-                               .put("end", 
ISO8601_FULL_FORMAT.format(val.getEnd()))
-                               .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();
+               return val.toString();
        }
 }
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
deleted file mode 100644
index 31ee459be..000000000
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/CalendarParamConverter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.util;
-
-import static 
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT;
-
-import java.util.Calendar;
-import java.util.TimeZone;
-
-import jakarta.ws.rs.ext.ParamConverter;
-
-import org.apache.wicket.util.string.Strings;
-
-public class CalendarParamConverter implements ParamConverter<Calendar> {
-       public static Calendar get(String val, String tzId) {
-               Calendar c = Strings.isEmpty(tzId) ? Calendar.getInstance() : 
Calendar.getInstance(TimeZone.getTimeZone(tzId));
-               c.setTime(DateParamConverter.get(val));
-               return c;
-       }
-
-       @Override
-       public Calendar fromString(String val) {
-               if (Strings.isEmpty(val)) {
-                       return null;
-               }
-               Calendar c = Calendar.getInstance();
-               c.setTime(DateParamConverter.get(val));
-               return c;
-       }
-
-       @Override
-       public String toString(Calendar val) {
-               return ISO8601_FULL_FORMAT.format(val);
-       }
-}
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
index ca5ae0c75..91f907e75 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/OmParamConverterProvider.java
@@ -20,7 +20,6 @@ package org.apache.openmeetings.webservice.util;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
-import java.util.Calendar;
 import java.util.Date;
 
 import jakarta.ws.rs.ext.ParamConverter;
@@ -34,9 +33,7 @@ public class OmParamConverterProvider implements 
ParamConverterProvider {
        @SuppressWarnings("unchecked")
        @Override
        public <T> ParamConverter<T> getConverter(Class<T> rawType, Type 
genericType, Annotation[] annotations) {
-               if (Calendar.class.isAssignableFrom(rawType)) {
-                       return (ParamConverter<T>)new CalendarParamConverter();
-               } else if (Date.class.isAssignableFrom(rawType)) {
+               if (Date.class.isAssignableFrom(rawType)) {
                        return (ParamConverter<T>)new DateParamConverter();
                } else if (AppointmentDTO.class.isAssignableFrom(rawType)) {
                        return (ParamConverter<T>)new 
AppointmentParamConverter();
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
index 0ed1f7edd..bcb062cf0 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserMessageBodyWriter.java
@@ -57,7 +57,7 @@ public class UserMessageBodyWriter implements 
MessageBodyWriter<UserDTO> {
                        throws IOException
        {
                Writer writer = new OutputStreamWriter(out, UTF_8);
-               writer.write(new JSONObject().put(ROOT, 
UserParamConverter.json(t)).toString());
+               writer.write(new JSONObject().put(ROOT, t.toJson()).toString());
                writer.flush();
        }
 }
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
index ec4bc8d43..01b27f342 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/UserParamConverter.java
@@ -36,12 +36,8 @@ public class UserParamConverter implements 
ParamConverter<UserDTO> {
                return UserDTO.get(o);
        }
 
-       public static JSONObject json(UserDTO val) {
-               return new JSONObject(val);
-       }
-
        @Override
        public String toString(UserDTO val) {
-               return json(val).toString();
+               return val.toJson().toString();
        }
 }

Reply via email to