From 32e48e0c78d25dd017373eb33f245e9d666bdadc Mon Sep 17 00:00:00 2001
From: uhensler <none@none>
Date: Wed, 9 Aug 2017 11:59:34 +0200
Subject: [PATCH] OO-2947: simplify the handling of Shibboleth attributes

---
 .../olat/shibboleth/ShibbolethDispatcher.java |  56 ++------
 .../olat/shibboleth/ShibbolethException.java  |  13 +-
 .../ShibbolethRegistrationController.java     |  26 ++--
 .../_i18n/LocalStrings_ar.properties          |   1 -
 .../_i18n/LocalStrings_bg.properties          |  21 ++-
 .../_i18n/LocalStrings_de.properties          |   1 -
 .../_i18n/LocalStrings_el.properties          |   1 -
 .../_i18n/LocalStrings_en.properties          |   1 -
 .../_i18n/LocalStrings_fr.properties          | 133 +++++++++---------
 .../_i18n/LocalStrings_it.properties          |   5 +-
 .../_i18n/LocalStrings_nl_NL.properties       |   1 -
 .../_i18n/LocalStrings_pl.properties          |   1 -
 .../_i18n/LocalStrings_pt_BR.properties       |   1 -
 .../_i18n/LocalStrings_zh_CN.properties       |   1 -
 .../_i18n/i18nBundleMetadata.properties       |   1 -
 .../manager/ShibbolethAttributes.java         |  33 +++--
 .../manager/ShibbolethAttributesTest.java     |  70 ++++++---
 17 files changed, 181 insertions(+), 185 deletions(-)

