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 e5f6815  [OPENMEETINGS-2639] invitation hash should be generated for 
password protected invitations
e5f6815 is described below

commit e5f6815235573ab820f9f5352083a5dfe83002cc
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Aug 10 23:56:29 2021 +0700

    [OPENMEETINGS-2639] invitation hash should be generated for password 
protected invitations
---
 .../db/entity/calendar/Appointment.java            |  4 ++
 .../openmeetings/db/entity/room/Invitation.java    |  4 ++
 .../apache/openmeetings/db/entity/room/Room.java   |  4 ++
 .../apache/openmeetings/web/app/Application.java   | 67 ++++++++++------------
 .../apache/openmeetings/web/room/RoomPanel.java    | 50 +++-------------
 .../webservice/CalendarWebService.java             |  2 +-
 6 files changed, 52 insertions(+), 79 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
index 13cb47e..e592d3b 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/calendar/Appointment.java
@@ -499,6 +499,10 @@ public class Appointment extends HistoricalEntity {
                this.etag = etag;
        }
 
+       public boolean isOwner(Long userId) {
+               return owner.getId().equals(userId);
+       }
+
        @Override
        public String toString() {
                return "Appointment [id=" + id + ", title=" + title + ", 
start=" + start + ", end=" + end + ", owner=" + owner
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
index 062600c..76a46c8 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Invitation.java
@@ -271,4 +271,8 @@ public class Invitation extends HistoricalEntity {
        public void setAllowEntry(boolean allowEntry) {
                this.allowEntry = allowEntry;
        }
+
+       public boolean isOwner(Long userId) {
+               return invitedBy != null && invitedBy.getId().equals(userId);
+       }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
index 4e7f986..30404c5 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
@@ -630,6 +630,10 @@ public class Room extends HistoricalEntity {
                this.files = files;
        }
 
+       public boolean isOwner(Long userId) {
+               return ownerId != null && ownerId.equals(userId);
+       }
+
        @Override
        public String toString() {
                return "Room [id=" + id + ", name=" + name + ", type=" + type + 
"]";
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index a173df2..1c427f2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -41,6 +41,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.websocket.WebSocketContainer;
@@ -61,6 +62,7 @@ import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
+import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
@@ -521,23 +523,17 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                Room r = i.getRoom();
                User u = i.getInvitee();
                if (r != null) {
-                       if (r.isAppointment() && 
i.getInvitedBy().getId().equals(u.getId())) {
-                               link = getRoomUrlFragment(r.getId()).getLink();
-                       } else {
-                               boolean allowed = Type.CONTACT != u.getType() 
&& Type.EXTERNAL != u.getType();
-                               if (allowed) {
-                                       allowed = get().isRoomAllowedToUser(r, 
u);
-                               }
-                               if (allowed) {
-                                       link = 
getRoomUrlFragment(r.getId()).getLink();
-                               } else {
-                                       PageParameters pp = new 
PageParameters();
-                                       pp.add(INVITATION_HASH, i.getHash());
-                                       if (u.getLanguageId() > 0) {
-                                               pp.add("language", 
u.getLanguageId());
-                                       }
-                                       link = urlForPage(HashPage.class, pp, 
baseUrl);
+                       if ((i.isPasswordProtected() && !r.isOwner(u.getId())) 
// invitation is password-protected and invitee is not owner
+                                       || Type.CONTACT == u.getType() || 
Type.EXTERNAL == u.getType() || !get().isRoomAllowedToUser(r, u)) // no-access
+                       {
+                               PageParameters pp = new PageParameters();
+                               pp.add(INVITATION_HASH, i.getHash());
+                               if (u.getLanguageId() > 0) {
+                                       pp.add("language", u.getLanguageId());
                                }
+                               link = urlForPage(HashPage.class, pp, baseUrl);
+                       } else {
+                               link = getRoomUrlFragment(r.getId()).getLink();
                        }
                }
                Recording rec = i.getRecording();
@@ -551,30 +547,28 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                if (a == null || a.isDeleted()) {
                        return false;
                }
-               if (a.getOwner().getId().equals(u.getId())) {
+               if (a.isOwner(u.getId())) {
                        log.debug("[isRoomAllowedToUser] appointed room, Owner 
entered");
                        return true;
                }
-               for (MeetingMember mm : a.getMeetingMembers()) {
-                       if (mm.getUser().getId().equals(u.getId())) {
-                               return true;
-                       }
-               }
-               return false;
+               return a.getMeetingMembers().stream()
+                               .map(MeetingMember::getUser)
+                               .map(User::getId)
+                               .anyMatch(userId -> userId.equals(u.getId()));
        }
 
        private static boolean checkGroups(Room r, User u) {
                if (null == r.getGroups()) { //u.getGroupUsers() can't be null 
due to user was able to login
                        return false;
                }
-               for (RoomGroup ro : r.getGroups()) {
-                       for (GroupUser ou : u.getGroupUsers()) {
-                               if 
(ro.getGroup().getId().equals(ou.getGroup().getId())) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
+               Set<Long> roomGroups = r.getGroups().stream()
+                               .map(RoomGroup::getGroup)
+                               .map(Group::getId)
+                               .collect(Collectors.toSet());
+               return u.getGroupUsers().stream()
+                               .map(GroupUser::getGroup)
+                               .map(Group::getId)
+                               .anyMatch(roomGroups::contains);
        }
 
        public boolean isRoomAllowedToUser(Room r, User u) {
@@ -584,13 +578,12 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                if (r.isAppointment()) {
                        Appointment a = appointmentDao.getByRoom(r.getId());
                        return checkAppointment(a, u);
-               } else {
-                       if (r.getIspublic() || (r.getOwnerId() != null && 
r.getOwnerId().equals(u.getId()))) {
-                               log.debug("[isRoomAllowedToUser] public ? {} , 
ownedId ? {} ALLOWED", r.getIspublic(), r.getOwnerId());
-                               return true;
-                       }
-                       return checkGroups(r, u);
                }
+               if (r.getIspublic() || r.isOwner(u.getId())) {
+                       log.debug("[isRoomAllowedToUser] public ? {} , ownedId 
? {} ALLOWED", r.getIspublic(), r.getOwnerId());
+                       return true;
+               }
+               return checkGroups(r, u);
        }
 
        public static boolean isUrlValid(String url) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index de66749..ced060d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -46,20 +46,18 @@ import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
-import org.apache.openmeetings.db.entity.calendar.MeetingMember;
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.room.RoomGroup;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
-import org.apache.openmeetings.db.entity.user.GroupUser;
-import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.RoomMessage.Type;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.NullStringer;
+import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.ClientManager;
 import org.apache.openmeetings.web.app.QuickPollManager;
 import org.apache.openmeetings.web.app.TimerService;
@@ -332,47 +330,17 @@ public class RoomPanel extends BasePanel {
                } else if (r.getId().equals(WebSession.get().getRoomId())) {
                        // secureHash/invitationHash, already checked
                } else {
-                       boolean allowed = false;
+                       boolean allowed = 
Application.get().isRoomAllowedToUser(r, c.getUser());
                        String deniedMessage = null;
                        if (r.isAppointment()) {
                                Appointment a = apptDao.getByRoom(r.getId());
-                               if (a != null && !a.isDeleted()) {
-                                       boolean isOwner = 
a.getOwner().getId().equals(getUserId());
-                                       allowed = isOwner;
-                                       log.debug("appointed room, isOwner ? 
{}", isOwner);
-                                       if (!allowed) {
-                                               for (MeetingMember mm : 
a.getMeetingMembers()) {
-                                                       if 
(getUserId().equals(mm.getUser().getId())) {
-                                                               allowed = true;
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                                       if (allowed) {
-                                               Calendar cal = 
WebSession.getCalendar();
-                                               if (isOwner || 
cal.getTime().after(allowedStart(a.getStart())) && 
cal.getTime().before(a.getEnd())) {
-                                                       eventDetail = new 
EventDetailDialog(EVENT_DETAILS_ID, a);
-                                               } else {
-                                                       allowed = false;
-                                                       deniedMessage = 
String.format("%s %s - %s", getString("error.hash.period"), 
getDateFormat().format(a.getStart()), getDateFormat().format(a.getEnd()));
-                                               }
-                                       }
-                               }
-                       } else {
-                               allowed = r.getIspublic() || (r.getOwnerId() != 
null && r.getOwnerId().equals(getUserId()));
-                               log.debug("public ? {}, ownedId ? {} {}", 
r.getIspublic(), r.getOwnerId(), allowed);
-                               if (!allowed) {
-                                       User u = c.getUser();
-                                       for (RoomGroup ro : r.getGroups()) {
-                                               for (GroupUser ou : 
u.getGroupUsers()) {
-                                                       if 
(ro.getGroup().getId().equals(ou.getGroup().getId())) {
-                                                               allowed = true;
-                                                               break;
-                                                       }
-                                               }
-                                               if (allowed) {
-                                                       break;
-                                               }
+                               if (allowed) {
+                                       Calendar cal = WebSession.getCalendar();
+                                       if (a.isOwner(getUserId()) || 
cal.getTime().after(allowedStart(a.getStart())) && 
cal.getTime().before(a.getEnd())) {
+                                               eventDetail = new 
EventDetailDialog(EVENT_DETAILS_ID, a);
+                                       } else {
+                                               allowed = false;
+                                               deniedMessage = 
String.format("%s %s - %s", getString("error.hash.period"), 
getDateFormat().format(a.getStart()), getDateFormat().format(a.getEnd()));
                                        }
                                }
                        }
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 a75a6d8..08aa687 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
@@ -288,7 +288,7 @@ public class CalendarWebService extends BaseWebService {
                                        return true;
                                        // fine
                                }
-                               if (AuthLevelUtil.hasUserLevel(rights) && 
a.getOwner().getId().equals(sd.getUserId())) {
+                               if (AuthLevelUtil.hasUserLevel(rights) && 
a.isOwner(sd.getUserId())) {
                                        return true;
                                }
                                return false;

Reply via email to