diff --git a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java index 796778256290610649a22a404ca28e538bd651b1..9e13e72689afe464dfe45c0b30cfb933362bccb6 100644 --- a/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java +++ b/src/main/java/org/olat/course/nodes/BigBlueButtonCourseNode.java @@ -101,9 +101,9 @@ public class BigBlueButtonCourseNode extends AbstractAccessableCourseNode { String message = trans.translate("guestnoaccess.message"); controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message); } else { - // check if user is moderator of the virtual classroom - boolean admin = userCourseEnv.isAdmin(); - boolean moderator = admin || userCourseEnv.isCoach(); + // check if user is admin. / moderator of the virtual classroom + boolean admin = userCourseEnv.isAdmin() || userCourseEnv.isCoach(); + boolean moderator = userCourseEnv.isAdmin() || userCourseEnv.isCoach(); // create run controller RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java index e0a3030259b62486784f9eb597cd94ae3d3b8a77..2a735966437c126e02117a717cec7d19b942b701 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java +++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonManager.java @@ -23,6 +23,7 @@ import java.util.Date; import java.util.List; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.group.BusinessGroup; import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors; import org.olat.repository.RepositoryEntry; @@ -70,6 +71,10 @@ public interface BigBlueButtonManager { public List<BigBlueButtonMeetingTemplate> getTemplates(); + public List<BigBlueButtonMeetingTemplate> getTemplates(List<BigBlueButtonRoles> editionRoles); + + public List<BigBlueButtonRoles> calculatePermittedRoles(RepositoryEntry entry, BusinessGroup businessGroup, Identity identity, Roles userRoles); + public BigBlueButtonMeetingTemplate updateTemplate(BigBlueButtonMeetingTemplate template); public void deleteTemplate(BigBlueButtonMeetingTemplate template); diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java index 73a211b60d96d4788731e73eee24e401d51e18e4..d2d156ad93b12048424ba9a9251e115bccd06a49 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java +++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonMeetingTemplate.java @@ -139,6 +139,16 @@ public interface BigBlueButtonMeetingTemplate extends ModifiedInfo, CreateInfo { public GuestPolicyEnum getGuestPolicyEnum(); public void setGuestPolicyEnum(GuestPolicyEnum guestPolicy); - - + + public default boolean availableTo(List<BigBlueButtonRoles> editionRoles) { + List<BigBlueButtonRoles> roles = getPermittedRolesEnum(); + for(BigBlueButtonRoles role:roles) { + for(BigBlueButtonRoles editionRole:editionRoles) { + if(role.accept(editionRole)) { + return true; + } + } + } + return false; + } } diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java index 2e6002532731a9a74f4c63a89b6552eda1564fa7..265eab6d52315bd064b6c06dd478c9ce9d3dd54b 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java @@ -20,6 +20,7 @@ package org.olat.modules.bigbluebutton.manager; import java.net.URI; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -35,6 +36,7 @@ import org.olat.commons.calendar.model.Kalendar; import org.olat.commons.calendar.model.KalendarEvent; import org.olat.commons.calendar.ui.components.KalendarRenderWrapper; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.id.User; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.logging.Tracing; @@ -44,6 +46,7 @@ import org.olat.core.util.WebappHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupService; import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate; @@ -56,6 +59,8 @@ import org.olat.modules.bigbluebutton.model.BigBlueButtonErrorCodes; import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; +import org.olat.repository.RepositoryEntrySecurity; +import org.olat.repository.RepositoryManager; import org.olat.repository.manager.RepositoryEntryDAO; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -76,10 +81,14 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ @Autowired private CalendarManager calendarManager; @Autowired + private RepositoryManager repositoryManager; + @Autowired private RepositoryEntryDAO repositoryEntryDao; @Autowired private BigBlueButtonModule bigBlueButtonModule; @Autowired + private BusinessGroupService businessGroupService; + @Autowired private BigBlueButtonMeetingDAO bigBlueButtonMeetingDao; @Autowired private BigBlueButtonMeetingTemplateDAO bigBlueButtonMeetingTemplateDao; @@ -249,6 +258,19 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ return bigBlueButtonMeetingTemplateDao.getTemplates(); } + @Override + public List<BigBlueButtonMeetingTemplate> getTemplates(List<BigBlueButtonRoles> editionRoles) { + List<BigBlueButtonMeetingTemplate> templates = getTemplates(); + + List<BigBlueButtonMeetingTemplate> authorisedTemplates = new ArrayList<>(); + for(BigBlueButtonMeetingTemplate template:templates) { + if(template.isEnabled() && template.availableTo(editionRoles)) { + authorisedTemplates.add(template); + } + } + return authorisedTemplates; + } + @Override public List<BigBlueButtonMeeting> getAllMeetings() { return bigBlueButtonMeetingDao.getAllMeetings(); @@ -334,6 +356,38 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ } return wrapper == null ? null: wrapper.getKalendar(); } + + @Override + public List<BigBlueButtonRoles> calculatePermittedRoles(RepositoryEntry entry, BusinessGroup businessGroup, Identity identity, Roles userRoles) { + List<BigBlueButtonRoles> editionRoles = new ArrayList<>(); + if(userRoles.isAdministrator() || userRoles.isSystemAdmin()) { + editionRoles.add(BigBlueButtonRoles.administrator); + } + if(userRoles.isAuthor() || userRoles.isLearnResourceManager()) { + // global authors / LR-managers can use author templates also in groups + editionRoles.add(BigBlueButtonRoles.author); + } + + if(businessGroup != null) { + if(businessGroupService.isIdentityInBusinessGroup(identity, businessGroup)) { + // all group user can choose the group templates (if they are allowed to create group online-meetings) + editionRoles.add(BigBlueButtonRoles.group); + if(businessGroupService.isIdentityInBusinessGroup(identity, businessGroup.getKey(), true, false, null)) { + editionRoles.add(BigBlueButtonRoles.coach); + } + } + } else if(entry != null) { + RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(identity, userRoles, entry); + if(reSecurity.isEntryAdmin()) { + editionRoles.add(BigBlueButtonRoles.owner); + } + if(reSecurity.isCourseCoach()) { + editionRoles.add(BigBlueButtonRoles.coach); + } + } + + return editionRoles; + } @Override public boolean isMeetingRunning(BigBlueButtonMeeting meeting) { diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java index cf603c792c1abfa0b4334199617d76faf0d116a0..38c9c6490673b0d4de407a963ddf8ca243cb6470 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonEditMeetingsController.java @@ -19,7 +19,6 @@ */ package org.olat.modules.bigbluebutton.ui; -import java.util.ArrayList; import java.util.List; import org.olat.core.commons.persistence.SortKey; @@ -42,9 +41,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; -import org.olat.core.id.Roles; import org.olat.group.BusinessGroup; -import org.olat.group.BusinessGroupService; import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonModule; @@ -53,8 +50,6 @@ import org.olat.modules.bigbluebutton.model.BigBlueButtonErrors; import org.olat.modules.bigbluebutton.ui.BigBlueButtonMeetingTableModel.BMeetingsCols; import org.olat.modules.gotomeeting.ui.GoToMeetingTableModel.MeetingsCols; import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryEntrySecurity; -import org.olat.repository.RepositoryManager; import org.springframework.beans.factory.annotation.Autowired; /** @@ -78,14 +73,10 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private final RepositoryEntry entry; private final BusinessGroup businessGroup; - @Autowired - private RepositoryManager repositoryManager; @Autowired private BigBlueButtonModule bigBlueButtonModule; @Autowired private BigBlueButtonManager bigBlueButtonManager; - @Autowired - private BusinessGroupService businessGroupService; public BigBlueButtonEditMeetingsController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, String subIdentifier, BusinessGroup group, boolean readOnly) { @@ -194,7 +185,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private void doAddMeeting(UserRequest ureq) { if(guardModalController(editMeetingCtlr)) return; - List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq); + List<BigBlueButtonRoles> editionRoles= bigBlueButtonManager + .calculatePermittedRoles(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles()); editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), entry, subIdent, businessGroup, editionRoles); listenTo(editMeetingCtlr); @@ -208,7 +200,8 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { private void doEditMeeting(UserRequest ureq, BigBlueButtonMeeting meeting) { if(guardModalController(editMeetingCtlr)) return; - List<BigBlueButtonRoles> editionRoles= getPermittedRoles(ureq); + List<BigBlueButtonRoles> editionRoles= bigBlueButtonManager + .calculatePermittedRoles(entry, businessGroup, getIdentity(), ureq.getUserSession().getRoles()); editMeetingCtlr = new EditBigBlueButtonMeetingController(ureq, getWindowControl(), meeting, editionRoles); listenTo(editMeetingCtlr); @@ -219,40 +212,6 @@ public class BigBlueButtonEditMeetingsController extends FormBasicController { listenTo(cmc); } - private List<BigBlueButtonRoles> getPermittedRoles(UserRequest ureq) { - Roles roles = ureq.getUserSession().getRoles(); - - List<BigBlueButtonRoles> editionRoles = new ArrayList<>(); - if(businessGroup != null) { - if(roles.isAdministrator() || roles.isSystemAdmin()) { - editionRoles.add(BigBlueButtonRoles.administrator); - } - if(roles.isAuthor() || roles.isLearnResourceManager()) { - // global authors / LR-managers can use author templates also in groups - editionRoles.add(BigBlueButtonRoles.author); - } - if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), businessGroup)) { - // all group user can choose the group templates (if they are allowed to create group online-meetings) - editionRoles.add(BigBlueButtonRoles.group); - } - } else if(entry != null) { - RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(getIdentity(), roles, entry); - if(roles.isAdministrator() || roles.isSystemAdmin()) { - editionRoles.add(BigBlueButtonRoles.administrator); - } - if(reSecurity.isAuthor() || roles.isLearnResourceManager()) { - editionRoles.add(BigBlueButtonRoles.author); - } - if(reSecurity.isEntryAdmin()) { - editionRoles.add(BigBlueButtonRoles.owner); - } - if(reSecurity.isCourseCoach()) { - editionRoles.add(BigBlueButtonRoles.coach); - } - } - return editionRoles; - } - private void doConfirmDelete(UserRequest ureq, BigBlueButtonMeeting meeting) { String confirmDeleteTitle = translate("confirm.delete.meeting.title", new String[]{ meeting.getName() }); String confirmDeleteText = translate("confirm.delete.meeting", new String[]{ meeting.getName() }); diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java index 5b64ec2f044c00e29b4f4939cd7237b34a842550..0c7c29216579f91a05529651a4bcd744d0cbc188 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonRunController.java @@ -19,7 +19,6 @@ */ package org.olat.modules.bigbluebutton.ui; -import java.util.ArrayList; import java.util.List; import org.olat.core.gui.UserRequest; @@ -35,12 +34,10 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.id.Roles; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.resource.OresHelper; import org.olat.group.BusinessGroup; -import org.olat.group.BusinessGroupService; import org.olat.modules.bigbluebutton.BigBlueButtonManager; import org.olat.modules.bigbluebutton.BigBlueButtonMeeting; import org.olat.modules.bigbluebutton.BigBlueButtonMeetingTemplate; @@ -79,8 +76,6 @@ public class BigBlueButtonRunController extends BasicController implements Activ @Autowired private BigBlueButtonManager bigBlueButtonManager; - @Autowired - private BusinessGroupService businessGroupService; public BigBlueButtonRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, String subIdentifier, BusinessGroup group, BigBlueButtonMeetingDefaultConfiguration configuration, boolean admin, boolean moderator, boolean readOnly) { @@ -122,40 +117,15 @@ public class BigBlueButtonRunController extends BasicController implements Activ private boolean hasAtLeastOneTemplate(UserRequest ureq) { - // TODO: refactor: copy paste from BigBlueButtonEditMeetingsController.getPermittedRoles() - // should also apply to group config form: don't let regular students enable bbb in groups when they have no + // TODO bbb should also apply to group config form: don't let regular students enable bbb in groups when they have no // template to choose from. - Roles userRoles = ureq.getUserSession().getRoles(); - - List<BigBlueButtonRoles> editionRoles = new ArrayList<>(); - if(userRoles.isAdministrator() || userRoles.isSystemAdmin()) { - editionRoles.add(BigBlueButtonRoles.administrator); - } - if(userRoles.isAuthor() || userRoles.isLearnResourceManager()) { - // global authors / LR-managers can use author templates also in groups - editionRoles.add(BigBlueButtonRoles.author); - } - if(businessGroupService.isIdentityInBusinessGroup(getIdentity(), group)) { - // all group user can choose the group templates (if they are allowed to create group online-meetings) - editionRoles.add(BigBlueButtonRoles.group); - } - - List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonManager.getTemplates(); - for(BigBlueButtonMeetingTemplate template:templates) { - if(!template.isEnabled()) continue; - List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum(); - for(BigBlueButtonRoles role:roles) { - for(BigBlueButtonRoles editionRole:editionRoles) { - if(role.accept(editionRole)) { - return true; - } - } - } - } - return false; - } - + List<BigBlueButtonRoles> editionRoles = bigBlueButtonManager + .calculatePermittedRoles(entry, group, getIdentity(), ureq.getUserSession().getRoles()); + bigBlueButtonManager.getTemplates(editionRoles); + List<BigBlueButtonMeetingTemplate> templates = bigBlueButtonManager.getTemplates(editionRoles); + return !templates.isEmpty(); + } @Override protected void doDispose() { diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java index 4522835379024f86fe3a6e49ac94f10864a7274a..8d2ffdb3e8c9f563887b9e61cd87e73c822cca51 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/EditBigBlueButtonMeetingController.java @@ -131,7 +131,8 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { ? null : meeting.getTemplate().getKey(); KeyValues templatesKeyValues = new KeyValues(); for(BigBlueButtonMeetingTemplate template:templates) { - if(accept(template) || template.getKey().equals(selectedTemplateKey)) { + if((template.isEnabled() && template.availableTo(editionRoles)) + || template.getKey().equals(selectedTemplateKey)) { templatesKeyValues.add(KeyValues.entry(template.getKey().toString(), template.getName())); } } @@ -196,20 +197,6 @@ public class EditBigBlueButtonMeetingController extends FormBasicController { uifactory.addFormSubmitButton("save", buttonLayout); } - private boolean accept(BigBlueButtonMeetingTemplate template) { - if(!template.isEnabled()) return false; - - List<BigBlueButtonRoles> roles = template.getPermittedRolesEnum(); - for(BigBlueButtonRoles role:roles) { - for(BigBlueButtonRoles editionRole:editionRoles) { - if(role.accept(editionRole)) { - return true; - } - } - } - return false; - } - private void updateUI() { boolean permanent = permanentEl.isAtLeastSelected(1); startDateEl.setVisible(!permanent); diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties index 32d118f1c3f788d2f57f40d1fc9b0bd499f2880f..7d64804bda756a734c486403f05e71665d5843ec 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties @@ -47,7 +47,7 @@ meeting.welcome=Welcome message meetings.admin.title=Meeting management meetings.past=Past online-meetings meetings.title=Online-meetings -meetings.upcoming=Current and upcoming onlin-meetings +meetings.upcoming=Current and upcoming online-meetings minutes={0} min. no.meeting.configured=There are no online-meetings available at this time. no.recordings=There is no recording available for this online-meeting at this time.