From 63dc708978ba2bcd43914946ada40e439a7a6d0b Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 5 Jul 2019 16:43:45 +0200
Subject: [PATCH] OO-3887: ensure the moderator is host if it joins the meeting

---
 .../course/nodes/AdobeConnectCourseNode.java     | 11 ++++++++++-
 .../adobeconnect/AdobeConnectConfigForm.java     | 16 +++++++++++++---
 .../adobeconnect/AdobeConnectManager.java        |  2 +-
 .../manager/AdobeConnectManagerImpl.java         | 14 +++++++++-----
 .../ui/AdobeConnectMeetingController.java        |  8 ++++----
 5 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
index 566508569c8..5ba6ceb79e0 100644
--- a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
@@ -46,6 +46,7 @@ import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.adobeconnect.AdobeConnectManager;
+import org.olat.modules.adobeconnect.AdobeConnectModule;
 import org.olat.modules.adobeconnect.ui.AdobeConnectMeetingDefaultConfiguration;
 import org.olat.modules.adobeconnect.ui.AdobeConnectRunController;
 import org.olat.repository.RepositoryEntry;
@@ -139,11 +140,19 @@ public class AdobeConnectCourseNode extends AbstractAccessableCourseNode {
 			boolean moderator = admin || userCourseEnv.isCoach();
 			// create run controller
 			RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
+			AdobeConnectModule adobeConnectModule = CoreSpringFactory.getImpl(AdobeConnectModule.class);
 			
 			ModuleConfiguration config = getModuleConfiguration();
 			boolean onlyDates = config.getBooleanSafe(AdobeConnectEditController.ACCESS_BY_DATES, false);
+			
 			boolean guestAccess = config.getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false);
-			boolean moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, false);
+			boolean moderatorStart;
+			if(adobeConnectModule.isCreateMeetingImmediately()) {
+				moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, false);
+			} else {
+				moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, true);
+			}
+			
 			AdobeConnectMeetingDefaultConfiguration configuration = new AdobeConnectMeetingDefaultConfiguration(onlyDates, guestAccess, moderatorStart);
 			controller = new AdobeConnectRunController(ureq, wControl, entry, getIdent(), null, configuration,
 					admin, moderator, userCourseEnv.isCourseReadOnly());
diff --git a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectConfigForm.java b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectConfigForm.java
index 106bd5d1eb6..1da39fd47e6 100644
--- a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectConfigForm.java
+++ b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectConfigForm.java
@@ -30,6 +30,8 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.editor.NodeEditController;
 import org.olat.modules.ModuleConfiguration;
+import org.olat.modules.adobeconnect.AdobeConnectModule;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date: 3  juil. 2019<br>
@@ -44,6 +46,9 @@ public class AdobeConnectConfigForm extends FormBasicController {
 	private MultipleSelectionElement accessEl;
 	
 	private final ModuleConfiguration config;
+	
+	@Autowired
+	private AdobeConnectModule adobeConnectModule;
 
 	public AdobeConnectConfigForm(UserRequest ureq, WindowControl wControl, ModuleConfiguration config) {
 		super(ureq, wControl);
@@ -57,10 +62,15 @@ public class AdobeConnectConfigForm extends FormBasicController {
 		String[] accessValues = new String[] { translate("vc.access.dates"), translate("vc.access.open"), translate("vc.access.start") };
 		boolean onlyDates = config.getBooleanSafe(AdobeConnectEditController.ACCESS_BY_DATES, false);
 		boolean guestAccess = config.getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false);
-		boolean moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, false);
+		boolean moderatorStart;
+		if(adobeConnectModule.isCreateMeetingImmediately()) {
+			moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, false);
+		} else {
+			moderatorStart = config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, true);
+		}
 		accessEl = uifactory.addCheckboxesVertical("vc.access.label", "vc.access.label", formLayout, accessKeys, accessValues, 1);
 		accessEl.select(accessKeys[0], onlyDates);
-		accessEl.select(accessKeys[1], guestAccess);
+		accessEl.select(accessKeys[1], !guestAccess);
 		accessEl.select(accessKeys[2], moderatorStart);
 
 		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
