From a4f3832328c152046b1b4e2746e4f6817898eb3a Mon Sep 17 00:00:00 2001 From: uhensler <urs.hensler@frentix.com> Date: Mon, 7 Jan 2019 12:39:06 +0100 Subject: [PATCH] OO-3797: Configuration of the user identifier --- .../modules/edusharing/EdusharingModule.java | 7 + .../edusharing/GetRenderedParameter.java | 10 +- .../manager/EdusharingHttpClient.java | 2 +- .../manager/EdusharingServiceImpl.java | 16 ++- .../manager/EdusharingSoapClient.java | 49 +------ .../manager/EdusharingUserFactory.java | 120 ++++++++++++++++++ .../resources/serviceconfig/olat.properties | 9 +- 7 files changed, 153 insertions(+), 60 deletions(-) create mode 100644 src/main/java/org/olat/modules/edusharing/manager/EdusharingUserFactory.java diff --git a/src/main/java/org/olat/modules/edusharing/EdusharingModule.java b/src/main/java/org/olat/modules/edusharing/EdusharingModule.java index 13795aa1d9f..06975047d8f 100644 --- a/src/main/java/org/olat/modules/edusharing/EdusharingModule.java +++ b/src/main/java/org/olat/modules/edusharing/EdusharingModule.java @@ -82,6 +82,9 @@ public class EdusharingModule extends AbstractSpringModule implements ConfigOnOf private String authAffiliationId; @Value("${edusharing.auth.affiliation.name}") private String authAffiliationName; + + @Value("${edusharing.user.identifier.key:username}") + private String userIdentifierKey; @Autowired private EdusharingSecurityService edusharingSignature; @@ -228,6 +231,10 @@ public class EdusharingModule extends AbstractSpringModule implements ConfigOnOf setStringProperty(EDUSHARING_REPO_PUBLIC_KEY, repoPublicKeyString, true); } + public String getUserIdentifierKey() { + return userIdentifierKey; + } + public String getAuthKeyUseriId() { return authKeyUseriId; } diff --git a/src/main/java/org/olat/modules/edusharing/GetRenderedParameter.java b/src/main/java/org/olat/modules/edusharing/GetRenderedParameter.java index d438606b0d3..4de68d90fb9 100644 --- a/src/main/java/org/olat/modules/edusharing/GetRenderedParameter.java +++ b/src/main/java/org/olat/modules/edusharing/GetRenderedParameter.java @@ -38,7 +38,7 @@ public class GetRenderedParameter { private final String signed; private final String signature; private final String timestamp; - private final String encryptedUsername; + private final String encryptedUserIdentifier; private final String displayMode; private String width; private String height; @@ -46,7 +46,7 @@ public class GetRenderedParameter { public GetRenderedParameter(String appId, String repoId, String nodeId, String resourceId, String courseId, String version, String locale, String language, String signed, String signature, String timestamp, - String encryptedUsername, String displayMode) { + String encryptedUserIdentifier, String displayMode) { this.appId = appId; this.repoId = repoId; this.nodeId = nodeId; @@ -58,7 +58,7 @@ public class GetRenderedParameter { this.signed = signed; this.signature = signature; this.timestamp = timestamp; - this.encryptedUsername = encryptedUsername; + this.encryptedUserIdentifier = encryptedUserIdentifier; this.displayMode = displayMode; } @@ -106,8 +106,8 @@ public class GetRenderedParameter { return timestamp; } - public String getEncryptedUsername() { - return encryptedUsername; + public String getEncryptedUserIdentifier() { + return encryptedUserIdentifier; } public String getDisplayMode() { diff --git a/src/main/java/org/olat/modules/edusharing/manager/EdusharingHttpClient.java b/src/main/java/org/olat/modules/edusharing/manager/EdusharingHttpClient.java index a1ded265558..400d063a78b 100644 --- a/src/main/java/org/olat/modules/edusharing/manager/EdusharingHttpClient.java +++ b/src/main/java/org/olat/modules/edusharing/manager/EdusharingHttpClient.java @@ -122,7 +122,7 @@ class EdusharingHttpClient { sb.append("&signed=").append(parameter.getSigned()); sb.append("&sig=").append(StringHelper.urlEncodeUTF8(parameter.getSignature())); sb.append("&ts=").append(parameter.getTimestamp()); - sb.append("&u=").append(StringHelper.urlEncodeUTF8(parameter.getEncryptedUsername())); + sb.append("&u=").append(StringHelper.urlEncodeUTF8(parameter.getEncryptedUserIdentifier())); sb.append("&display=").append(parameter.getDisplayMode()); // inline / dynamic / window if (StringHelper.containsNonWhitespace(parameter.getWidth())) { sb.append("&width=").append(parameter.getWidth()); diff --git a/src/main/java/org/olat/modules/edusharing/manager/EdusharingServiceImpl.java b/src/main/java/org/olat/modules/edusharing/manager/EdusharingServiceImpl.java index 29e82d45e97..199af65bd61 100644 --- a/src/main/java/org/olat/modules/edusharing/manager/EdusharingServiceImpl.java +++ b/src/main/java/org/olat/modules/edusharing/manager/EdusharingServiceImpl.java @@ -75,6 +75,8 @@ public class EdusharingServiceImpl implements EdusharingService { private EdusharingConversionService conversionService; @Autowired private EdusharingSecurityService securityService; + @Autowired + private EdusharingUserFactory userFactory; @Override public Properties getConfigForRegistration() { @@ -162,7 +164,8 @@ public class EdusharingServiceImpl implements EdusharingService { NodeIdentifier nodeIdentifier = conversionService.toNodeIdentifier(usage.getObjectUrl()); String courseId = conversionService.toEdusharingCourseId(usage.getOlatResourceable()); EdusharingSignature signature = securityService.createSignature(); - String encryptedUsername = securityService.encrypt(edusharingModule.getRepoPublicKey(), viewer.getName()); + String userIdentifier = userFactory.getUserIdentifier(viewer); + String encryptedUserIdentifier = securityService.encrypt(edusharingModule.getRepoPublicKey(), userIdentifier); GetRenderedParameter parameter = new GetRenderedParameter( signature.getAppId(), @@ -176,7 +179,7 @@ public class EdusharingServiceImpl implements EdusharingService { signature.getSigned(), signature.getSignature(), signature.getTimeStamp(), - encryptedUsername, + encryptedUserIdentifier, "inline"); parameter.setWidth(widthChecked); parameter.setHeight(heightChecked); @@ -193,7 +196,8 @@ public class EdusharingServiceImpl implements EdusharingService { NodeIdentifier nodeIdentifier = conversionService.toNodeIdentifier(usage.getObjectUrl()); String courseId = conversionService.toEdusharingCourseId(usage.getOlatResourceable()); EdusharingSignature signature = securityService.createSignature(); - String encryptedUsername = securityService.encrypt(edusharingModule.getRepoPublicKey(), viewer.getName()); + String userIdentifier = userFactory.getUserIdentifier(viewer); + String encryptedUserIdentifier = securityService.encrypt(edusharingModule.getRepoPublicKey(), userIdentifier); String encryptedTicket = securityService.encrypt(edusharingModule.getRepoPublicKey(), ticket.getTooken()); GetRenderedParameter parameter = new GetRenderedParameter( @@ -208,7 +212,7 @@ public class EdusharingServiceImpl implements EdusharingService { signature.getSigned(), signature.getSignature(), signature.getTimeStamp(), - encryptedUsername, + encryptedUserIdentifier, "window"); parameter.setEncryptedTicket(encryptedTicket); return client.getRenderUrl(parameter); @@ -221,7 +225,7 @@ public class EdusharingServiceImpl implements EdusharingService { CreateUsageParameter parameter = new CreateUsageParameter( element.getIdentifier(), element.getObjectUrl(), - identity.getName(), + userFactory.getUserIdentifier(identity), conversionService.toEdusharingCourseId(ores) ); client.createUsage(parameter); @@ -248,7 +252,7 @@ public class EdusharingServiceImpl implements EdusharingService { DeleteUsageParameter parameter = new DeleteUsageParameter( usage.getIdentifier(), usage.getObjectUrl(), - identity.getName(), + userFactory.getUserIdentifier(identity), conversionService.toEdusharingCourseId(usage.getOlatResourceable()) ); client.deleteUsage(parameter); diff --git a/src/main/java/org/olat/modules/edusharing/manager/EdusharingSoapClient.java b/src/main/java/org/olat/modules/edusharing/manager/EdusharingSoapClient.java index 28f62c6c273..f2aec14e6d1 100644 --- a/src/main/java/org/olat/modules/edusharing/manager/EdusharingSoapClient.java +++ b/src/main/java/org/olat/modules/edusharing/manager/EdusharingSoapClient.java @@ -37,7 +37,6 @@ import org.edu_sharing.webservices.usage2.Usage2; import org.edu_sharing.webservices.usage2.Usage2Exception_Exception; import org.edu_sharing.webservices.usage2.Usage2Service; import org.olat.core.id.Identity; -import org.olat.core.id.User; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.modules.edusharing.CreateUsageParameter; @@ -59,6 +58,8 @@ class EdusharingSoapClient { @Autowired private EdusharingModule edusharingModule; + @Autowired + private EdusharingUserFactory userFactory; String createTicket(Identity identity) throws AuthenticationException { return authenticate(identity).getTicket(); @@ -66,7 +67,7 @@ class EdusharingSoapClient { private AuthenticationResult authenticate(Identity identity) throws AuthenticationException { AuthByApp service = getAuthByAppService(); - List<KeyValue> ssoData = getSSOData(identity); + List<KeyValue> ssoData = userFactory.getSSOData(identity); AuthenticationResult result = service.authenticateByTrustedApp(edusharingModule.getAppId(), ssoData); if (log.isDebug()) { String logResult = new StringBuilder() @@ -82,50 +83,6 @@ class EdusharingSoapClient { return result; } - /** - * Key are configured in edu-sharing configuration: edu-sharing-sso-context.xml - * - * @return - */ - private List<KeyValue> getSSOData(Identity identity) { - List<KeyValue> ssoData = new ArrayList<>(); - - // mandatory - KeyValue userId = new KeyValue(); - userId.setKey(edusharingModule.getAuthKeyUseriId()); - userId.setValue(identity.getName()); - ssoData.add(userId); - - // optional - User user = identity.getUser(); - KeyValue lastname = new KeyValue(); - lastname.setKey(edusharingModule.getAuthKeyLastname()); - lastname.setValue(user.getLastName()); - ssoData.add(lastname); - - KeyValue firstname = new KeyValue(); - firstname.setKey(edusharingModule.getAuthKeyFirstname()); - firstname.setValue(user.getFirstName()); - ssoData.add(firstname); - - KeyValue email = new KeyValue(); - email.setKey(edusharingModule.getAuthKeyEmail()); - email.setValue(user.getEmail()); - ssoData.add(email); - - KeyValue affiliationId = new KeyValue(); - affiliationId.setKey("affiliation"); - affiliationId.setValue(edusharingModule.getAuthAffiliationId()); - ssoData.add(affiliationId); - - KeyValue affiliationName = new KeyValue(); - affiliationName.setKey("affiliationname"); - affiliationName.setValue(edusharingModule.getAuthAffiliationName()); - ssoData.add(affiliationName); - - return ssoData; - } - boolean valdateTicket(String ticket) throws AuthenticationException { AuthByApp service = getAuthByAppService(); return service.checkTicket(ticket); diff --git a/src/main/java/org/olat/modules/edusharing/manager/EdusharingUserFactory.java b/src/main/java/org/olat/modules/edusharing/manager/EdusharingUserFactory.java new file mode 100644 index 00000000000..70b315c0571 --- /dev/null +++ b/src/main/java/org/olat/modules/edusharing/manager/EdusharingUserFactory.java @@ -0,0 +1,120 @@ +/** + * <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.modules.edusharing.manager; + +import java.util.ArrayList; +import java.util.List; + +import org.edu_sharing.webservices.types.KeyValue; +import org.olat.core.id.Identity; +import org.olat.core.id.User; +import org.olat.core.util.StringHelper; +import org.olat.modules.edusharing.EdusharingModule; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * Initial date: 7 Jan 2019<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +@Component +class EdusharingUserFactory { + + @Autowired + private EdusharingModule edusharingModule; + + String getUserIdentifier(Identity identity) { + String identifier; + + switch (edusharingModule.getUserIdentifierKey()) { + case "username": + identifier = identity.getName(); + break; + case "email": + identifier = identity.getUser().getEmail(); + break; + default: + identifier = null; + } + + return StringHelper.blankIfNull(identifier); + } + + /** + * Key are configured in edu-sharing configuration: edu-sharing-sso-context.xml + * + * @return + */ + List<KeyValue> getSSOData(Identity identity) { + List<KeyValue> ssoData = new ArrayList<>(); + + // mandatory + KeyValue userId = new KeyValue(); + userId.setKey(edusharingModule.getAuthKeyUseriId()); + userId.setValue(getUserIdentifier(identity)); + ssoData.add(userId); + + // optional + User user = identity.getUser(); + + if (StringHelper.containsNonWhitespace(edusharingModule.getAuthKeyLastname()) + && StringHelper.containsNonWhitespace(user.getLastName())) { + KeyValue lastname = new KeyValue(); + lastname.setKey(edusharingModule.getAuthKeyLastname()); + lastname.setValue(user.getLastName()); + ssoData.add(lastname); + } + + if (StringHelper.containsNonWhitespace(edusharingModule.getAuthKeyFirstname()) + && StringHelper.containsNonWhitespace(user.getFirstName())) { + KeyValue firstname = new KeyValue(); + firstname.setKey(edusharingModule.getAuthKeyFirstname()); + firstname.setValue(user.getFirstName()); + ssoData.add(firstname); + } + + if (StringHelper.containsNonWhitespace(edusharingModule.getAuthKeyEmail()) + && StringHelper.containsNonWhitespace(user.getEmail())) { + KeyValue email = new KeyValue(); + email.setKey(edusharingModule.getAuthKeyEmail()); + email.setValue(user.getEmail()); + ssoData.add(email); + } + + if (StringHelper.containsNonWhitespace(edusharingModule.getAuthAffiliationId())) { + KeyValue affiliationId = new KeyValue(); + affiliationId.setKey("affiliation"); + affiliationId.setValue(edusharingModule.getAuthAffiliationId()); + ssoData.add(affiliationId); + } + + if (StringHelper.containsNonWhitespace(edusharingModule.getAuthAffiliationName())) { + KeyValue affiliationName = new KeyValue(); + affiliationName.setKey("affiliationname"); + affiliationName.setValue(edusharingModule.getAuthAffiliationName()); + ssoData.add(affiliationName); + } + + return ssoData; + } + +} diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 7f18d40fa96..3216a91e7a4 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1446,13 +1446,18 @@ edusharing.app.id= # IP address of the OpenOLAT instance edusharing.host= edusharing.ticket.valid.seconds=10 + +# User attribute to pass as userid to edu-sharing +edusharing.user.identifier.key=username +edusharing.user.identifier.key.values=username,email + # Names of user attributes are configurable in edu-sharing. Use the same names here. edusharing.auth.key.userid=userid edusharing.auth.key.lastname=lastname edusharing.auth.key.firstname=firstname edusharing.auth.key.email=email -edusharing.auth.affiliation.id=${instance.issuer.identifier} -edusharing.auth.affiliation.name=${instance.issuer.identifier} +edusharing.auth.affiliation.id=${instance.id} +edusharing.auth.affiliation.name=${instance.id} ######################################## # Options for monitoring -- GitLab