diff --git a/src/main/java/org/olat/shibboleth/ShibbolethDispatcher.java b/src/main/java/org/olat/shibboleth/ShibbolethDispatcher.java
index b0b321506c1..2297062cf8c 100644
--- a/src/main/java/org/olat/shibboleth/ShibbolethDispatcher.java
+++ b/src/main/java/org/olat/shibboleth/ShibbolethDispatcher.java
@@ -52,7 +52,6 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.media.RedirectMediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
-import org.olat.core.id.UserConstants;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.logging.OLATSecurityException;
@@ -157,12 +156,14 @@ public class ShibbolethDispatcher implements Dispatcher{
 		uri = uri.substring(uriPrefix.length()); // guaranteed to exist by DispatcherAction
 
 		Map<String, String> attributesMap = getShibbolethAttributesFromRequest(req);
-		String uniqueID = getUniqueIdentifierFromRequest(req, resp, attributesMap);
+		ShibbolethAttributes shibbolethAttriutes = CoreSpringFactory.getImpl(ShibbolethAttributes.class);
+		shibbolethAttriutes.init(attributesMap);
+		String uniqueID = getUniqueIdentifierFromRequest(req, resp, shibbolethAttriutes);
 		if(uniqueID == null) {
 			return;
 		}
 
-		if(!authorization(req, resp, attributesMap)) {
+		if(!authorization(req, resp, shibbolethAttriutes)) {
 			return;
 		}
 
@@ -186,7 +187,7 @@ public class ShibbolethDispatcher implements Dispatcher{
 
 		Authentication auth = securityManager.findAuthenticationByAuthusername(uniqueID, PROVIDER_SHIB);
 		if (auth == null) { // no matching authentication...
-			ShibbolethRegistrationController.putShibAttributes(req, attributesMap);
+			ShibbolethRegistrationController.putShibAttributes(req, shibbolethAttriutes);
 			ShibbolethRegistrationController.putShibUniqueID(req, uniqueID);
 			redirectToShibbolethRegistration(resp);
 			return;
@@ -208,11 +209,9 @@ public class ShibbolethDispatcher implements Dispatcher{
 		// Successful login
 		Identity authenticationedIdentity = ureq.getIdentity();
 		userDeletionManager.setIdentityAsActiv(authenticationedIdentity);
-		ShibbolethAttributes shibbolethAttriutes = CoreSpringFactory.getImpl(ShibbolethAttributes.class);
-		shibbolethAttriutes.setAttributesMap(attributesMap);
 		shibbolethManager.syncUser(authenticationedIdentity, shibbolethAttriutes);
 		ureq.getUserSession().getIdentityEnvironment().addAttributes(
-				shibbolethModule.getAttributeTranslator().translateAttributesMap(attributesMap));
+				shibbolethModule.getAttributeTranslator().translateAttributesMap(shibbolethAttriutes.toMap()));
 
 		if(mobile) {
 			String token = restSecurityBean.generateToken(ureq.getIdentity(), ureq.getHttpReq().getSession(true));
@@ -233,17 +232,13 @@ public class ShibbolethDispatcher implements Dispatcher{
 		}
 	}
 
-	private String getUniqueIdentifierFromRequest(HttpServletRequest req, HttpServletResponse resp, Map<String, String> attributesMap) {
+	private String getUniqueIdentifierFromRequest(HttpServletRequest req, HttpServletResponse resp, ShibbolethAttributes shibbolethAttributes) {
 
-		String uniqueID = attributesMap.get(shibbolethModule.getDefaultUIDAttribute());
+		String uniqueID = shibbolethAttributes.getValueForAttributeName(shibbolethModule.getDefaultUIDAttribute());
 		if (uniqueID == null) {
 			handleException(new ShibbolethException(ShibbolethException.UNIQUE_ID_NOT_FOUND,"Unable to get unique identifier for subject. Make sure you are listed in the metadata.xml file and your resources your are trying to access are available and your are allowed to see them. (Resourceregistry). "),
 					req, resp, translator);
 			return null;
-		} else if (!checkAttributes(attributesMap)) {
-			handleException(new ShibbolethException(ShibbolethException.INSUFFICIENT_ATTRIBUTES,"Insufficient shibboleth attributes!"),
-					req, resp, translator);
-			return null;
 		}
 		return uniqueID;
 	}
@@ -271,30 +266,6 @@ public class ShibbolethDispatcher implements Dispatcher{
 		return attributesMap;
 	}
 
-	/**
-	 * Check if all required attributes are here.
-	 * @param attributesMap
-	 * @return true if all required attributes are present, false otherwise.
-	 */
-	private boolean checkAttributes(Map<String, String>  attributesMap) {
-		if(attributesMap.keySet().size()==1) {
-			return false;
-		}
-		try {
-			String lastname = attributesMap.get(shibbolethModule.getShibbolethAttributeName(UserConstants.LASTNAME));
-			String firstname = attributesMap.get(shibbolethModule.getShibbolethAttributeName(UserConstants.FIRSTNAME));
-			String email = attributesMap.get(shibbolethModule.getShibbolethAttributeName(UserConstants.EMAIL));
-			if (StringHelper.containsNonWhitespace(lastname)
-					&& StringHelper.containsNonWhitespace(firstname)
-					&& StringHelper.containsNonWhitespace(email)) {
-				return true;
-			}
-		} catch (IllegalArgumentException e) {
-			log.error("Error when reading Shib attributes. Either home org not allowed to connect to this OO instance or user has missing attributes.");
-		}
-		return false;
-	}
-
 	private final void redirectToShibbolethRegistration(HttpServletResponse response) {
 		try {
 			response.sendRedirect(WebappHelper.getServletContextPath() + DispatcherModule.getPathDefault() + ShibbolethModule.PATH_REGISTER_SHIBBOLETH + "/");
@@ -303,14 +274,14 @@ public class ShibbolethDispatcher implements Dispatcher{
 		}
 	}
 
-	private boolean authorization(HttpServletRequest req, HttpServletResponse resp, Map<String,String> attributesMap) {
+	private boolean authorization(HttpServletRequest req, HttpServletResponse resp, ShibbolethAttributes shibbolethAttibutes) {
 		boolean authorized = false;
 		if(shibbolethModule.isAccessControlByAttributes()) {
 			if(StringHelper.containsNonWhitespace(shibbolethModule.getAttribute1()) && StringHelper.containsNonWhitespace(shibbolethModule.getAttribute1Values())) {
-				authorized |= authorization(shibbolethModule.getAttribute1(), shibbolethModule.getAttribute1Values(), attributesMap);
+				authorized |= authorization(shibbolethModule.getAttribute1(), shibbolethModule.getAttribute1Values(), shibbolethAttibutes);
 			}
 			if(StringHelper.containsNonWhitespace(shibbolethModule.getAttribute2()) && StringHelper.containsNonWhitespace(shibbolethModule.getAttribute2Values())) {
-				authorized |= authorization(shibbolethModule.getAttribute2(), shibbolethModule.getAttribute2Values(), attributesMap);
+				authorized |= authorization(shibbolethModule.getAttribute2(), shibbolethModule.getAttribute2Values(), shibbolethAttibutes);
 			}
 		} else {
 			authorized = true;
@@ -325,8 +296,8 @@ public class ShibbolethDispatcher implements Dispatcher{
 		return authorized;
 	}
 
-	private boolean authorization(String attribute, String allowedValues, Map<String,String> attributesMap) {
-		String val = attributesMap.get(attribute);
+	private boolean authorization(String attributeName, String allowedValues, ShibbolethAttributes shibbolethAttributes) {
+		String val = shibbolethAttributes.getValueForAttributeName(attributeName);
 		if(StringHelper.containsNonWhitespace(val)) {
 			val = val.trim();
 			for(StringTokenizer tokenizer = new StringTokenizer(allowedValues, "\n\r,;", false); tokenizer.hasMoreTokens(); ) {
@@ -363,7 +334,6 @@ public class ShibbolethDispatcher implements Dispatcher{
 			switch (errorCode) {
 				case ShibbolethException.GENERAL_SAML_ERROR: userMsg = translator.translate("error.shibboleth.generic"); break;
 				case ShibbolethException.UNIQUE_ID_NOT_FOUND: userMsg = translator.translate("error.unqueid.notfound"); break;
-				case ShibbolethException.INSUFFICIENT_ATTRIBUTES: userMsg = translator.translate("error.insufficieant.attributes"); break;
 				default: userMsg = translator.translate("error.shibboleth.generic"); break;
 			}
 			showMessage(ureq,"org.opensaml.SAMLException: " + e.getMessage(), e, userMsg, ((ShibbolethException)e).getContactPersonEmail());
diff --git a/src/main/java/org/olat/shibboleth/ShibbolethException.java b/src/main/java/org/olat/shibboleth/ShibbolethException.java
index 8f65951b474..3a1afa418b1 100644
--- a/src/main/java/org/olat/shibboleth/ShibbolethException.java
+++ b/src/main/java/org/olat/shibboleth/ShibbolethException.java
@@ -27,7 +27,7 @@ package org.olat.shibboleth;
 /**
  * Description:<br>
  * TODO: Lavinia Dumitrescu Class Description for ShibbolethException
- * 
+ *
  * <P>
  * Initial Date:  31.10.2007 <br>
  * @author Lavinia Dumitrescu
@@ -36,23 +36,22 @@ public class ShibbolethException extends Exception {
 
 	private static final long serialVersionUID = 9055605164344300611L;
 	//error codes
-	public static final int GENERAL_SAML_ERROR = 0;	
+	public static final int GENERAL_SAML_ERROR = 0;
 	public static final int UNIQUE_ID_NOT_FOUND = 1;
-	public static final int INSUFFICIENT_ATTRIBUTES = 2;
-	
+
 	private int errorCode;
 	private String contactPersonEmail;
-	
+
 	public ShibbolethException(int errorCode, String msg) {
 		super(msg);
 		this.errorCode = errorCode;
 	}
-	
+
 	public ShibbolethException(int errorCode, Throwable throwable) {
 		super(throwable.getMessage());
 		this.errorCode = errorCode;
 	}
-	
+
 	public ShibbolethException(int errorCode, String contactPersonEmail, Throwable throwable) {
 		this(errorCode, throwable);
 		this.contactPersonEmail = contactPersonEmail;
diff --git a/src/main/java/org/olat/shibboleth/ShibbolethRegistrationController.java b/src/main/java/org/olat/shibboleth/ShibbolethRegistrationController.java
index d18450030f9..a713782c159 100644
--- a/src/main/java/org/olat/shibboleth/ShibbolethRegistrationController.java
+++ b/src/main/java/org/olat/shibboleth/ShibbolethRegistrationController.java
@@ -26,7 +26,6 @@
 package org.olat.shibboleth;
 
 import java.util.Locale;
-import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -78,9 +77,9 @@ import org.springframework.beans.factory.annotation.Autowired;
  * - Basic flow:
  * System asks User for username and create olataccount with ShibbolethAuthentication
  * Branches:
- * 1. no email in shibbolethAttributesMap
+ * 1. no email in shibbolethAttributes
  * 		- System asks for emailaddress (no institutionalEmail is set !!!)
- * 2. no email in shibbolethAttributesMap and User already exists in System
+ * 2. no email in shibbolethAttributes and User already exists in System
  * 		- System asks for password (no institutionalEmail is set !!!)
  *
  */
@@ -99,7 +98,7 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 	private LanguageChooserController languageChooserController;
 
 	private Translator translator;
-	private Map<String,String> shibbolethAttributesMap;
+	private ShibbolethAttributes shibbolethAttributes;
 	private String shibbolethUniqueID;
 
 	private int state = STATE_UNDEFINED;
@@ -127,7 +126,7 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 		super(wControl);
 
 		translator = Util.createPackageTranslator(ShibbolethModule.class, ureq.getLocale());
-		shibbolethAttributesMap = (Map<String,String>)ureq.getUserSession().getEntry(KEY_SHIBATTRIBUTES);
+		shibbolethAttributes = (ShibbolethAttributes)ureq.getUserSession().getEntry(KEY_SHIBATTRIBUTES);
 		shibbolethUniqueID = (String)ureq.getUserSession().getEntry(KEY_SHIBUNIQUEID);
 
 		if (shibbolethUniqueID == null) {
@@ -137,14 +136,11 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 			return;
 		}
 
-		if (shibbolethAttributesMap == null)
-			throw new AssertException("ShibbolethRegistrationController was unable to fetch ShibbolethAttribuitesMap from session.");
-
 		hasEmailInShibAttr = (shibbolethModule.getShibbolethAttributeName(UserConstants.EMAIL) == null) ? false : true;
 
 		locale = (Locale)ureq.getUserSession().getEntry(LocaleNegotiator.NEGOTIATED_LOCALE);
 		if(locale == null) {
-			String preferedLanguage = shibbolethAttributesMap.get(shibbolethModule.getPreferredLanguageAttribute());
+			String preferedLanguage = shibbolethAttributes.getValueForAttributeName(shibbolethModule.getPreferredLanguageAttribute());
 			if(preferedLanguage == null) {
 				locale = LocaleNegotiator.getPreferedLocale(ureq);
 			} else {
@@ -168,7 +164,7 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 
 		if(registrationModule.getUsernamePresetBean() != null) {
 			UserNameCreationInterceptor interceptor = registrationModule.getUsernamePresetBean();
-			proposedUsername = interceptor.getUsernameFor(shibbolethAttributesMap);
+			proposedUsername = interceptor.getUsernameFor(shibbolethAttributes.toMap());
 			if(proposedUsername == null) {
 				if(interceptor.allowChangeOfUsername()) {
 					setRegistrationForm(ureq, wControl, proposedUsername);
@@ -228,7 +224,7 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 	 * @param req
 	 * @param attributes
 	 */
-	public static final void putShibAttributes(HttpServletRequest req, Map<String,String> attributes) {
+	public static final void putShibAttributes(HttpServletRequest req, ShibbolethAttributes attributes) {
 		CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(req).putEntry(KEY_SHIBATTRIBUTES, attributes);
 	}
 
@@ -328,10 +324,8 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 					}
 
 					if(!hasEmailInShibAttr){
-						shibbolethAttributesMap.put(shibbolethModule.getShibbolethAttributeName(UserConstants.EMAIL), regWithEmailForm.getEmail());
+						shibbolethAttributes.setValueForUserPropertyName(UserConstants.EMAIL, regWithEmailForm.getEmail());
 					}
-					ShibbolethAttributes shibbolethAttributes = CoreSpringFactory.getImpl(ShibbolethAttributes.class);
-					shibbolethAttributes.setAttributesMap(shibbolethAttributesMap);
 					String email = shibbolethAttributes.getValueForUserPropertyName(UserConstants.EMAIL);
 
 					User user = null;
@@ -363,8 +357,6 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 					secMgr.createAndPersistAuthentication(authenticationedIdentity, ShibbolethDispatcher.PROVIDER_SHIB, shibbolethUniqueID, null, null);
 
 					// update user profile
-					ShibbolethAttributes shibbolethAttributes = CoreSpringFactory.getImpl(ShibbolethAttributes.class);
-					shibbolethAttributes.setAttributesMap(shibbolethAttributesMap);
 					shibbolethManager.syncUser(authenticationedIdentity, shibbolethAttributes);
 
 					doLogin(authenticationedIdentity, ureq);
@@ -390,7 +382,7 @@ public class ShibbolethRegistrationController extends DefaultController implemen
 		}
 		// successfull login
 		ureq.getUserSession().getIdentityEnvironment().addAttributes(
-				shibbolethModule.getAttributeTranslator().translateAttributesMap(shibbolethAttributesMap));
+				shibbolethModule.getAttributeTranslator().translateAttributesMap(shibbolethAttributes.toMap()));
 	}
 
 	/**
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties
index 6576fea6eda..8f36a2361a9 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties
@@ -19,7 +19,6 @@ eduPersonAffiliation.student=\u0627\u0644\u0637\u0627\u0644\u0628
 eduPersonEntitlement=\u0627\u0644\u0645\u0635\u0627\u062F\u0642\u0629
 eduPersonOrgUnitDN=DN \u0648\u062D\u062F\u0629 \u0627\u0644\u0645\u0646\u0638\u0645\u0629
 employeeNumber=\u0631\u0642\u0645 \u0627\u0644\u0645\u0648\u0638\u0641
-error.insufficieant.attributes=\u0636\u0631\u0648\u0631\u064A\u0629 Shibboleth \u0635\u0641\u0627\u062A\: Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=\u064A\u0631\u062C\u0649 \u0627\u0644\u062F\u062E\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u060CShibboleth \u062E\u0637\u0623 \u0641\u0649
 error.shibboleth.head=\u0623\u0648\u0644\u0627\u062A - \u0627\u0644\u062A\u0639\u0644\u064A\u0645 \u0648\u0627\u0644\u062A\u062F\u0631\u064A\u0628 \u0639\u0628\u0631 \u0627\u0644\u0627\u0646\u062A\u0631\u0646\u062A - \u062E\u0637\u0623
 error.unqueid.notfound=\u0647\u0644 \u0644\u062F\u064A\u0643 \u0628\u064A\u0627\u0646\u0627\u062A \u062F\u062E\u0648\u0644 \u0625\u0644\u0649 \u0623\u0648\u0644\u0627\u062A\u061F \u0625\u0630\u0627 \u0643\u0627\u0646\u062A \u0627\u0644\u0627\u062C\u0627\u0628\u0629 \u0646\u0639\u0645 \u0641\u0625\u0646\u0647 \u064A\u0631\u062C\u0649 \u0645\u062D\u0627\u0648\u0644\u0629 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties
index 071ec0e196b..21d7ec4d5af 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties
@@ -19,7 +19,6 @@ eduPersonAffiliation.student=\u0421\u0442\u0443\u0434\u0435\u043D\u0442
 eduPersonEntitlement=\u0423\u043F\u044A\u043B\u043D\u043E\u043C\u043E\u0449\u0430\u0432\u0430\u043D\u0435
 eduPersonOrgUnitDN=\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u043E\u043D\u043D\u0430 \u0435\u0434\u0438\u043D\u0438\u0446\u0430 DN
 employeeNumber=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0435\u043D \u043D\u043E\u043C\u0435\u0440 \u043D\u0430 \u0441\u043B\u0443\u0436\u0438\u0442\u0435\u043B
-error.insufficieant.attributes=\u0417\u0430\u0434\u044A\u043B\u0436\u0438\u0442\u0435\u043B\u043D\u0438 Shibboleth \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438\: Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=\u041F\u043E\u043B\u0443\u0447\u0438 \u0441\u0435 Shibboleth \u0433\u0440\u0435\u0448\u043A\u0430. \u041C\u043E\u043B\u044F, \u0432\u043B\u0435\u0437\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430 \u043E\u0442\u043D\u043E\u0432\u043E\!
 error.shibboleth.head=\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430 \u043E\u043D\u043B\u0430\u0439\u043D \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 - \u0413\u0440\u0435\u0448\u043A\u0430
 error.unqueid.notfound=\u041D\u0430\u0438\u0441\u0442\u0438\u043D\u0430 \u043B\u0438 \u0438\u043C\u0430\u0442\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0432\u043B\u0438\u0437\u0430\u0442\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430? \u0410\u043A\u043E \u0435 \u0442\u0430\u043A\u0430, \u043C\u043E\u043B\u044F, \u043E\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043E\u0442\u043D\u043E\u0432\u043E.
@@ -40,7 +39,7 @@ sr.error.disclaimer=\u0422\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u043F\u04
 sr.error.emailexists=\u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B \u0441 \u0442\u043E\u0437\u0438 \u0438-\u043C\u0435\u0439\u043B \u0430\u0434\u0440\u0435\u0441 \u0432\u0435\u0447\u0435 \u0441\u044A\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430. \u041C\u043E\u043B\u044F, \u0441\u0432\u044A\u0440\u0436\u0435\u0442\u0435 \u0441\u0435 \u0441 {0}.
 sr.error.loginexists=\u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E\u0442\u043E \u0438\u043C\u0435 \u0432\u0435\u0447\u0435 \u0441\u044A\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430. <br>\u0410\u043A\u043E \u0441\u0442\u0435 \u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043B\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430 \u0441 \u0442\u043E\u0432\u0430 \u043F\u043E\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 \u043F\u0440\u0435\u0434\u0438, \u043C\u043E\u043B\u044F, \u0441\u0432\u044A\u0440\u0436\u0435\u0442\u0435 \u0441\u0435 \u0441 {0}.
 sr.header=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044F
-sr.intro=\u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430. <b>\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435\:</b> \u0422\u043E\u0432\u0430 \u0438\u043C\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u044F \u043D\u0430 \u043F\u043E-\u043A\u044A\u0441\u0435\u043D \u0435\u0442\u0430\u043F\! 
+sr.intro=\u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430. <b>\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435\:</b> \u0422\u043E\u0432\u0430 \u0438\u043C\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u044F \u043D\u0430 \u043F\u043E-\u043A\u044A\u0441\u0435\u043D \u0435\u0442\u0430\u043F\!
 sr.login.meantimetaken=\u0422\u043E\u0432\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 \u0435 \u0432\u0435\u0447\u0435 \u0437\u0430\u0435\u0442\u043E. \u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u043E.
 srf.email=\u0418-\u043C\u0435\u0439\u043B \u0430\u0434\u0440\u0435\u0441
 srf.error.blacklist=\u0418\u0437\u0431\u0440\u0430\u043D\u043E\u0442\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 \u043D\u0435 \u0435 \u043F\u0440\u0438\u0435\u0442\u043E.
@@ -170,7 +169,7 @@ swissEduPersonStudyBranch2.140199=UAS\:\u0417\u0434\u0440\u0430\u0432\u043D\u043
 swissEduPersonStudyBranch2.140201=UAS\:\u0424\u0438\u0437\u0438\u043E\u0442\u0435\u0440\u0430\u043F\u0438\u044F
 swissEduPersonStudyBranch2.140202=UAS\:\u0415\u0440\u0433\u043E\u0442\u0435\u0440\u0430\u043F\u0438\u044F
 swissEduPersonStudyBranch2.140203=UAS\:\u041F\u0441\u0438\u0445\u043E\u043C\u043E\u0442\u043E\u0440\u043D\u0430 \u0442\u0435\u0440\u0430\u043F\u0438\u044F
-swissEduPersonStudyBranch2.140204=UAS\:\u0414\u0438\u0435\u0442\u043E\u043B\u043E\u0433\u0438\u044F 
+swissEduPersonStudyBranch2.140204=UAS\:\u0414\u0438\u0435\u0442\u043E\u043B\u043E\u0433\u0438\u044F
 swissEduPersonStudyBranch2.140299=UAS\:\u0422\u0435\u0440\u0430\u043F\u0438\u044F \u0438 \u0440\u0435\u0445\u0430\u0431\u0438\u043B\u0438\u0442\u0430\u0446\u0438\u044F (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch2.140301=UAS\:\u041C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0430 \u0440\u0430\u0434\u0438\u043E\u043B\u043E\u0433\u0438\u044F
 swissEduPersonStudyBranch2.140399=UAS\:\u0414\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u0447\u043D\u0430/\u0442\u0435\u0440\u0430\u043F\u0435\u0432\u0442\u0438\u0447\u043D\u0430 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F (\u043E\u0431\u0449\u043E)
@@ -179,7 +178,7 @@ swissEduPersonStudyBranch2.15=U\:\u0425\u0443\u043C\u0430\u043D\u0438\u0442\u043
 swissEduPersonStudyBranch2.150101=UAS\:\u0414\u0435\u0442\u0441\u043A\u0430 \u0433\u0440\u0430\u0434\u0438\u043D\u0430 \u0438 \u043D\u0430\u0447\u0430\u043B\u043D\u043E \u0443\u0447\u0438\u043B\u0438\u0449\u0435 (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch2.150201=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F I (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch2.150301=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u0434\u0438\u043F\u043B\u043E\u043C\u0430)
-swissEduPersonStudyBranch2.150302=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435) 
+swissEduPersonStudyBranch2.150302=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435)
 swissEduPersonStudyBranch2.150401=UAS\:\u041B\u043E\u0433\u043E\u043F\u0435\u0434\u0438\u044F
 swissEduPersonStudyBranch2.150402=UAS\:Psychomotricity
 swissEduPersonStudyBranch2.150499=UAS\:\u0422\u0435\u0440\u0430\u043F\u0435\u0432\u0442\u0438\u0447\u043D\u0430 \u043F\u0435\u0434\u0430\u0433\u043E\u0433\u0438\u043A\u0430 (\u043E\u0431\u0449\u043E)
@@ -196,12 +195,12 @@ swissEduPersonStudyBranch2.20209=UAS\:\u0418\u043D\u0434\u0443\u0441\u0442\u0440
 swissEduPersonStudyBranch2.20210=UAS\:\u041C\u0435\u0434\u0438\u0439\u043D\u043E \u0438\u043D\u0436\u0435\u043D\u0435\u0440\u0441\u0442\u0432\u043E
 swissEduPersonStudyBranch2.20211=UAS\:\u0418\u043D\u0436\u0435\u043D\u0435\u0440\u0441\u0442\u0432\u043E \u043F\u043E \u043F\u043E\u0434\u0434\u0440\u044A\u0436\u043A\u0430 \u043D\u0430 \u0441\u0433\u0440\u0430\u0434\u0438
 swissEduPersonStudyBranch2.20212=UAS\:\u0418\u043D\u0436\u0435\u043D\u0435\u0440\u0435\u043D \u0434\u0438\u0437\u0430\u0439\u043D
-swissEduPersonStudyBranch2.20213=UAS\:\u0410\u0432\u0438\u0430\u0442\u0438\u043A\u0430 
+swissEduPersonStudyBranch2.20213=UAS\:\u0410\u0432\u0438\u0430\u0442\u0438\u043A\u0430
 swissEduPersonStudyBranch2.20214=UAS\:\u041E\u043F\u0442\u043E\u043C\u0435\u0442\u0440\u0438\u044F
 swissEduPersonStudyBranch2.20999=UAS\:\u0422\u0435\u0445\u043D\u0438\u043A\u0430
 swissEduPersonStudyBranch2.30301=UAS\:\u0411\u0438\u043E\u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F
 swissEduPersonStudyBranch2.30302=UAS\:\u0425\u0440\u0430\u043D\u0438\u0442\u0435\u043B\u043D\u0430 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F
-swissEduPersonStudyBranch2.30303=UAS\:Life technologies 
+swissEduPersonStudyBranch2.30303=UAS\:Life technologies
 swissEduPersonStudyBranch2.30304=UAS\:\u0425\u0438\u043C\u0438\u044F
 swissEduPersonStudyBranch2.30305=UAS\:\u0415\u043D\u043E\u043B\u043E\u0433\u0438\u044F
 swissEduPersonStudyBranch2.30308=UAS\:\u0418\u043D\u0436\u0435\u043D\u0435\u0440\u0441\u0442\u0432\u043E \u043D\u0430 \u043F\u0440\u0438\u0440\u043E\u0434\u043D\u0430\u0442\u0430 \u0441\u0440\u0435\u0434\u0430
@@ -231,7 +230,7 @@ swissEduPersonStudyBranch2.53=U\:\u0412\u0435\u0442\u0438\u0440\u0438\u043D\u043
 swissEduPersonStudyBranch2.54=U\:\u0424\u0430\u0440\u043C\u0430\u0446\u0438\u044F
 swissEduPersonStudyBranch2.55=U\:\u041C\u0435\u0434\u0438\u0446\u0438\u043D\u0430, \u0444\u0430\u0440\u043C\u0430\u0446\u0438\u044F \u0438 \u0434\u0440\u0443\u0433\u0438
 swissEduPersonStudyBranch2.60601=U\:\u0412\u0438\u0437\u0443\u0430\u043B\u043D\u0430 \u043A\u043E\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u044F
-swissEduPersonStudyBranch2.60602=UAS\:HyperWerk 
+swissEduPersonStudyBranch2.60602=UAS\:HyperWerk
 swissEduPersonStudyBranch2.60603=UAS\:\u041F\u0440\u043E\u0434\u0443\u043A\u0442\u043E\u0432 \u0438 \u0438\u043D\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043B\u0435\u043D \u0434\u0438\u0437\u0430\u0439\u043D
 swissEduPersonStudyBranch2.60604=UAS\:\u0418\u043D\u0442\u0435\u0440\u0438\u043E\u0440\u0435\u043D \u0434\u0438\u0437\u0430\u0439\u043D
 swissEduPersonStudyBranch2.60605=UAS\:\u0417\u0430\u043F\u0430\u0437\u0432\u0430\u043D\u0435 \u0438 \u0432\u044A\u0437\u0441\u0442\u0430\u043D\u043E\u0432\u044F\u0432\u0430\u043D\u0435
@@ -357,10 +356,10 @@ swissEduPersonStudyBranch3.3689=UAS\:\u0414\u0438\u0430\u0433\u043D\u043E\u0441\
 swissEduPersonStudyBranch3.3699=UAS\:\u0417\u0434\u0440\u0430\u0432\u0435\u043E\u043F\u0430\u0437\u0432\u0430\u043D\u0435 (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch3.3701=UAS\:\u0414\u0435\u0442\u0441\u043A\u0430 \u0433\u0440\u0430\u0434\u0438\u043D\u0430 \u0438 \u043D\u0430\u0447\u0430\u043B\u043D\u043E \u0443\u0447\u0438\u043B\u0438\u0449\u0435 (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch3.3710=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F I (\u043E\u0431\u0449\u043E)
-swissEduPersonStudyBranch3.3720=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u0434\u0438\u043F\u043B\u043E\u043C\u0430) 
-swissEduPersonStudyBranch3.3725=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435) 
+swissEduPersonStudyBranch3.3720=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u0434\u0438\u043F\u043B\u043E\u043C\u0430)
+swissEduPersonStudyBranch3.3725=UAS\:\u0413\u0438\u043C\u043D\u0430\u0437\u0438\u044F II (\u043E\u0431\u0449\u043E)(\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435)
 swissEduPersonStudyBranch3.3730=UAS\:\u041B\u043E\u0433\u043E\u043F\u0435\u0434\u0438\u044F
-swissEduPersonStudyBranch3.3731=UAS\:Psychomotricity 
+swissEduPersonStudyBranch3.3731=UAS\:Psychomotricity
 swissEduPersonStudyBranch3.3739=UAS\:\u0422\u0435\u0440\u0430\u043F\u0435\u0432\u0442\u0438\u0447\u043D\u0430 \u043F\u0435\u0434\u0430\u0433\u043E\u0433\u0438\u043A\u0430 (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch3.3799=UAS\:\u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u0430 \u0443\u0447\u0438\u0442\u0435\u043B\u0438 (\u043E\u0431\u0449\u043E)
 swissEduPersonStudyBranch3.3801=UAS\:\u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430
@@ -466,7 +465,7 @@ swissEduPersonStudyLevel.31=\u0414\u043E\u043A\u0442\u043E\u0440\u0430\u0442
 swissEduPersonStudyLevel.32=\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0430\u0432\u0430\u0449\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435
 swissEduPersonStudyLevel.33=\u0420\u0430\u0437\u0448\u0438\u0440\u0435\u043D\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435
 swissEduPersonStudyLevel.34=\u041C\u043E\u0434\u0443\u043B\u043D\u043E \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043D\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435
-swissEduPersonStudyLevel.35=\u041F\u0440\u043E\u0444\u0435\u0441\u0438\u043E\u043D\u0430\u043B\u043D\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 
+swissEduPersonStudyLevel.35=\u041F\u0440\u043E\u0444\u0435\u0441\u0438\u043E\u043D\u0430\u043B\u043D\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435
 swissEduPersonStudyLevel.39=\u0418\u043D\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043B\u043D\u043E \u043F\u0440\u043E\u0434\u044A\u043B\u0436\u0430\u0432\u0430\u0449\u043E \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435
 swissEduPersonUniqueID=\u041B\u0438\u0447\u0435\u043D \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0435\u043D \u043D\u043E\u043C\u0435\u0440 \u043D\u0430 SwissEdu
 wayf.homesite=\u0423\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties
index dad681695e4..47a19cff420 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties
@@ -31,7 +31,6 @@ eduPersonAffiliation.student=Student
 eduPersonEntitlement=Berechtigung
 eduPersonOrgUnitDN=Organisationsheinheit DN
 employeeNumber=Mitarbeiternummer
-error.insufficieant.attributes=Es sind nicht f\u00FC alle erforderlichen Shibboleth Attribute Werte vorhanden..
 error.shibboleth.not.authorized=Sie d\u00FCrfen nicht auf OpenOLAT einloggen.
 error.shibboleth.generic=Shibboleth Fehler. Melden Sie sich nochmals an\!
 error.shibboleth.head=OLAT - Online Learning And Training - Error
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties
index 566e9d7d749..f5efbb43255 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties
@@ -15,7 +15,6 @@ eduPersonAffiliation.student=\u03A6\u03BF\u03B9\u03C4\u03B7\u03C4\u03AE\u03C2
 eduPersonEntitlement=\u0395\u03BE\u03BF\u03C5\u03C3\u03B9\u03BF\u03B4\u03CC\u03C4\u03B7\u03C3\u03B7
 eduPersonOrgUnitDN=\u039C\u03BF\u03BD\u03AC\u03B4\u03B1 \u03BF\u03C1\u03B3\u03AC\u03BD\u03C9\u03C3\u03B7\u03C2 DN
 employeeNumber=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C4\u03B1\u03C5\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C5\u03C0\u03B1\u03BB\u03BB\u03AE\u03BB\u03BF\u03C5
-error.insufficieant.attributes=\u03A5\u03C0\u03BF\u03C7\u03C1\u03B5\u03C9\u03C4\u03B9\u03BA\u03AC \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC Shibboleth\:Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=\u03A0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03C3\u03C4\u03B7\u03BA\u03B5 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C3\u03C4\u03BF Shibboleth. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03B1\u03C7\u03B8\u03B5\u03AF\u03C4\u03B5 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1\!
 error.shibboleth.head=OLAT - Online Learning And Training - \u03A3\u03C6\u03AC\u03BB\u03BC\u03B1
 error.unqueid.notfound=\u0388\u03C7\u03B5\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03AC \u03C4\u03B7 \u03B4\u03B9\u03BA\u03B1\u03B9\u03BF\u03B4\u03BF\u03C3\u03AF\u03B1 \u03BD\u03B1 \u03AD\u03C7\u03B5\u03C4\u03B5 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03BF OLAT; \u0391\u03BD \u03BD\u03B1\u03B9, \u03C0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03B1\u03C7\u03B8\u03B5\u03AF\u03C4\u03B5 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1.
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties
index 424077a4a7e..6b2da53cfd7 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties
@@ -31,7 +31,6 @@ eduPersonAffiliation.student=Student
 eduPersonEntitlement=Authorization
 eduPersonOrgUnitDN=Organization unit DN
 employeeNumber=Employee identification number
-error.insufficieant.attributes=Some values for mandatory Shibboleth attributes are missing.
 error.shibboleth.not.authorized=You are not authorized to log in OpenOLAT.
 error.shibboleth.generic=A Shibboleth error occurred. Please log in again\!
 error.shibboleth.head=OLAT - Online Learning And Training - Error
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties
index 5e0cb75ccb1..75c0b0b6a5e 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties
@@ -21,7 +21,6 @@ eduPersonAffiliation.student=Etudiant
 eduPersonEntitlement=Autorisation
 eduPersonOrgUnitDN=Unit\u00E9 d'organisation DN
 employeeNumber=Num\u00E9ro personnel
-error.insufficieant.attributes=Attributs Shibboleth n\u00E9cessaires\:Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=Erreur Shibboleth. Reconnectez-vous, s.v.p.\!
 error.shibboleth.head=OLAT - Online Learning And Training - Error
 error.shibboleth.not.authorized=Vous n'\u00EAtes pas autoris\u00E9 \u00E0 vous connecter \u00E0 OpenOLAT.
@@ -34,7 +33,7 @@ organizationalUnit=Unit\u00E9 d'organisation
 postalAddress=Adresse
 sm.error.no_username=Aucun nom d'utilisateur n'a \u00E9t\u00E9 cr\u00E9\u00E9
 sm.error.username_in_use=Le nom d'utilisateur existe d\u00E9j\u00E0
-sm.header=Enregistrement 
+sm.header=Enregistrement
 sm.intro=Le nom d'utilisateur s\u00E9lectionn\u00E9 existe d\u00E9j\u00E0 dans OLAT. Si vous \u00EAtes sur que vous vous \u00EAtes donn\u00E9 ce nom d'utilisateur lors d'une inscription OLAT pr\u00E9c\u00E9dente, veuillez indiquer le mot de passe correspondant. Si l'identification est r\u00E9ussie, le nom d'utilisation est enregistr\u00E9 automatiquement.<br><br>Si vous n'avez pas cr\u00E9\u00E9 ce nom d'utilisateur, cliquez sur "abandonner" et choisissez un nouveau nom d'utilisation, s.v.p..
 smf.error.blocked=Le nom d'utilisateur a \u00E9t\u00E9 bloqu\u00E9 pour des raisons de s\u00E9curit\u00E9. Vous pouvez r\u00E9essayer plus tard.
 smf.error.password=Le mot de passe n'est pas valide.
@@ -116,8 +115,8 @@ swissEduPersonStaffCategory.303=Technical Personnel
 swissEduPersonStaffCategory.304=Technical Personnel\: Apprentices and Interns
 swissEduPersonStaffCategory.305=Janitors, Building Managers
 swissEduPersonStaffCategory.306=Social and Wellness Personnel
-swissEduPersonStaffCategory.307=Library Personnel 
-swissEduPersonStaffCategory.308=Safety Personnel Radiation, Firefighters, Guards 
+swissEduPersonStaffCategory.307=Library Personnel
+swissEduPersonStaffCategory.308=Safety Personnel Radiation, Firefighters, Guards
 swissEduPersonStudyBranch1=Branche d'\u00E9tude
 swissEduPersonStudyBranch1.1=U\: sciences humaines et sociales
 swissEduPersonStudyBranch1.10000=HEP\:architecture, ing\u00E9nierie, planification
@@ -131,9 +130,9 @@ swissEduPersonStudyBranch1.20000=HEP\:technologie et informatique
 swissEduPersonStudyBranch1.3=U\:droit
 swissEduPersonStudyBranch1.30000=HEP\:chimie et sciences de la vie
 swissEduPersonStudyBranch1.4=HEP\:sciences naturelles et exactes
-swissEduPersonStudyBranch1.40000=HEP\:agriculture e sylviculture 
-swissEduPersonStudyBranch1.5=U\: m\u00E9decine et pharmacie 
-swissEduPersonStudyBranch1.50000=HEP\:\u00E9conomie et services 
+swissEduPersonStudyBranch1.40000=HEP\:agriculture e sylviculture
+swissEduPersonStudyBranch1.5=U\: m\u00E9decine et pharmacie
+swissEduPersonStudyBranch1.50000=HEP\:\u00E9conomie et services
 swissEduPersonStudyBranch1.6=U\:sciences techniques
 swissEduPersonStudyBranch1.60000=HEP\:design
 swissEduPersonStudyBranch1.7=U\:interdisciplinaire et autres
@@ -148,14 +147,14 @@ swissEduPersonStudyBranch2.100201=HEP\:\u00E9ducation physique, de diction, de c
 swissEduPersonStudyBranch2.100301=HEP\:sc\u00E9nographie
 swissEduPersonStudyBranch2.100401=HEP\:formation sp\u00E9ciale en th\u00E9\u00E2tre
 swissEduPersonStudyBranch2.100999=HEP\:th\u00E9\u00E2tre g\u00E9n\u00E9ral
-swissEduPersonStudyBranch2.10101=HEP\:architecture 
+swissEduPersonStudyBranch2.10101=HEP\:architecture
 swissEduPersonStudyBranch2.10102=HEP\:ing\u00E9nierie civile
 swissEduPersonStudyBranch2.10103=HEP\:gestion des proc\u00E9d\u00E9s de construction
 swissEduPersonStudyBranch2.10104=HEP\:planification de l'espace
 swissEduPersonStudyBranch2.10105=HEP\:architecture du paysage
 swissEduPersonStudyBranch2.10106=HEP\:g\u00E9omatique
 swissEduPersonStudyBranch2.10107=HEP\: technologie du bois
-swissEduPersonStudyBranch2.10999=HEP\:formation continue en architecture, construction et planification 
+swissEduPersonStudyBranch2.10999=HEP\:formation continue en architecture, construction et planification
 swissEduPersonStudyBranch2.11=U\:th\u00E9ologie
 swissEduPersonStudyBranch2.110199=HEP\:traduction
 swissEduPersonStudyBranch2.110299=HEP\:interpr\u00E8tes
@@ -166,7 +165,7 @@ swissEduPersonStudyBranch2.120299=HEP\:p\u00E9dagogique sociale
 swissEduPersonStudyBranch2.120399=HEP\:animation socioculturelle
 swissEduPersonStudyBranch2.120999=HEP\:travail social g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.13=U\:sciences historiques et culturelles
-swissEduPersonStudyBranch2.130101=HEP\:diagnostic et conseil psychologique 
+swissEduPersonStudyBranch2.130101=HEP\:diagnostic et conseil psychologique
 swissEduPersonStudyBranch2.130102=HEP\:conseil professionnel
 swissEduPersonStudyBranch2.130103=HEP\:psychologie du travail et de l'organisation
 swissEduPersonStudyBranch2.130999=HEP\:psychologie appliqu\u00E9 g\u00E9n\u00E9rale
@@ -174,11 +173,11 @@ swissEduPersonStudyBranch2.14=HEP\:sciences sociales
 swissEduPersonStudyBranch2.140101=HEP\:soins
 swissEduPersonStudyBranch2.140102=HEP\:sage-femme
 swissEduPersonStudyBranch2.140199=HEP\:soin et \u00E9ducation \u00E0 la sant\u00E9 en g\u00E9n\u00E9ral
-swissEduPersonStudyBranch2.140201=HEP\:physioth\u00E9rapie 
+swissEduPersonStudyBranch2.140201=HEP\:physioth\u00E9rapie
 swissEduPersonStudyBranch2.140202=HEP\:ergoth\u00E9rapie
-swissEduPersonStudyBranch2.140203=HEP\:th\u00E9rapie psychomotrice 
-swissEduPersonStudyBranch2.140204=HEP\:conseil \u00E0 la nutrition 
-swissEduPersonStudyBranch2.140299=HEP\:th\u00E9rapie et r\u00E9habilitation en g\u00E9n\u00E9ral 
+swissEduPersonStudyBranch2.140203=HEP\:th\u00E9rapie psychomotrice
+swissEduPersonStudyBranch2.140204=HEP\:conseil \u00E0 la nutrition
+swissEduPersonStudyBranch2.140299=HEP\:th\u00E9rapie et r\u00E9habilitation en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.140301=HEP\:radiologie m\u00E9dicale
 swissEduPersonStudyBranch2.140399=HEP\:technique diagnostique/th\u00E9rapeutique en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.140999=HEP\:sant\u00E9 en g\u00E9n\u00E9ral
@@ -188,33 +187,33 @@ swissEduPersonStudyBranch2.150201=HEP\:secondaire I en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.150301=HEP\:secondaire II en g\u00E9n\u00E9ral (\u00E9cole de maturit\u00E9)
 swissEduPersonStudyBranch2.150302=HEP\:secondaire II g\u00E9n\u00E9ral (formation professionnelle)
 swissEduPersonStudyBranch2.150401=HEP\:logop\u00E9die
-swissEduPersonStudyBranch2.150402=HEP\:psychomotricit\u00E9 
+swissEduPersonStudyBranch2.150402=HEP\:psychomotricit\u00E9
 swissEduPersonStudyBranch2.150499=HEP\:p\u00E9dagogie th\u00E9rapeutique en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.150999=HEP\:formation du corps enseignant en g\u00E9n\u00E9ral
-swissEduPersonStudyBranch2.20201=HEP\:\u00E9lectrotechnique 
+swissEduPersonStudyBranch2.20201=HEP\:\u00E9lectrotechnique
 swissEduPersonStudyBranch2.20202=HEP\:informatique
 swissEduPersonStudyBranch2.20203=HEP\:t\u00E9l\u00E9communication
 swissEduPersonStudyBranch2.20204=HEP\:microtechnique
-swissEduPersonStudyBranch2.20205=HEP\:ing\u00E9nierie du syst\u00E8me 
+swissEduPersonStudyBranch2.20205=HEP\:ing\u00E9nierie du syst\u00E8me
 swissEduPersonStudyBranch2.20206=HEP\:ing\u00E9nierie m\u00E9canique
-swissEduPersonStudyBranch2.20207=HEP\:gestion de projet en m\u00E9chatronique 
+swissEduPersonStudyBranch2.20207=HEP\:gestion de projet en m\u00E9chatronique
 swissEduPersonStudyBranch2.20208=HEP\:technique de l'automobile
 swissEduPersonStudyBranch2.20209=HEP\:ing\u00E9nierie \u00E9conomique
 swissEduPersonStudyBranch2.20210=HEP\:ing\u00E9nierie des m\u00E9dias
 swissEduPersonStudyBranch2.20211=HEP\:techniques du b\u00E2timent
 swissEduPersonStudyBranch2.20212=HEP\:ing\u00E9nierie du design
 swissEduPersonStudyBranch2.20213=HEP\: aviatique
-swissEduPersonStudyBranch2.20214=HEP\:optom\u00E9trie 
+swissEduPersonStudyBranch2.20214=HEP\:optom\u00E9trie
 swissEduPersonStudyBranch2.20999=HEP\:technique
 swissEduPersonStudyBranch2.30301=HEP\:biotechnologie
 swissEduPersonStudyBranch2.30302=HEP\:technologie alimentaire
-swissEduPersonStudyBranch2.30303=HEP\:Life Technologies 
+swissEduPersonStudyBranch2.30303=HEP\:Life Technologies
 swissEduPersonStudyBranch2.30304=HEP\:chimie
-swissEduPersonStudyBranch2.30305=HEP\:oenologie 
+swissEduPersonStudyBranch2.30305=HEP\:oenologie
 swissEduPersonStudyBranch2.30308=HEP\:ing\u00E9nierie de l'environnement
 swissEduPersonStudyBranch2.30309=HEP\:sciences de la vie mol\u00E9culaire
 swissEduPersonStudyBranch2.30310=HEP\:Life Science Technologies
-swissEduPersonStudyBranch2.30999=HEP\:Formation continue dans le domaine chimie et life sciences 
+swissEduPersonStudyBranch2.30999=HEP\:Formation continue dans le domaine chimie et life sciences
 swissEduPersonStudyBranch2.40401=HEP\:agriculture
 swissEduPersonStudyBranch2.40402=HEP\:sylviculture
 swissEduPersonStudyBranch2.40999=HEP\:formation continue dans le domaine agriculture et sylviculture
@@ -223,9 +222,9 @@ swissEduPersonStudyBranch2.42=U\:sciences naturelles
 swissEduPersonStudyBranch2.43=U\: sciences naturelles et exactes, autres sciences
 swissEduPersonStudyBranch2.50501=HEP\:\u00E9conomie de gestion
 swissEduPersonStudyBranch2.50502=HEP\:\u00E9tudes europ\u00E9ennes pour l'\u00E9conomie de gestion
-swissEduPersonStudyBranch2.50503=HEP\:International Business Management 
+swissEduPersonStudyBranch2.50503=HEP\:International Business Management
 swissEduPersonStudyBranch2.50504=HEP\:informatique \u00E9conomique
-swissEduPersonStudyBranch2.50505=FH\:Facility Management 
+swissEduPersonStudyBranch2.50505=FH\:Facility Management
 swissEduPersonStudyBranch2.50506=HEP\:h\u00F4tellerie
 swissEduPersonStudyBranch2.50507=HEP\:tourisme
 swissEduPersonStudyBranch2.50508=HEP\:information et documentation
@@ -245,20 +244,20 @@ swissEduPersonStudyBranch2.60605=HEP\:conservation-restauration
 swissEduPersonStudyBranch2.60606=HEP\:film
 swissEduPersonStudyBranch2.60607=HEP\:r\u00E9alisation de films
 swissEduPersonStudyBranch2.60999=HEP\:formation continue dans le domaine du design
-swissEduPersonStudyBranch2.61=U\:construction et g\u00E9od\u00E9sie 
+swissEduPersonStudyBranch2.61=U\:construction et g\u00E9od\u00E9sie
 swissEduPersonStudyBranch2.62=U\:ing\u00E9nierie m\u00E9canique et \u00E9lectrique
-swissEduPersonStudyBranch2.63=U\:agriculture et sylviculture 
-swissEduPersonStudyBranch2.64=U\:sciences techniques interdisciplinaires/autres 
+swissEduPersonStudyBranch2.63=U\:agriculture et sylviculture
+swissEduPersonStudyBranch2.64=U\:sciences techniques interdisciplinaires/autres
 swissEduPersonStudyBranch2.70701=HEP\:sport
 swissEduPersonStudyBranch2.80199=HEP\:art plastique en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.80201=HEP\:arts plastiques
 swissEduPersonStudyBranch2.80202=HEP\:enseignant manuel
-swissEduPersonStudyBranch2.80203=HEP\:\u00E9ducation esth\u00E9tique 
+swissEduPersonStudyBranch2.80203=HEP\:\u00E9ducation esth\u00E9tique
 swissEduPersonStudyBranch2.80299=HEP\:formation du corps enseignant pour arts en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch2.80301=HEP\:\u00E9criture litt\u00E9raire
-swissEduPersonStudyBranch2.81=U\:administration centrale 
+swissEduPersonStudyBranch2.81=U\:administration centrale
 swissEduPersonStudyBranch2.82=U\:biblioth\u00E8ques centrales
-swissEduPersonStudyBranch2.83=U\:services techniques et logistique 
+swissEduPersonStudyBranch2.83=U\:services techniques et logistique
 swissEduPersonStudyBranch2.84=U\:services pour collaborateurs et \u00E9tudiants
 swissEduPersonStudyBranch2.90101=HEP\:p\u00E9dagogique musicale (instrumentale et vocale)
 swissEduPersonStudyBranch2.90201=HEP\:interpr\u00E9tation/performance
@@ -274,9 +273,9 @@ swissEduPersonStudyBranch3.1100=U\:sciences humaines et sociales, autres
 swissEduPersonStudyBranch3.1190=U\:formation du corps enseignant, secondaire I (phil.I)
 swissEduPersonStudyBranch3.1201=U\:th\u00E9ologie interdisciplinaire/autres
 swissEduPersonStudyBranch3.1205=U\:th\u00E9ologie protestante
-swissEduPersonStudyBranch3.1210=U\:th\u00E9ologie catholique-romaine 
+swissEduPersonStudyBranch3.1210=U\:th\u00E9ologie catholique-romaine
 swissEduPersonStudyBranch3.1215=U\:th\u00E9ologie catholique-chr\u00E9tienne
-swissEduPersonStudyBranch3.1300=U\:philosophie 
+swissEduPersonStudyBranch3.1300=U\:philosophie
 swissEduPersonStudyBranch3.1401=U\:langue et litt\u00E9raire interdisciplinaires / autres
 swissEduPersonStudyBranch3.1405=U\:linguistique
 swissEduPersonStudyBranch3.1410=U\:allemand
@@ -293,16 +292,16 @@ swissEduPersonStudyBranch3.1449=U\:lettres classiques europ\u00E9ennes
 swissEduPersonStudyBranch3.1450=U\:lettres classiques
 swissEduPersonStudyBranch3.1454=U\:autre langues non europ\u00E9ennes
 swissEduPersonStudyBranch3.1455=U\:langues asiatiques
-swissEduPersonStudyBranch3.1460=U\:langues du Proche-Orient 
+swissEduPersonStudyBranch3.1460=U\:langues du Proche-Orient
 swissEduPersonStudyBranch3.1465=U\:langues africaines
-swissEduPersonStudyBranch3.1470=U\:interpr\u00E8tes et traductions 
+swissEduPersonStudyBranch3.1470=U\:interpr\u00E8tes et traductions
 swissEduPersonStudyBranch3.1500=U\:arch\u00E9ologie, histoire pr\u00E9historique et antique
 swissEduPersonStudyBranch3.1600=U\:histoire
 swissEduPersonStudyBranch3.1700=U\:histoire de l'art
 swissEduPersonStudyBranch3.1800=U\:musiclogie
 swissEduPersonStudyBranch3.1850=U\:th\u00E9\u00E2tre et film
 swissEduPersonStudyBranch3.1900=U\:ethnologie et folklore
-swissEduPersonStudyBranch3.1990=U\:histoire et sciences culturelles interdisciplinaires/autres 
+swissEduPersonStudyBranch3.1990=U\:histoire et sciences culturelles interdisciplinaires/autres
 swissEduPersonStudyBranch3.2000=U\:psychologie
 swissEduPersonStudyBranch3.2100=U\:sciences de l'\u00E9ducation
 swissEduPersonStudyBranch3.2120=HEP\:p\u00E9dagogie sp\u00E9ciale
@@ -311,10 +310,10 @@ swissEduPersonStudyBranch3.2200=HEP\:sociologie
 swissEduPersonStudyBranch3.2205=HEP\:travail social
 swissEduPersonStudyBranch3.2300=HEP\:sciences politiques
 swissEduPersonStudyBranch3.2400=HEP\:sciences de la communication et des m\u00E9dias
-swissEduPersonStudyBranch3.2450=HEP\:sciences sociales interdisciplinaires/autres 
+swissEduPersonStudyBranch3.2450=HEP\:sciences sociales interdisciplinaires/autres
 swissEduPersonStudyBranch3.2505=HEP\:\u00E9conomie nationale
 swissEduPersonStudyBranch3.2520=HEP\:\u00E9conomie de gestion
-swissEduPersonStudyBranch3.2530=HEP\:informatique de gestion 
+swissEduPersonStudyBranch3.2530=HEP\:informatique de gestion
 swissEduPersonStudyBranch3.2540=HEP\:\u00E9conomie interdisciplinaire/autres
 swissEduPersonStudyBranch3.2600=HEP\:droit
 swissEduPersonStudyBranch3.3099=HEP\:formation continue en architecture, construction et planification
@@ -331,8 +330,8 @@ swissEduPersonStudyBranch3.3539=HEP\:formation du corps enseignant en arts en g\
 swissEduPersonStudyBranch3.3540=HEP\:\u00E9criture litt\u00E9raire
 swissEduPersonStudyBranch3.3551=HEP\:p\u00E9dagogique musicale (instrumentale et vocale)
 swissEduPersonStudyBranch3.3552=HEP\:interpr\u00E9tation/performance
-swissEduPersonStudyBranch3.3553=HEP\:musique scolaire et eccl\u00E9siastique 
-swissEduPersonStudyBranch3.3554=HEP\:chef d'orchestre 
+swissEduPersonStudyBranch3.3553=HEP\:musique scolaire et eccl\u00E9siastique
+swissEduPersonStudyBranch3.3554=HEP\:chef d'orchestre
 swissEduPersonStudyBranch3.3555=HEP\:formation sp\u00E9ciale en musique
 swissEduPersonStudyBranch3.3569=HEP\:musique en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3571=HEP\: cr\u00E9ation th\u00E9\u00E2trale en arts performatifs
@@ -342,14 +341,14 @@ swissEduPersonStudyBranch3.3574=HEP\:formation sp\u00E9ciale en th\u00E9\u00E2tr
 swissEduPersonStudyBranch3.3579=HEP\:th\u00E9\u00E2tre en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3589=HEP\:traduction
 swissEduPersonStudyBranch3.3599=HEP\:interpr\u00E9tation
-swissEduPersonStudyBranch3.3600=HEP\:linguistique appliqu\u00E9e en g\u00E9n\u00E9ral 
+swissEduPersonStudyBranch3.3600=HEP\:linguistique appliqu\u00E9e en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3609=HEP\:travail social
-swissEduPersonStudyBranch3.3619=HEP\:p\u00E9dagogie sp\u00E9cialis\u00E9e 
-swissEduPersonStudyBranch3.3629=HEP\:animation socioculturelle 
+swissEduPersonStudyBranch3.3619=HEP\:p\u00E9dagogie sp\u00E9cialis\u00E9e
+swissEduPersonStudyBranch3.3629=HEP\:animation socioculturelle
 swissEduPersonStudyBranch3.3639=HEP\:travail social en g\u00E9n\u00E9ral
-swissEduPersonStudyBranch3.3651=HEP\:diagnostic et conseil psychologique 
+swissEduPersonStudyBranch3.3651=HEP\:diagnostic et conseil psychologique
 swissEduPersonStudyBranch3.3652=HEP\:orientation professionnelle
-swissEduPersonStudyBranch3.3653=HEP\:psychologie du travail et de l'organisation 
+swissEduPersonStudyBranch3.3653=HEP\:psychologie du travail et de l'organisation
 swissEduPersonStudyBranch3.3659=HEP\:psychologie appliqu\u00E9e en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3661=HEP\:soins
 swissEduPersonStudyBranch3.3662=HEP\:sage-femme
@@ -359,31 +358,31 @@ swissEduPersonStudyBranch3.3672=HEP\:ergoth\u00E9rapie
 swissEduPersonStudyBranch3.3673=HEP\:th\u00E9rapie psychomotrice
 swissEduPersonStudyBranch3.3674=HEP\:conseil de nutrition
 swissEduPersonStudyBranch3.3679=HEP\:th\u00E9rapie et r\u00E9habilitation en g\u00E9n\u00E9ral
-swissEduPersonStudyBranch3.3681=HEP\:radiologie m\u00E9dicale 
+swissEduPersonStudyBranch3.3681=HEP\:radiologie m\u00E9dicale
 swissEduPersonStudyBranch3.3689=HEP\:technique diagnostique/th\u00E9rapeutique en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3699=HEP\:sant\u00E9 en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3701=HEP\:\u00E9cole maternelle et primaire en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3710=HEP\:\u00E9cole secondaire I en g\u00E9n\u00E9ral
-swissEduPersonStudyBranch3.3720=HEP\:secondaire II en g\u00E9n\u00E9ral (\u00E9coles universitaires) 
+swissEduPersonStudyBranch3.3720=HEP\:secondaire II en g\u00E9n\u00E9ral (\u00E9coles universitaires)
 swissEduPersonStudyBranch3.3725=HEP\:secondaire II en g\u00E9n\u00E9ral (formation profesionnelle)
 swissEduPersonStudyBranch3.3730=HEP\:logop\u00E9die
-swissEduPersonStudyBranch3.3731=HEP\:psychomotricit\u00E9 
+swissEduPersonStudyBranch3.3731=HEP\:psychomotricit\u00E9
 swissEduPersonStudyBranch3.3739=HEP\:p\u00E9dagogie curative en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3799=HEP\:formation du corps enseignant en g\u00E9n\u00E9ral
 swissEduPersonStudyBranch3.3801=HEP\:architecture
 swissEduPersonStudyBranch3.3802=HEP\:ing\u00E9nierie civile
 swissEduPersonStudyBranch3.3803=HEP\:gestion des proc\u00E9d\u00E9s de construction
-swissEduPersonStudyBranch3.3804=HEP\:planification du territoire 
+swissEduPersonStudyBranch3.3804=HEP\:planification du territoire
 swissEduPersonStudyBranch3.3805=HEP\:architecture du paysage
-swissEduPersonStudyBranch3.3806=HEP\:g\u00E9omatique 
+swissEduPersonStudyBranch3.3806=HEP\:g\u00E9omatique
 swissEduPersonStudyBranch3.3807=HEP\:techniques du bois
-swissEduPersonStudyBranch3.3808=HEP\:\u00E9lectrotechnique 
+swissEduPersonStudyBranch3.3808=HEP\:\u00E9lectrotechnique
 swissEduPersonStudyBranch3.3809=HEP\:informatique
 swissEduPersonStudyBranch3.3810=HEP\:t\u00E9l\u00E9communication
 swissEduPersonStudyBranch3.3811=HEP\:microtechnique
 swissEduPersonStudyBranch3.3812=HEP\:technique du syst\u00E8me
 swissEduPersonStudyBranch3.3813=HEP\:ing\u00E9nierie m\u00E9canique
-swissEduPersonStudyBranch3.3814=HEP\:gestion de projet technique en m\u00E9chatronique 
+swissEduPersonStudyBranch3.3814=HEP\:gestion de projet technique en m\u00E9chatronique
 swissEduPersonStudyBranch3.3815=HEP\:technique de l'automobile
 swissEduPersonStudyBranch3.3816=HEP\:ing\u00E9nierie de gestion
 swissEduPersonStudyBranch3.3817=HEP\:ing\u00E9nierie des m\u00E9dias
@@ -392,18 +391,18 @@ swissEduPersonStudyBranch3.3819=HEP\:biotechnologie
 swissEduPersonStudyBranch3.3820=HEP\:technologie alimentaire
 swissEduPersonStudyBranch3.3821=HEP\:life technologies
 swissEduPersonStudyBranch3.3822=HEP\:chimie
-swissEduPersonStudyBranch3.3823=HEP\:oenologie 
+swissEduPersonStudyBranch3.3823=HEP\:oenologie
 swissEduPersonStudyBranch3.3824=HEP\:agriculture
-swissEduPersonStudyBranch3.3825=HEP\:sylviculture 
-swissEduPersonStudyBranch3.3826=HEP\:ing\u00E9nierie de l'environnement 
+swissEduPersonStudyBranch3.3825=HEP\:sylviculture
+swissEduPersonStudyBranch3.3826=HEP\:ing\u00E9nierie de l'environnement
 swissEduPersonStudyBranch3.3827=HEP\:\u00E9conomie de gestion
 swissEduPersonStudyBranch3.3828=HEP\:programme europ\u00E9en en \u00E9conomie de gestion
-swissEduPersonStudyBranch3.3829=HEP\:International Business Management 
-swissEduPersonStudyBranch3.3830=HEP\:informatique \u00E9conomique 
-swissEduPersonStudyBranch3.3831=HEP\:Facility Management 
+swissEduPersonStudyBranch3.3829=HEP\:International Business Management
+swissEduPersonStudyBranch3.3830=HEP\:informatique \u00E9conomique
+swissEduPersonStudyBranch3.3831=HEP\:Facility Management
 swissEduPersonStudyBranch3.3832=HEP\:h\u00F4tellerie
 swissEduPersonStudyBranch3.3833=HEP\:tourisme
-swissEduPersonStudyBranch3.3834=HEP\:information et documentation 
+swissEduPersonStudyBranch3.3834=HEP\:information et documentation
 swissEduPersonStudyBranch3.3835=HEP\:communication
 swissEduPersonStudyBranch3.3836=HEP\:communication visuelle
 swissEduPersonStudyBranch3.3837=HEP\:hyperwerk
@@ -415,7 +414,7 @@ swissEduPersonStudyBranch3.3842=HEP\:droit de gestion
 swissEduPersonStudyBranch3.3843=HEP\:ing\u00E9nieur-designeur
 swissEduPersonStudyBranch3.3844=HEP\:aviation
 swissEduPersonStudyBranch3.3845=HEP\:optom\u00E9trie
-swissEduPersonStudyBranch3.3846=HEP\:Molecular Life Sciences 
+swissEduPersonStudyBranch3.3846=HEP\:Molecular Life Sciences
 swissEduPersonStudyBranch3.3847=HEP\:Life Science Technologies
 swissEduPersonStudyBranch3.3848=HEP\:film
 swissEduPersonStudyBranch3.3849=HEP\:r\u00E9alisation de films
@@ -446,21 +445,21 @@ swissEduPersonStudyBranch3.7200=U\:ing\u00E9nierie civile
 swissEduPersonStudyBranch3.7300=U\:architecture et planification
 swissEduPersonStudyBranch3.7400=U\:ing\u00E9nierie en chimie
 swissEduPersonStudyBranch3.7450=U\:microtechnique
-swissEduPersonStudyBranch3.750=U\:services pour collaborateurs et \u00E9tudiants 
+swissEduPersonStudyBranch3.750=U\:services pour collaborateurs et \u00E9tudiants
 swissEduPersonStudyBranch3.7500=U\:ing\u00E9nierie \u00E9lectrique
 swissEduPersonStudyBranch3.7550=U\:syst\u00E8mes de communications
 swissEduPersonStudyBranch3.7600=U\:ing\u00E9nierie m\u00E9canique
 swissEduPersonStudyBranch3.7650=U\:sciences de gestion + de production
 swissEduPersonStudyBranch3.7700=U\:sciences des mati\u00E8res
 swissEduPersonStudyBranch3.7800=U\:techniques culturelles et mesurations
-swissEduPersonStudyBranch3.7905=U\:sylviculture 
+swissEduPersonStudyBranch3.7905=U\:sylviculture
 swissEduPersonStudyBranch3.7910=U\:agriculture
 swissEduPersonStudyBranch3.7915=U\:technologie alimentaire
 swissEduPersonStudyBranch3.8000=U\:sciences militaires
-swissEduPersonStudyBranch3.850=U\:administration centrale 
-swissEduPersonStudyBranch3.9000=U\:interdisciplinaire / interfacultaire 
+swissEduPersonStudyBranch3.850=U\:administration centrale
+swissEduPersonStudyBranch3.9000=U\:interdisciplinaire / interfacultaire
 swissEduPersonStudyBranch3.9001=U\: Gender studies
-swissEduPersonStudyBranch3.9002=U\:formation continue interfacultaire 
+swissEduPersonStudyBranch3.9002=U\:formation continue interfacultaire
 swissEduPersonStudyBranch3.9999=HEP\:non applicable
 swissEduPersonStudyLevel=niveau d'\u00E9tudes
 swissEduPersonStudyLevel.00=cours de pr\u00E9paration ou formation continue, \u00E9tudiants invit\u00E9s
@@ -470,10 +469,10 @@ swissEduPersonStudyLevel.20=deuxi\u00E8me moiti\u00E9 des \u00E9tudes
 swissEduPersonStudyLevel.25=\u00E9tudes de master avec bachelor
 swissEduPersonStudyLevel.26=\u00E9tudes de master sans bachelor
 swissEduPersonStudyLevel.31=\u00E9tudes de doctorat
-swissEduPersonStudyLevel.32=\u00E9tudes post dipl\u00F4me 
-swissEduPersonStudyLevel.33=formation continue 
+swissEduPersonStudyLevel.32=\u00E9tudes post dipl\u00F4me
+swissEduPersonStudyLevel.33=formation continue
 swissEduPersonStudyLevel.34=formation continue modulaire
-swissEduPersonStudyLevel.35=\u00E9tudes compl\u00E9mentaires et d'approfondissement 
+swissEduPersonStudyLevel.35=\u00E9tudes compl\u00E9mentaires et d'approfondissement
 swissEduPersonStudyLevel.39=formation postgradu\u00E9e individuelle, formation continue.
 swissEduPersonUniqueID=ID individuel SwissEdu
 wayf.homesite=Universit\u00E9
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties
index 7dfdacfe2f3..33726d5cf20 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties
@@ -21,7 +21,6 @@ eduPersonAffiliation.student=Studente
 eduPersonEntitlement=Autorizzazione
 eduPersonOrgUnitDN=Unit\u00E0 organizzative DN
 employeeNumber=Numero personale
-error.insufficieant.attributes=Attributi Shibboleth richiesti\: Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=Errore Shibboleth. Ripeta il login, p.f.\!
 error.shibboleth.head=OLAT - Online Learning And Training - Errore
 error.shibboleth.not.authorized=Non sei autorizzato ad accedere ad OpenOLAT.
@@ -415,8 +414,8 @@ swissEduPersonStudyBranch3.3842=SUP\:Diritto aziendale
 swissEduPersonStudyBranch3.3843=SPU\:Ingegneri disegnatori
 swissEduPersonStudyBranch3.3844=SPU\:Aviazione
 swissEduPersonStudyBranch3.3845=SPU\:Optometria
-swissEduPersonStudyBranch3.3846=SUP\:Molecular Life Sciences 
-swissEduPersonStudyBranch3.3847=SUP\:Life Science Technologies 
+swissEduPersonStudyBranch3.3846=SUP\:Molecular Life Sciences
+swissEduPersonStudyBranch3.3847=SUP\:Life Science Technologies
 swissEduPersonStudyBranch3.3848=SUP\:Film
 swissEduPersonStudyBranch3.3849=SUP\:Realizzazione film
 swissEduPersonStudyBranch3.3999=SUP\:Perfezionamento non attribuibile
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_nl_NL.properties
index 4787e477667..e4a59fe5d43 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_nl_NL.properties
@@ -19,7 +19,6 @@ eduPersonAffiliation.student=Student
 eduPersonEntitlement=Autorisatie
 eduPersonOrgUnitDN=Organisatie-eenheid DN
 employeeNumber=Werknemer identificatienummer
-error.insufficieant.attributes=Verplichte Shibboleth  attributen\:  Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=Een Shibboleth fout trad op. Gelieve opnieuw aan te melden\!
 error.shibboleth.head=OLAT - Online Learning And Training - Error
 error.unqueid.notfound=Bent u echt gemachtigd om toegang te krijgen tot OLAT? Zo ja, gelieve opnieuw in te loggen.
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties
index 8cfd54fb20e..a09227ca8e0 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties
@@ -19,7 +19,6 @@ eduPersonAffiliation.student=Student
 eduPersonEntitlement=Authorization
 eduPersonOrgUnitDN=Organization unit DN
 employeeNumber=Employee identification number
-error.insufficieant.attributes=Mandatory Shibboleth attributes\: Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=A Shibboleth error occured. Please log in again\!
 error.shibboleth.head=OLAT - Online Learning And Training - Error
 error.unqueid.notfound=Are you really entitled to access OLAT? If so, please log in again.
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pt_BR.properties
index ac627368306..78d01733daf 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pt_BR.properties
@@ -21,7 +21,6 @@ eduPersonAffiliation.student=Estudante
 eduPersonEntitlement=Autoriza\u00E7\u00E3o
 eduPersonOrgUnitDN=Unidade da Organiza\u00E7\u00E3o
 employeeNumber=N\u00FAmero de Identifica\u00E7\u00E3o de Empregado
-error.insufficieant.attributes=Atributos Shibboleth Obrigat\u00F3rios\: Shib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=Um erro no Shibboleth ocorreu. Por favor fa\u00E7a o log in novamente\!
 error.shibboleth.head=OLAT - Online Learning And Training - Erro
 error.shibboleth.not.authorized=Voc\u00EA n\u00E3o est\u00E1 autorizado a iniciar sess\u00E3o OpenOLAT.
diff --git a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_zh_CN.properties
index 1034f657341..c26040d907c 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_zh_CN.properties
@@ -19,7 +19,6 @@ eduPersonAffiliation.student=\u5B66\u751F
 eduPersonEntitlement=\u6388\u6743
 eduPersonOrgUnitDN=DN\u7EC4\u7EC7\u5355\u5143
 employeeNumber=\u96C7\u5458\u8EAB\u4EFD\u8BC1\u53F7\u7801
-error.insufficieant.attributes=\u5F3A\u5236\u6027\u53E3\u4EE4\u5C5E\u6027\uFF1AShib-SwissEP-UniqueID, Shib-InetOrgPerson-givenName, Shib-Person-surname, Shib-InetOrgPerson-mail, Shib-SwissEP-HomeOrganization
 error.shibboleth.generic=\u53E3\u4EE4\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\uFF01
 error.shibboleth.head=OLAT - \u5728\u7EBF\u5B66\u4E60\u4E0E\u57F9\u8BAD - \u9519\u8BEF
 error.unqueid.notfound=\u60A8\u771F\u7684\u6709\u6743\u5229\u8BBF\u95EEOLAT\uFF1F\u5982\u679C\u771F\u662F\u8FD9\u6837\u7684\u8BDD\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002
diff --git a/src/main/java/org/olat/shibboleth/_i18n/i18nBundleMetadata.properties b/src/main/java/org/olat/shibboleth/_i18n/i18nBundleMetadata.properties
index b375df7451a..902f3d0f496 100644
--- a/src/main/java/org/olat/shibboleth/_i18n/i18nBundleMetadata.properties
+++ b/src/main/java/org/olat/shibboleth/_i18n/i18nBundleMetadata.properties
@@ -1,7 +1,6 @@
 #Sun Jan 23 15:36:16 CET 2011
 authentication.provider.description.annotation=\u8FD9\u4E2A\u53EF\u4EE5\u6839\u636E\u7528\u6237\u7684\u5355\u4F4D\u548C\u90E8\u95E8\u8FDB\u884C\u91CD\u65B0\u7FFB\u8BD1\uFF01\u4F8B\u5982\uFF1A\u60A8\u662F\u767E\u5EA6\u7684\u5206\u652F\u673A\u6784\u561B\uFF1F
 bundle.priority=650
-error.insufficieant.attributes.annotation=\u6839\u636E\u5B9E\u9645\u60C5\u51B5\u4ECE\u65B0\u5B9A\u4E49\uFF0C\u8FD9\u91CC\u672A\u505A\u4EFB\u4F55\u4FEE\u6539
 swissEduPersonHomeOrganizationType.uas.annotation=ENG Translation should be \: College (???) \r\n\=> No.
 swissEduPersonStaffCategory.101.annotation=Check spelling
 swissEduPersonStaffCategory.102.annotation=Check spelling
diff --git a/src/main/java/org/olat/shibboleth/manager/ShibbolethAttributes.java b/src/main/java/org/olat/shibboleth/manager/ShibbolethAttributes.java
index f642dfc3490..ca87369ee30 100644
--- a/src/main/java/org/olat/shibboleth/manager/ShibbolethAttributes.java
+++ b/src/main/java/org/olat/shibboleth/manager/ShibbolethAttributes.java
@@ -25,6 +25,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import org.olat.core.id.User;
+import org.olat.core.util.StringHelper;
 import org.olat.shibboleth.ShibbolethModule;
 import org.olat.shibboleth.handler.ShibbolethAttributeHandler;
 import org.olat.shibboleth.handler.ShibbolethAttributeHandlerFactory;
@@ -49,14 +50,15 @@ public class ShibbolethAttributes {
 	@Autowired
 	private ShibbolethAttributeHandlerFactory shibbolethAttributeHandlerFactory;
 
-	public void setAttributesMap(Map<String, String> attributesMap) {
-		this.shibbolethMap = attributesMap;
-	}
-
-	public String getValueForAttributeName(String attributeName) {
-		String attributeValue = shibbolethMap.get(attributeName);
-		ShibbolethAttributeHandler handler = getAttributeHandler(attributeName);
-		return handler.parse(attributeValue);
+	public void init(Map<String, String> attributes) {
+		shibbolethMap = new HashMap<>(attributes.size());
+		for (Entry<String, String> attribute : attributes.entrySet()) {
+			String attributeName = attribute.getKey();
+			String attributeValue = attribute.getValue();
+			ShibbolethAttributeHandler handler = getAttributeHandler(attributeName);
+			String parsedValue = handler.parse(attributeValue);
+			shibbolethMap.put(attributeName, parsedValue);
+		}
 	}
 
 	private ShibbolethAttributeHandler getAttributeHandler(String attributeName) {
@@ -65,6 +67,17 @@ public class ShibbolethAttributes {
 		return shibbolethAttributeHandlerFactory.getHandler(handlerName);
 	}
 
+	public String getValueForAttributeName(String attributeName) {
+		return shibbolethMap.get(attributeName);
+	}
+
+	public void setValueForUserPropertyName(String propertyName, String value) {
+		String attributeName = getShibbolethAttributeName(propertyName);
+		if (StringHelper.containsNonWhitespace(attributeName)) {
+			shibbolethMap.put(attributeName, value);
+		}
+	}
+
 	public String getValueForUserPropertyName(String propertyName) {
 		String attributeName = getShibbolethAttributeName(propertyName);
 		return getValueForAttributeName(attributeName);
@@ -81,6 +94,10 @@ public class ShibbolethAttributes {
 	    return null;
 	}
 
+	public Map<String, String> toMap() {
+		return new HashMap<>(shibbolethMap);
+	}
+
 	public boolean isAuthor() {
 		try {
 			String attributeValue = getValueForAttributeName(shibbolethModule.getAuthorMappingAttributeName());
diff --git a/src/test/java/org/olat/shibboleth/manager/ShibbolethAttributesTest.java b/src/test/java/org/olat/shibboleth/manager/ShibbolethAttributesTest.java
index b93ac541b93..25d356490ef 100644
--- a/src/test/java/org/olat/shibboleth/manager/ShibbolethAttributesTest.java
+++ b/src/test/java/org/olat/shibboleth/manager/ShibbolethAttributesTest.java
@@ -23,12 +23,14 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.AdditionalAnswers.returnsFirstArg;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -77,20 +79,20 @@ public class ShibbolethAttributesTest {
 	public void setUp() {
 		MockitoAnnotations.initMocks(this);
 
-		Map<String, String> shibbolethUserMapping = initUserMapping();
-		when(shibbolethModuleMock.getUserMapping()).thenReturn(shibbolethUserMapping);
-
-		Map<String, String> shibbolethKeysValues = initShibbolethMap();
 		sut = new ShibbolethAttributes();
-		sut.setAttributesMap(shibbolethKeysValues);
 
 		ReflectionTestUtils.setField(sut, "shibbolethModule", shibbolethModuleMock);
+		Map<String, String> shibbolethUserMapping = initUserMapping();
+		when(shibbolethModuleMock.getUserMapping()).thenReturn(shibbolethUserMapping);
 
 		// ShibbolethAttributeHandler.parse() does not modify the value
+		ReflectionTestUtils.setField(sut, "shibbolethAttributeHandlerFactory", shibbolethAttributeHandlerFactoryMock);
 		when(shibbolethAttributeHandlerFactoryMock.getHandler(anyString())).thenReturn(shibbolethAttributeHandlerMock);
 		when(shibbolethAttributeHandlerFactoryMock.getHandler(isNull())).thenReturn(shibbolethAttributeHandlerMock);
 		when(shibbolethAttributeHandlerMock.parse(anyString())).then(returnsFirstArg());
-		ReflectionTestUtils.setField(sut, "shibbolethAttributeHandlerFactory", shibbolethAttributeHandlerFactoryMock);
+
+		Map<String, String> shibbolethKeysValues = initShibbolethMap();
+		sut.init(shibbolethKeysValues);
 	}
 
 	private Map<String, String> initShibbolethMap() {
@@ -120,6 +122,48 @@ public class ShibbolethAttributesTest {
 		return user;
 	}
 
+	@Test
+	public void shouldParseValuesWhenInit() {
+		verify(shibbolethAttributeHandlerMock, times(3)).parse(anyString());
+		verify(shibbolethAttributeHandlerMock, times(1)).parse(isNull());
+	}
+
+	@Test
+	public void shouldReplaceValueByUserPropertyName() {
+		String newValue = "newValue";
+
+		sut.setValueForUserPropertyName(USER_NAME_KEY, newValue);
+
+		assertThat(sut.getValueForUserPropertyName(USER_NAME_KEY)).isEqualTo(newValue);
+	}
+
+	@Test
+	public void shouldNotSetPropertValueWhenNoMappingExits() {
+		String keyNotPresent = "keyNotPresent";
+		String newValue = "newValue";
+
+		sut.setValueForUserPropertyName(keyNotPresent, newValue);
+
+		assertThat(sut.getValueForUserPropertyName(keyNotPresent)).isNull();
+	}
+
+	@Test
+	public void shouldNotParseValueWhenSet() {
+		sut.setValueForUserPropertyName(USER_NAME_KEY, "newValue");
+
+		// Only 3 times in the init().
+		verify(shibbolethAttributeHandlerMock, times(3)).parse(anyString());
+	}
+
+	@Test
+	public void shouldReturnACopyOfTheInternalMap() {
+		Map<String, String> copiedttributes = sut.toMap();
+
+		Map<String, String> initMap = initShibbolethMap();
+		Set<String> initKeys = initMap.keySet();
+		assertThat(copiedttributes).isNotSameAs(initMap).containsKeys(initKeys.toArray(new String[initKeys.size()]));
+	}
+
 	@Test
 	public void shouldReturnValueForAShibbolethAttributeName() {
 		String shibbolethValue = sut.getValueForAttributeName(SHIB_EMAIL_KEY);
@@ -136,13 +180,6 @@ public class ShibbolethAttributesTest {
 		assertThat(shibbolethValue).isNull();
 	}
 
-	@Test
-	public void shouldReturnParsedValueForShibbolethAttributeName() {
-		sut.getValueForAttributeName(SHIB_EMAIL_KEY);
-
-		verify(shibbolethAttributeHandlerMock).parse(SHIB_EMAIL_VALUE);
-	}
-
 	@Test
 	public void shouldReturnValueForAUserPropertyName() {
 		String shibbolethValue = sut.getValueForUserPropertyName(USER_EMAIL_KEY);
@@ -159,13 +196,6 @@ public class ShibbolethAttributesTest {
 		assertThat(shibbolethValue).isNull();
 	}
 
-	@Test
-	public void shouldReturnParsedValueForUserPropertyName() {
-		sut.getValueForAttributeName(SHIB_EMAIL_KEY);
-
-		verify(shibbolethAttributeHandlerMock).parse(SHIB_EMAIL_VALUE);
-	}
-
 	@Test
 	public void shouldReturnTrueIfManyAttributesHaveChanged() {
 		User user = getIdenticalOlatUser();
-- 
GitLab