@@ -78,7 +88,7 @@ public class AdobeConnectConfigForm extends FormBasicController {
 	protected void formOK(UserRequest ureq) {
 		Collection<String> selectedKeys = accessEl.getSelectedKeys();
 		config.setBooleanEntry(AdobeConnectEditController.ACCESS_BY_DATES, selectedKeys.contains(accessKeys[0]));
-		config.setBooleanEntry(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, selectedKeys.contains(accessKeys[1]));
+		config.setBooleanEntry(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, !selectedKeys.contains(accessKeys[1]));
 		config.setBooleanEntry(AdobeConnectEditController.MODERATOR_START_MEETING, selectedKeys.contains(accessKeys[2]));
 		fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
 	}
diff --git a/src/main/java/org/olat/modules/adobeconnect/AdobeConnectManager.java b/src/main/java/org/olat/modules/adobeconnect/AdobeConnectManager.java
index 37f3fbf3803..e6f1546bd5e 100644
--- a/src/main/java/org/olat/modules/adobeconnect/AdobeConnectManager.java
+++ b/src/main/java/org/olat/modules/adobeconnect/AdobeConnectManager.java
@@ -133,7 +133,7 @@ public interface AdobeConnectManager {
 	 */
 	public String open(AdobeConnectMeeting meeting, Identity identity, AdobeConnectErrors error);
 	
-	public String join(AdobeConnectMeeting meeting, Identity identity, AdobeConnectErrors error);
+	public String join(AdobeConnectMeeting meeting, Identity identity, boolean moderator, AdobeConnectErrors error);
 	
 	public String linkTo(AdobeConnectSco content, Identity identity, AdobeConnectErrors error);
 	
diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java
index 04aa8af6e84..07c602f0f28 100644
--- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java
+++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectManagerImpl.java
@@ -380,14 +380,18 @@ public class AdobeConnectManagerImpl implements AdobeConnectManager, DeletableGr
 		if(actingUser != null) {
 			getAdapter().setMember(meeting.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), errors);
 		}
-		return join(meeting, identity, errors);
+		return join(meeting, identity, true, errors);
 	}
 
 	@Override
-	public String join(AdobeConnectMeeting meeting, Identity identity, AdobeConnectErrors error) {
-		String actingUser = getOrCreateUser(identity, false, error);
+	public String join(AdobeConnectMeeting meeting, Identity identity, boolean moderator, AdobeConnectErrors errors) {
+		String actingUser = getOrCreateUser(identity, false, errors);
 		if(actingUser != null) {
-			AdobeConnectSco sco = getAdapter().getScoMeeting(meeting, error);
+			if(moderator) {// make sure the moderator can open the meeting
+				getAdapter().setMember(meeting.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), errors);
+			}
+			
+			AdobeConnectSco sco = getAdapter().getScoMeeting(meeting, errors);
 			String urlPath = sco.getUrlPath();
 			UriBuilder builder = adobeConnectModule
 					.getAdobeConnectHostUriBuilder()
@@ -396,7 +400,7 @@ public class AdobeConnectManagerImpl implements AdobeConnectManager, DeletableGr
 			BreezeSession session = null;
 			Authentication authentication = securityManager.findAuthentication(identity, ACONNECT_PROVIDER);
 			if(authentication != null) {
-				session = getAdapter().commonInfo(authentication, error);
+				session = getAdapter().commonInfo(authentication, errors);
 			}
 
 			if(session != null && StringHelper.containsNonWhitespace(session.getSession())) {
diff --git a/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java b/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java
index 2bcc7a37702..2b7e52627aa 100644
--- a/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java
+++ b/src/main/java/org/olat/modules/adobeconnect/ui/AdobeConnectMeetingController.java
@@ -372,13 +372,13 @@ public class AdobeConnectMeetingController extends FormBasicController implement
 		
 		String meetingUrl = null;
 		AdobeConnectErrors errors = new AdobeConnectErrors();
-		if(meeting.isOpened() || !moderatorStartMeeting) {
-			meetingUrl = adobeConnectManager.join(meeting, getIdentity(), errors);
-		} else if(moderator || administrator) {
+		if(moderator || administrator) {
 			meetingUrl = adobeConnectManager.open(meeting, getIdentity(), errors);
 			AdobeConnectEvent openEvent = new AdobeConnectEvent(AdobeConnectEvent.OPEN_MEETING, meeting.getKey(), getIdentity().getKey());
 			CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(openEvent, meetingOres);
-		}
+		} else if(meeting.isOpened() || !moderatorStartMeeting) {
+			meetingUrl = adobeConnectManager.join(meeting, getIdentity(), (administrator || moderator), errors);
+		} 
 
 		if(errors.hasErrors()) {
 			getWindowControl().setError(AdobeConnectErrorHelper.formatErrors(getTranslator(), errors));
-- 
GitLab