Skip to content
Snippets Groups Projects
Commit 01b4ceab authored by srosse's avatar srosse
Browse files

OO-3887: better error handling, fix admin. login procedure, wordinng

parent 77bdac6c
No related branches found
No related tags found
No related merge requests found
Showing
with 62 additions and 145 deletions
......@@ -125,8 +125,7 @@ public class AdobeConnectCourseNode extends AbstractAccessableCourseNode {
boolean moderator = admin || userCourseEnv.isCoach();
// create run controller
RepositoryEntry entry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
boolean allowGuestAccess = getModuleConfiguration().getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false);
AdobeConnectMeetingDefaultConfiguration configuration = new AdobeConnectMeetingDefaultConfiguration(allowGuestAccess);
AdobeConnectMeetingDefaultConfiguration configuration = new AdobeConnectMeetingDefaultConfiguration(true);
controller = new AdobeConnectRunController(ureq, wControl, entry, getIdent(), null, configuration,
admin, moderator, userCourseEnv.isCourseReadOnly());
}
......
......@@ -22,7 +22,6 @@ package org.olat.course.nodes.adobeconnect;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.tabbedpane.TabbedPane;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.ControllerEventListener;
import org.olat.core.gui.control.Event;
......@@ -52,9 +51,7 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr
private static final String[] paneKeys = { PANE_TAB_VCCONFIG, PANE_TAB_ACCESSIBILITY };
private TabbedPane tabPane;
private final VelocityContainer editVc;
private AdobeConnectEditFormController editForm;
private ConditionEditController accessibilityCondContr;
private final AdobeConnectCourseNode courseNode;
......@@ -63,7 +60,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr
ICourse course, UserCourseEnvironment userCourseEnv) {
super(ureq, wControl);
this.courseNode = courseNode;
editVc = createVelocityContainer("edit");
String providerId = courseNode.getModuleConfiguration().getStringValue("vc_provider_id");
if("wimba".equals(providerId)) {
......@@ -74,10 +70,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr
accessibilityCondContr = new ConditionEditController(ureq, wControl, userCourseEnv,
accessCondition, AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), courseNode));
listenTo(accessibilityCondContr);
editForm = new AdobeConnectEditFormController(ureq, getWindowControl(), courseNode);
listenTo(editForm);
editVc.put("configuration", editForm.getInitialComponent());
}
@Override
......@@ -108,10 +100,6 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr
courseNode.setPreConditionAccess(cond);
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
}
} else if (source == editForm) { // config form action
if (event == NodeEditController.NODECONFIG_CHANGED_EVENT) {
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
}
}
}
......@@ -120,7 +108,5 @@ public class AdobeConnectEditController extends ActivateableTabbableDefaultContr
tabPane = tabbedPane;
tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY),
accessibilityCondContr.getWrappedDefaultAccessConditionVC(translate("condition.accessibility.title")));
tabbedPane.addTab(translate(PANE_TAB_VCCONFIG), editVc);
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.adobeconnect;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.util.Util;
import org.olat.course.editor.NodeEditController;
import org.olat.course.nodes.AdobeConnectCourseNode;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.adobeconnect.ui.AdobeConnectRunController;
/**
*
* Initial date: 1 mars 2019<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AdobeConnectEditFormController extends FormBasicController {
private static final String[] onKeys = new String[] { "on" };
private MultipleSelectionElement guestAllowedEl;
//private MultipleSelectionElement guestAllowedStartEl;
private ModuleConfiguration config;
public AdobeConnectEditFormController(UserRequest ureq, WindowControl wControl,
AdobeConnectCourseNode courseNode) {
super(ureq, wControl, Util.createPackageTranslator(AdobeConnectRunController.class, ureq.getLocale()));
config = courseNode.getModuleConfiguration();
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
setFormTitle("pane.tab.vcconfig");
setFormContextHelp("Communication and Collaboration#_openmeeting");
String[] guestValues = new String[] { translate("vc.access.open") };
guestAllowedEl = uifactory.addCheckboxesHorizontal("guest.allowed", formLayout, onKeys, guestValues);
if(!config.getBooleanSafe(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, false)) {
guestAllowedEl.select(onKeys[0], true);
}
/*
String[] guestStartValues = new String[] { translate("vc.access.start") };
guestAllowedStartEl = uifactory.addCheckboxesHorizontal("moderator.start.meeting", formLayout, onKeys, guestStartValues);
if(config.getBooleanSafe(AdobeConnectEditController.MODERATOR_START_MEETING, true)) {
guestAllowedStartEl.select(onKeys[0], true);
}
*/
FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
formLayout.add(buttonsCont);
uifactory.addFormSubmitButton("save", buttonsCont);
}
@Override
protected void doDispose() {
//
}
@Override
protected void formOK(UserRequest ureq) {
config.setBooleanEntry(AdobeConnectEditController.GUEST_ACCESS_ALLOWED, !guestAllowedEl.isSelected(0));
//config.setBooleanEntry(AdobeConnectEditController.MODERATOR_START_MEETING, guestAllowedStartEl.isSelected(0));
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
}
}
......@@ -44,6 +44,8 @@ import org.olat.course.ICourse;
import org.olat.course.nodes.AdobeConnectCourseNode;
import org.olat.modules.adobeconnect.AdobeConnectMeeting;
import org.olat.modules.adobeconnect.AdobeConnectModule;
import org.olat.modules.adobeconnect.model.AdobeConnectError;
import org.olat.modules.adobeconnect.model.AdobeConnectErrorCodes;
import org.olat.modules.adobeconnect.model.AdobeConnectErrors;
import org.olat.modules.adobeconnect.model.AdobeConnectPermission;
import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal;
......@@ -259,7 +261,7 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
builder
.queryParam("action", "sco-delete")
.queryParam("sco-id", "adahgf" /* meeting.getScoId() */);
.queryParam("sco-id", meeting.getScoId());
boolean ok = false;
HttpGet get = createAdminMethod(builder, error);
......@@ -542,10 +544,12 @@ public abstract class AbstractAdobeConnectProvider implements AdobeConnectSPI {
CloseableHttpResponse response = httpClient.execute(getLogin)) {
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == 200) {
BreezeSession loginSession = AdobeConnectUtils.getBreezeSessionIfOk(response);
BreezeSession loginSession = AdobeConnectUtils.getBreezeSessionIfOk(response, session);
if(loginSession != null) {// OK
session = loginSession;
currentSession = loginSession;
} else {
errors.append(new AdobeConnectError(AdobeConnectErrorCodes.adminDenied));
}
}
EntityUtils.consumeQuietly(response.getEntity());
......
......@@ -136,35 +136,39 @@ public class AdobeConnectManagerImpl implements AdobeConnectManager, DeletableGr
public void createMeeting(String name, String description, String templateId,
Date start, Date end, Locale locale, boolean allAccess,
RepositoryEntry entry, String subIdent, BusinessGroup businessGroup,
Identity actingIdentity, AdobeConnectErrors error) {
Identity actingIdentity, AdobeConnectErrors errors) {
AdobeConnectSco folder;
String folderName = generateFolderName(entry, subIdent, businessGroup);
List<AdobeConnectSco> folderScos = getAdapter().getFolderByName(folderName, error);
List<AdobeConnectSco> folderScos = getAdapter().getFolderByName(folderName, errors);
if(folderScos == null || folderScos.isEmpty()) {
folder = getAdapter().createFolder(folderName, error);
folder = getAdapter().createFolder(folderName, errors);
} else {
folder = folderScos.get(0);
}
if(errors.hasErrors()) {
return;// we need a folder
}
AdobeConnectSco sco = getAdapter().createScoMeeting(name, description, folder.getScoId(), templateId, start, end, locale, error);
AdobeConnectSco sco = getAdapter().createScoMeeting(name, description, folder.getScoId(), templateId, start, end, locale, errors);
if(sco != null) {
getAdapter().setPermissions(sco.getScoId(), true, error);
AdobeConnectPrincipal admin = getAdapter().adminCommonInfo(error);
getAdapter().setPermissions(sco.getScoId(), true, errors);
AdobeConnectPrincipal admin = getAdapter().adminCommonInfo(errors);
if(admin != null) {
getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), error);
getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), errors);
}
String actingUser = getOrCreateUser(actingIdentity, true, error);
String actingUser = getOrCreateUser(actingIdentity, true, errors);
if(actingUser != null) {
getAdapter().setMember(sco.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), error);
getAdapter().setMember(sco.getScoId(), actingUser, AdobeConnectMeetingPermission.host.permission(), errors);
}
// try harder if the meeting hasn't a single host
if(actingUser == null && admin == null) {
admin = getAdapter().getPrincipalByLogin(adobeConnectModule.getAdminLogin(), error);
admin = getAdapter().getPrincipalByLogin(adobeConnectModule.getAdminLogin(), errors);
if(admin != null) {
getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), error);
getAdapter().setMember(sco.getScoId(), admin.getPrincipalId(), AdobeConnectMeetingPermission.host.permission(), errors);
}
}
......
......@@ -22,6 +22,7 @@ package org.olat.modules.adobeconnect.manager;
import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
......@@ -67,18 +68,23 @@ public class AdobeConnectUtils {
}
}
protected static BreezeSession getBreezeSessionIfOk(HttpResponse response) {
protected static BreezeSession getBreezeSessionIfOk(HttpResponse response, BreezeSession infoSession) {
BreezeSession session = null;
try {
HttpEntity entity = response.getEntity();
Document doc = getDocumentFromEntity(entity);
if(AdobeConnectUtils.isStatusOk(doc)) {
if(isStatusOk(doc)) {
print(doc);
Header header = response.getFirstHeader("Set-Cookie");
if(header != null) {
session = BreezeSession.valueOf(header);
} else {
String cookie = getFirstElementValue(doc.getDocumentElement(), "cookie");
session = BreezeSession.valueOf(cookie);
if(StringHelper.containsNonWhitespace(cookie)) {
session = BreezeSession.valueOf(cookie);
} else {
session = infoSession;
}
}
}
} catch (Exception e) {
......@@ -122,6 +128,7 @@ public class AdobeConnectUtils {
protected static Document getDocumentFromEntity(HttpEntity entity) throws Exception {
try(InputStream in=entity.getContent()) {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
return dBuilder.parse(in);
} catch(Exception e) {
......@@ -204,9 +211,11 @@ public class AdobeConnectUtils {
}
protected static void print(Document document) {
if(log.isDebugEnabled() || true) {
if(log.isDebugEnabled()) {
try(StringWriter writer = new StringWriter()) {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Transformer transformer = factory.newTransformer();
Source source = new DOMSource(document);
transformer.transform(source, new StreamResult(writer));
writer.flush();
......
......@@ -27,6 +27,7 @@ package org.olat.modules.adobeconnect.model;
*/
public enum AdobeConnectErrorCodes {
adminDenied,
duplicateField,
invalidField,
formatError,
......
......@@ -38,9 +38,9 @@ public class AdobeConnectErrors implements Serializable {
return errors;
}
public void append(AdobeConnectErrors errors) {
if(errors.hasErrors()) {
this.errors.addAll(errors.getErrors());
public void append(AdobeConnectErrors error) {
if(error.hasErrors()) {
this.errors.addAll(error.getErrors());
}
}
......
......@@ -99,9 +99,12 @@ public class AdobeConnectMeetingController extends FormBasicController {
initForm(ureq);
if(validMeeting) {
AdobeConnectErrors error = new AdobeConnectErrors();
registered = adobeConnectManager.isRegistered(meeting, getIdentity(), getPermission(), error);
AdobeConnectErrors errors = new AdobeConnectErrors();
registered = adobeConnectManager.isRegistered(meeting, getIdentity(), getPermission(), errors);
loadModel();
if(errors.hasErrors()) {
getWindowControl().setWarning(AdobeConnectErrorHelper.formatErrors(getTranslator(), errors));
}
}
updateButtons();
}
......
#Tue Apr 23 14:44:31 CEST 2019
add.meeting=Add meeting
add.meeting=Meeting hinzuf\u00FCgen
admin.menu.title=Adobe Connect
admin.menu.title.alt=Adobe Connect
adobeconnect.account.configuration=Konfiguration
......@@ -18,6 +18,7 @@ content.name=Name
content.open=\u00D6ffnen
content.resource=Ressource
content.type=Typ
error.adminDenied=Adobe Connect Zugang verboten
error.duplicateField=Der Wert "{0}" ist schon in Einsatz.
error.customerDoesntExist=Benutzer existiert nicht.
error.formatError=Der Format von "{0}" ist nicht g\u00FCltig.
......@@ -25,13 +26,14 @@ error.illegalOperation=Operation verboten
error.invalidField=Der Wert "{0}" ist nicht g\u00FCltig.
error.invalid.meeting=Das Meeting wurde f\u00FCr eine andere Konfiguration erstellt und kann nicht ge\u00F6ffnet werden.
error.missingParameter=Fehlende Informationen
error.noAccessDenied=Zugang verbotten
error.noAccessDenied=Zugang verboten
error.noSuchItem=Existiert nicht
error.prefix=Ein Fehler ist aufgetreten\:
error.rangeError=Bereich ist nicht g\u00FCltig.
error.rangeError=Datumsbereich ist nicht g\u00FCltig.
error.start.after.end=Das Datum f\u00FCr das Ende des Meetings darf nicht vor dem Beginn Datum sein.
error.unkown=Unerwartete Fehler
meeting.description=Beschreibung
meeting.deleted=Meeting wurde gel\u00F6scht.
meeting.end=Enddatum
meeting.ended=Meeting ist schon beendet.
meeting.join.button=Meeting beitreten
......@@ -40,8 +42,8 @@ meeting.permanent=Typ
meeting.permanent.on=Dauernd
meeting.register.button=Anmelden
meeting.resource=Resource
meeting.share.documents=Dokumenten verteilen
meeting.share.documents.of=Dokumenten von "{0}" verteilen
meeting.share.documents=Dateien bereitstellen
meeting.share.documents.of=Dateien von "{0}" bereitstellen
meeting.start=Beginndatum
meeting.start.button=Meeting starten
meeting.successfully.registered=Erfolgreich angemeldet.
......@@ -49,13 +51,13 @@ meeting.templates=Vorlage
meetings.admin.title=Konfiguration
meetings.content=Inhalt
meetings.past=Alte Meetings
meetings.title=Schulungen
meetings.title=Meetingr\u00E4ume
meetings.upcoming=Zuk\u00FCnftige Meetings
no.contents=Dieser Meeting enth\u00E4lt kein Inhalt
no.meeting.configured=Es gibt kein Meeting geplant.
no.shared.contents=Dieser Meeting verteilt kein Inhalt.
no.meeting.configured=Es sind noch keine Meetings konfiguriert.
no.shared.contents=Keine Meeting Dateien verf\u00FCgbar.
no.template=Keine Vorlage
no.upcoming.meetings=Sie haben kein zuk\u00FCnftige Meeting.
no.upcoming.meetings=Sie haben keine zuk\u00FCnftigen Meetings.
option.adminlogin=Benutzername
option.adminpassword=Passwort
option.baseurl=URL Adobe Connect Server
......
......@@ -32,6 +32,7 @@ error.prefix=An error happened\:
error.rangeError=The range is not valid.
error.start.after.end=The end date of the meeting must not be before the start date.
error.unkown=Unkown error
meeting.deleted=Meeting successfully deleted.
meeting.description=Description
meeting.end=End date
meeting.ended=Meeting already ended.
......@@ -41,8 +42,8 @@ meeting.permanent=Typ
meeting.permanent.on=Dauernd
meeting.register.button=Register
meeting.resource=Resource
meeting.share.documents=Share documents
meeting.share.documents.of=Share documents of "{0}"
meeting.share.documents=Share files
meeting.share.documents.of=Share files of "{0}"
meeting.start=Start date
meeting.start.button=Start the meeting
meeting.successfully.registered=Successfully registered.
......@@ -50,11 +51,11 @@ meeting.templates=Template
meetings.admin.title=Configuration
meetings.content=Content
meetings.past=Old meetings
meetings.title=Trainings
meetings.title=Meeting rooms
meetings.upcoming=Upcoming meetings
no.contents=This meeting doesn't have any content
no.meeting.configured=There isn't any planned meeting.
no.shared.contents=This meeting doesn't have any shared content yet.
no.meeting.configured=No meetings have been configured yet.
no.shared.contents=No future meetings scheduled.
no.template=No template
no.upcoming.meetings=You don't have any upcoming meeting.
option.adminlogin=Username
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment