diff --git a/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties b/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties index 590ae5563d823e6dd2b2e9f52969533a79230e45..8f39bfe365456936dbdf0e813b795c0058a802b4 100644 --- a/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties +++ b/src/main/java/de/bps/course/nodes/den/_i18n/LocalStrings_fr.properties @@ -1,85 +1,60 @@ #Sat Jan 08 13:09:53 CET 2011 - - - - - - - - - - - - - - - - - - - - - - - - - -config.create.dates=cr\u00E9er rendez-vous +config.create.dates=Cr\u00E9er rendez-vous config.dates=G\u00E9rer les rendez-vous -config.dates.begin=d\u00E9but de rendez-vous +config.dates.begin=D\u00E9but de rendez-vous config.dates.begin.example=(dd.MM.yyyy HH\:mm) -config.dates.comment=remarque -config.dates.duration=dur\u00E9e d'un rendez-vous +config.dates.comment=Remarque +config.dates.duration=Dur\u00E9e d'un rendez-vous config.dates.duration.example=(hh\:mm) -config.dates.duration.single=dur\u00E9e du rendez-vous -config.dates.location=lieu -config.dates.move=diff\u00E9rer rendez-vous +config.dates.duration.single=Dur\u00E9e du rendez-vous +config.dates.location=Lieu +config.dates.move=Diff\u00E9rer rendez-vous config.dates.move.example=(+/-hh\:mm) config.dates.participants=Nombre de participants par rendez-vous config.dates.pause=Pause config.dates.pause.example=(hh\:mm) -config.dates.retakes=nombre rendez-vous +config.dates.retakes=Nombre rendez-vous config.dates.save=Enregistrer et fermer -config.dates.subject=titre de rendez-vous -config.default.values=valeurs par d\u00E9faut -config.header=distribution de rendez-vous +config.dates.subject=Titre du rendez-vous +config.default.values=Valeurs par d\u00E9faut +config.header=Distribution de rendez-vous config.nodates.long=Vous n'avez pas encore cr\u00E9\u00E9 des rendez-vous pour lesquels les participants peuvent s'inscrire. config.nodates.short=Pas de rendez-vous disponible -config.tasks=devoirs -config.type.date=distribution de rendez-vous -config.type.group=inscription de groupe +config.tasks=Devoirs +config.type.date=Distribution de rendez-vous +config.type.group=Inscription de groupe dates.edit=Editer rendez-vous -dates.table.begin=d\u00E9but -dates.table.comment=remarque -dates.table.date=rendez-vous +dates.table.begin=D\u00E9but +dates.table.comment=Remarque +dates.table.date=Rendez-vous dates.table.duration=Dur\u00E9e dates.table.edit.change=Editer dates.table.edit.delete=Effacer -dates.table.edit.save=enregistrer +dates.table.edit.save=Enregistrer dates.table.empty=Aucune date ne peut \u00EAtre affich\u00E9es -dates.table.end=fin -dates.table.list=liste des participants pour la distribution de rendez-vous +dates.table.end=Fin +dates.table.list=Liste des participants pour la distribution de rendez-vous dates.table.list.delete=Enlever des participants -dates.table.list.email=Envoyer e-mail -dates.table.location=lieu +dates.table.list.email=Envoyer courriel +dates.table.location=Lieu dates.table.participant.email=E-mail -dates.table.participant.email.send=\u00C9crire e-mail +dates.table.participant.email.send=\u00C9crire courriel dates.table.participant.firstname=Pr\u00E9nom dates.table.participant.lastname=Nom -dates.table.participant.manage=administrer +dates.table.participant.manage=Administrer dates.table.participant.name=Nom dates.table.participant.username=Nom d'utilisateur dates.table.participants.num=Anz. participants dates.table.reserved=Places -dates.table.run.enrolled=inscrit(e) +dates.table.run.enrolled=Inscrit(e) dates.table.run.full=Occup\u00E9 dates.table.run.no_action=- dates.table.run.notenrolled=Non inscrit(e) dates.table.sign.in=Inscription dates.table.sign.out=Se d\u00E9sinscrire dates.table.status=Statut -dates.table.subject=titre de rendez-vous -dates.table.timeframe=d\u00E9but - fin +dates.table.subject=Titre de rendez-vous +dates.table.timeframe=D\u00E9but - fin enrollment.error.enrolled=Inscription impossible. Un seul participant ne peut \u00EAtre inscrit que dans un seul rendez-vous. enrollment.error.full=Votre inscription n'a pas pu \u00EAtre compl\u00E9t\u00E9e. Cette date est d\u00E9j\u00E0 r\u00E9serv\u00E9e. enrollment.error.general=Une erreur inattendue s'est produite. @@ -87,24 +62,23 @@ enrollment.error.notenrolled=Le participant ne peut pas \u00EAtre d\u00E9sinscri enrollment.error.persisting=Une erreur s'est produite lors de l'enregistrement. Veuillez v\u00E9rifier votre derni\u00E8re activit\u00E9. enrollment.warning.manual=Au moins un participant n'a pas pu \u00EAtre inscrit. Probablement le participant est d\u00E9j\u00E0 inscrit dans un autre rendez-vous. form.enableCancelEnroll=d\u00E9sinscription autoris\u00E9e -form.error.format=mauvaise entr\u00E9e +form.error.format=Mauvaise entr\u00E9e form.error.notempty=Veuillez remplir guestnoaccess.message=Cette partie du cours n'est pas accessible pour les invit\u00E9s. <p> Pour aqu\u00E9rir un acc\u00E8s vers cette partie, vous devez vous identifier via une universit\u00E9 ou vous enregistrer dans OLAT. guestnoaccess.title=Pas d'acc\u00E8s pour les invit\u00E9s - mail.participants.add.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas y r\u00E9pondre. *** \n\nVous avez \u00E9t\u00E9 inscrit par {0} {1} ({2}) \u00E0 un rendez-vous \: \n\nNomDuRendezVous\: {4} mail.participants.add.subject=distribution de rendez-vous\: {4}. vous avez \u00E9t\u00E9 inscrit(e). mail.participants.remove.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas y r\u00E9pondre. *** \n\nVous avez \u00E9t\u00E9 d\u00E9sinscrit par {0} {1} ({2}) \u00E0 un rendez-vous \: \n\nNomDuRendezVous\: {4}\n\nEn cas de questions, veuillez contacter s.v.p. {0} {1} ({2}). mail.participants.remove.subject=distribution de rendez-vous\: {4}. vous avez \u00E9t\u00E9 d\u00E9sinscrit(e). notifications.entry=Modification d'utilisateur le {0} notifications.header=Attribution de la date dans le cours "{0}" -pane.tab.denconfig=configuration -participants=participants -participants.add=ajouter participants -participants.manage=g\u00E9rer participants -participants.message=E-mail \u00E0 tous les participants +pane.tab.denconfig=Configuration +participants=Participants +participants.add=Ajouter des participants +participants.manage=G\u00E9rer les participants +participants.message=Courriel \u00E0 tous les participants participants.message.empty=Veuillez faire un choix, s.v.p.. -participants.message.to=participants choisis +participants.message.to=Participants choisis run.dates.enrollment=Inscription au rendez-vous run.enrollment.list=G\u00E9rer participants table.model.duration.day=Jour diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java index 3abdc12164234d998a6798710ae717660940d654..b1a69164a77d8ceddb8c243e67731ed1028e85ac 100644 --- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java +++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java @@ -26,6 +26,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; @@ -139,7 +140,14 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { this.multiSelection = multiSelection; Roles roles = ureq.getUserSession().getRoles(); isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); - userSearchFormPropertyHandlers = userManager.getUserPropertyHandlersFor(UserSearchForm.class.getCanonicalName(), isAdministrativeUser); + List<UserPropertyHandler> allSearchFormPropertyHandlers = userManager.getUserPropertyHandlersFor(UserSearchForm.class.getCanonicalName(), isAdministrativeUser); + if(isAdministrativeUser) { + userSearchFormPropertyHandlers = allSearchFormPropertyHandlers.stream() + .filter(prop -> !UserConstants.NICKNAME.equals(prop.getName())) + .collect(Collectors.toList()); + } else { + userSearchFormPropertyHandlers = allSearchFormPropertyHandlers; + } searchableOrganisations = organisationService.getOrganisations(getIdentity(), roles, OrganisationRoles.valuesWithoutGuestAndInvitee()); @@ -185,7 +193,6 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { loginEl = uifactory.addTextElement("login", "search.form.login", 128, "", searchFormContainer); loginEl.setVisible(isAdministrativeUser); - propFormItems = new HashMap<>(); for (UserPropertyHandler userPropertyHandler : userSearchFormPropertyHandlers) { if (userPropertyHandler == null) continue; diff --git a/src/main/java/org/olat/admin/user/UserSearchListProvider.java b/src/main/java/org/olat/admin/user/UserSearchListProvider.java index 86a2685af0b6d27ae09766cfe321ffda0dfcd5d0..04e024030ee76626c8d0eaba3fa887bbea4e0b7a 100644 --- a/src/main/java/org/olat/admin/user/UserSearchListProvider.java +++ b/src/main/java/org/olat/admin/user/UserSearchListProvider.java @@ -30,6 +30,7 @@ import org.olat.basesecurity.IdentityShort; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.control.generic.ajax.autocompletion.ListProvider; import org.olat.core.gui.control.generic.ajax.autocompletion.ListReceiver; +import org.olat.core.gui.util.CSSHelper; import org.olat.core.id.Organisation; import org.olat.core.id.UserConstants; import org.olat.user.UserManager; @@ -81,9 +82,9 @@ public class UserSearchListProvider implements ListProvider { maxEntries--; IdentityShort ident = it_res.next(); String key = ident.getKey().toString(); - String displayKey = ident.getName(); + String displayKey = ident.getNickName(); String displayText = userManager.getUserDisplayName(ident); - receiver.addEntry(key, displayKey, displayText, null); + receiver.addEntry(key, displayKey, displayText, CSSHelper.CSS_CLASS_USER); } if(hasMore){ receiver.addEntry(".....","....."); diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_cs.properties index 793d8de1bbfdd0b8164e4b89d464d84a39008e42..5066ec12f6fd287b85d4825456c8b085e4baaf43 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_cs.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_cs.properties @@ -41,7 +41,7 @@ new.error.loginname.choosen=U\u017Eivatelsk\u00E9 jm\u00E9no u\u017E je pou\u017 new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Hesla nejsou toto\u017En\u00E1. new.error.property.invalid=Chybn\u00FD vstup\! -new.form.auth=Heslo do OLATu +new.form.auth=Heslo do OpenOlatu new.form.auth.false=Nevytv\u00E1\u0159et nyn\u00ED new.form.auth.true=Vytvo\u0159it nyn\u00ED new.form.language=Jazyk diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_da.properties index b8e431cfbfdd8b0b98f12c35dec128a85bb69c07..523a3e00d0d929864ed32da76276323b0b63dd7b 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_da.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_da.properties @@ -34,7 +34,7 @@ new.error.email.choosen=Denne e-mailadresse findes allerede. Der er ingen grund new.error.loginname.choosen=Dette brugernavn er allerede brugt. V\u00E6lg venligst et andet. new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=De indtastede kodeord passer ikke sammen. -new.form.auth=OLAT kodeord +new.form.auth=OpenOlat kodeord new.form.auth.false=Opret ikke nu new.form.auth.true=Opret nu new.form.language=Sprog diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties index 9725b337a7040d35ce84ff97e1a9644a965b4e98..8ea86bd3ded7c979fe169a1775dcb853a804180a 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties @@ -72,7 +72,7 @@ new.error.loginname.choosen=Dieser Benutzername ist bereits vergeben. Versuchen new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Die beiden Passw\u00F6rter stimmen nicht \u00FCberein. new.error.property.invalid=Invalid input\! -new.form.auth=OLAT-Passwort +new.form.auth=OpenOlat-Passwort new.form.auth.false=nicht jetzt anlegen new.form.auth.true=anlegen new.form.language=Sprache diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_el.properties index eb00d3303cd50ae9c60759dc7cbdf1d2ea202a95..d8608f8cbaf42b0d78335c40753876fa9ea3c0f4 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_el.properties @@ -48,7 +48,7 @@ new.error.loginname.choosen=\u03A4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=\u039F\u03B9 \u03B4\u03CD\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03AF \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03C4\u03B1\u03B9\u03C1\u03B9\u03AC\u03B6\u03BF\u03C5\u03BD. new.error.property.invalid=\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE\! -new.form.auth=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03C3\u03C4\u03BF OLAT +new.form.auth=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03C3\u03C4\u03BF OpenOlat new.form.auth.false=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1 new.form.auth.true=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 new.form.language=\u0393\u03BB\u03CE\u03C3\u03C3\u03B1 diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties index 1f7a003053ef0bc29a7d21a61c7a7c2d5659b278..a95cf05b5cc03f1eada7030c622337db5d89e98b 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties @@ -71,7 +71,7 @@ new.error.loginname.choosen=This user name has already been allocated. Please tr new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=The two passwords do not match. new.error.property.invalid=Invalid input\! -new.form.auth=OLAT password +new.form.auth=OpenOlat password new.form.auth.false=Do not create now new.form.auth.true=Create now new.form.language=Language diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_es.properties index deba5d7618f5b8a21c9f7b2bbef98c21b071d892..f509a4ff4851dfc3560403789e39ed865ff0e4e4 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_es.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_es.properties @@ -42,7 +42,7 @@ new.error.loginname.choosen=Este nombre de usuario ya ha sido asignado. Por favo new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Las dos contrase\u00F1as no coinciden. new.error.property.invalid=\u00A1Entrada inv\u00E1lida\! -new.form.auth=Contrase\u00F1a OLAT +new.form.auth=Contrase\u00F1a OpenOlat new.form.auth.false=No crear ahora new.form.auth.true=Crear ahora new.form.language=Idioma diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties index f31f97cbcd743ae63a9c7c63af0996e8d5843547..c31652aa7b442983e226460ccf810aeeb78ad0b7 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties @@ -72,7 +72,7 @@ new.error.loginname.choosen=Ce nom d'utilisateur est d\u00E9j\u00E0 utilis\u00E9 new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Les deux mots de passe ne sont pas identiques. new.error.property.invalid=Invalid input\! -new.form.auth=mot de passe OLAT +new.form.auth=Mot de passe OpenOlat new.form.auth.false=cr\u00E9er plus tard new.form.auth.true=cr\u00E9er new.form.language=Langue diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_it.properties index 86dd81fd987296fc5a9029e54efd8b58b679414f..3e61682f082e6a54ecb6a481cc81905019933251 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_it.properties @@ -57,7 +57,7 @@ new.error.loginname.choosen=Questo nome d'utente \u00E8 gi\u00E0 in uso. Provi c new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Le due password non coincidono. new.error.property.invalid=Immissione non valida\! -new.form.auth=Password OLAT +new.form.auth=Password OpenOlat new.form.auth.false=non stabilire ora new.form.auth.true=stabilire new.form.language=Lingua diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_jp.properties index d551847a898562d9bba37b68e91806ab97478ada..7ee856e65a75161e0ad5de58cb7dc9487aecbbf5 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_jp.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_jp.properties @@ -49,7 +49,7 @@ new.error.loginname.choosen=\u3053\u306E\u30E6\u30FC\u30B6\u306F\u3001\u3059\u30 new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=2\u3064\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5408\u81F4\u3057\u307E\u305B\u3093\u3002 new.error.property.invalid=\u7121\u52B9\u306A\u5165\u529B\u3067\u3059\! -new.form.auth=OLAT\u30D1\u30B9\u30EF\u30FC\u30C9 +new.form.auth=OpenOlat\u30D1\u30B9\u30EF\u30FC\u30C9 new.form.auth.false=\u3059\u3050\u306B\u4F5C\u6210\u3057\u306A\u3044 new.form.auth.true=\u3059\u3050\u306B\u4F5C\u6210\u3059\u308B new.form.language=\u8A00\u8A9E diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_lt.properties index f114d7b352f03a7f0ed3c9c6c30b59e88e41011c..b58346a4eeb41d1ce6d3a7c391dcea45f4062cca 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_lt.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_lt.properties @@ -31,7 +31,7 @@ new.error.email.choosen=Toks naudotojo el. pa\u0161to adresas jau egzistuoja. Pr new.error.loginname.choosen=Toks naudotojo vardas jau egzistuoja. Pra\u0161ome \u012Fvesti kit\u0105. new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Slapta\u017Eodiai nesutampa. -new.form.auth=OLAT slapta\u017Eodis +new.form.auth=OpenOlat slapta\u017Eodis new.form.auth.false=Nesukurti dabar new.form.auth.true=Sukurti dabar new.form.language=Kalba diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_nl_NL.properties index 93c4e36359db0f339744646dae3dde257d5cc750..012fff3082b430adc3dc65a7a306a7881419f6e4 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_nl_NL.properties @@ -51,7 +51,7 @@ new.error.loginname.choosen=Deze gebruikersnaam werd al toegewezen. Gelieve een new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=De twee wachtwoorden zijn niet gelijk. new.error.property.invalid=Ongeldige input\! -new.form.auth=OLAT wachtwoord +new.form.auth=OpenOlat wachtwoord new.form.auth.false=Nu niet aanmaken new.form.auth.true=Nu aanmaken new.form.language=Taal diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pl.properties index faa868a3d70585a42f412bcfd01e4b29f02079d0..2beaa27996b8e4c256c931dd63dbf47534ea8b6d 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pl.properties @@ -52,7 +52,7 @@ new.error.loginname.choosen=U\u017Cytkownik o podanej nazwie ju\u017C istnieje. new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Podane has\u0142a s\u0105 r\u00F3\u017Cne new.error.property.invalid=B\u0142\u0119dna warto\u015B\u0107\! -new.form.auth=Has\u0142o OLAT +new.form.auth=Has\u0142o OpenOlat new.form.auth.false=Nie tw\u00F3rz teraz new.form.auth.true=Utw\u00F3rz teraz new.form.language=J\u0119zyk diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pt_BR.properties index 0f6a7f506ba92d39a1b6fa4f642601d306ea14f8..50cd8ab9d4a845a44d125c2a2806a9e18a90d504 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_pt_BR.properties @@ -71,7 +71,7 @@ new.error.loginname.choosen=Este nome de usu\u00E1rio j\u00E1 foi alocado. Por f new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=As duas senhas n\u00E3o combinam. new.error.property.invalid=Entrada invalida\! -new.form.auth=OLAT password +new.form.auth=OpenOlat password new.form.auth.false=N\u00E3o crie agora new.form.auth.true=Crie agora new.form.language=Idioma diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_ru.properties index be7d1cc6556aa21da86a4df256e8e1a299c40d81..b6d50f2f1bb1438adfff84490dd92113273e2b71 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_ru.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_ru.properties @@ -34,7 +34,7 @@ new.error.email.choosen=\u0414\u0430\u043D\u043D\u044B\u0439 \u0430\u0434\u0440\ new.error.loginname.choosen=\u0414\u0430\u043D\u043D\u043E\u0435 \u0438\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044C \u0434\u0440\u0443\u0433\u043E\u0435 \u0438\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F. new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=\u041E\u0431\u0430 \u043D\u043E\u0432\u044B\u0445 \u043F\u0430\u0440\u043E\u043B\u044F \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442. -new.form.auth=\u041F\u0430\u0440\u043E\u043B\u044C \u0434\u043B\u044F OLAT +new.form.auth=\u041F\u0430\u0440\u043E\u043B\u044C \u0434\u043B\u044F OpenOlat new.form.auth.false=\u043F\u043E\u0437\u0436\u0435 \u0437\u0430\u043D\u0435\u0441\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 new.form.auth.true=\u0437\u0430\u043D\u0435\u0441\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 new.form.language=\u042F\u0437\u044B\u043A diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_sq.properties index a9967d307bd65382c3f89c26991cc3a6ab6cbadf..656aedaddb033d9a474458d8376a41e05ec20213 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_sq.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_sq.properties @@ -35,7 +35,7 @@ new.error.loginname.choosen=Ky shfryt\u00EBzues tani \u00EBsht\u00EB i z\u00EBn\ new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=Dy fjal\u00EBkalimet nuk p\u00EBrputhen. new.error.property.invalid=E hyr\u00EB e pavlefshme\! -new.form.auth=OLAT fjal\u00EBkalimi +new.form.auth=OpenOlat fjal\u00EBkalimi new.form.auth.false=Mos e krijo q\u00EB tani new.form.auth.true=Krijoje tani new.form.language=Gjuha diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_CN.properties index ec8d97ecce1c422676d6f10c1ec2e7122576fca5..8c3dc8ea76598bbc789c24492a576f2fb6d48659 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_CN.properties @@ -50,7 +50,7 @@ new.error.loginname.choosen=\u8BE5\u7528\u6237\u540D\u5DF2\u6CE8\u518C\uFF0C\u8B new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=\u5BC6\u7801\u4E0D\u4E00\u81F4\u3002 new.error.property.invalid=\u65E0\u6548\u8F93\u5165\uFF01 -new.form.auth=OLAT\u5BC6\u7801 +new.form.auth=OpenOlat\u5BC6\u7801 new.form.auth.false=\u73B0\u5728\u4E0D\u521B\u5EFA new.form.auth.true=\u73B0\u5728\u521B\u5EFA new.form.language=\u8BED\u8A00 diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_TW.properties index 1796eef9ff494265831a6e9d3bb18c7b744c0e35..b6bf6d4b0e22905d64a7cd997b83c44113e8daa7 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_TW.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_zh_TW.properties @@ -47,7 +47,7 @@ new.error.loginname.choosen=\u9019\u500B\u4F7F\u7528\u8005\u540D\u7A31\u5DF2\u88 new.error.loginname.empty=$org.olat.user\:form.checkUsername new.error.password.nomatch=\u9019\u5169\u500B\u5BC6\u78BC\u4E0D\u4E00\u81F4\u3002 new.error.property.invalid=\u4E0D\u6B63\u78BA\u7684\u8F38\u5165\uFF01 -new.form.auth=OLAT \u5BC6\u78BC +new.form.auth=OpenOlat \u5BC6\u78BC new.form.auth.false=\u4E0D\u8981\u73FE\u5728\u5EFA\u7ACB new.form.auth.true=\u73FE\u5728\u5EFA\u7ACB new.form.language=\u8A9E\u8A00 diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index 274848350c76c20bb36dd1ecf579a2d86d98a74a..a388cfccd80874dc8f05534a9f3b58439d95d231 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -767,24 +767,7 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { @Override public Authentication findAuthentication(IdentityRef identity, String provider) { - if (identity==null) { - throw new IllegalArgumentException("identity must not be null"); - } - - StringBuilder sb = new StringBuilder(); - sb.append("select auth from ").append(AuthenticationImpl.class.getName()) - .append(" as auth where auth.identity.key=:identityKey and auth.provider=:provider"); - - List<Authentication> results = dbInstance.getCurrentEntityManager() - .createQuery(sb.toString(), Authentication.class) - .setParameter("identityKey", identity.getKey()) - .setParameter("provider", provider) - .getResultList(); - if (results == null || results.isEmpty()) return null; - if (results.size() > 1) { - throw new AssertException("Found more than one Authentication for a given subject and a given provider."); - } - return results.get(0); + return authenticationDao.getAuthentication(identity, provider); } @Override diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java index cc48eb0c429e7f9c89c0c83ff9a8dbbdf3d74bb6..83e9d4ae09eedb53c193ee9349d8cc96e64a276e 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java @@ -113,6 +113,8 @@ public class BaseSecurityModule extends AbstractSpringModule { private static final String WIKI_ENABLED = "wiki"; + private static final String IDENTITY_NAME = "identity.name"; + /** * default values */ @@ -310,6 +312,9 @@ public class BaseSecurityModule extends AbstractSpringModule { userSearchMaxResults = getStringPropertyValue(USERSEARCH_MAXRESULTS, userSearchMaxResults); userInfosTunnelCourseBuildingBlock = getStringPropertyValue(USERINFOS_TUNNEL_CBB, userInfosTunnelCourseBuildingBlock); wikiEnabled = getStringPropertyValue(WIKI_ENABLED, wikiEnabled); + + identityName = getStringPropertyValue(IDENTITY_NAME, identityName); + log.info("Identity.name generator: {}", identityName); } public static final OrganisationRoles[] getUserAllowedRoles() { @@ -322,6 +327,15 @@ public class BaseSecurityModule extends AbstractSpringModule { return "auto".equals(identityName); } + public String getIdentityName() { + return identityName; + } + + public void setIdentityName(String identityName) { + this.identityName = identityName; + setStringProperty(IDENTITY_NAME, identityName, true); + } + public boolean isUserAllowedAdminProps(Roles roles) { if(roles == null || roles.isInvitee() || roles.isGuestOnly()) return false; diff --git a/src/main/java/org/olat/basesecurity/IdentityShort.java b/src/main/java/org/olat/basesecurity/IdentityShort.java index 4dbbea366133dc920b96da068a6e80d378f3ae80..80fcfbe102431aaaf30f20826f797ccc04cbd187 100644 --- a/src/main/java/org/olat/basesecurity/IdentityShort.java +++ b/src/main/java/org/olat/basesecurity/IdentityShort.java @@ -71,10 +71,14 @@ public class IdentityShort implements Persistable, IdentityNames { private Date lastLogin; @Column(name="id_status", nullable=true, unique=false, insertable=false, updatable=false) private int status; + @Column(name="id_external", nullable=true, unique=false, insertable=false, updatable=false) + private String externalId; @Column(name="first_name", nullable=true, unique=false, insertable=false, updatable=false) private String firstName; @Column(name="last_name", nullable=true, unique=false, insertable=false, updatable=false) private String lastName; + @Column(name="nick_name", nullable=true, unique=false, insertable=false, updatable=false) + private String nickName; @Column(name="email", nullable=true, unique=false, insertable=false, updatable=false) private String email; @@ -92,6 +96,10 @@ public class IdentityShort implements Persistable, IdentityNames { return name; } + public String getExternalId() { + return externalId; + } + public Date getLastLogin() { return lastLogin; } @@ -110,6 +118,10 @@ public class IdentityShort implements Persistable, IdentityNames { return lastName; } + public String getNickName() { + return nickName; + } + public String getEmail() { return email; } diff --git a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java index 8aa7b6557082c0d528172c6e91772bd8db4bb773..cf19d83cf7ea596d16d196012f9c31f19edd28c8 100644 --- a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java +++ b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java @@ -38,6 +38,7 @@ import org.olat.modules.curriculum.CurriculumRoles; */ public class SearchIdentityParams { private String idAndExternalIds; + private String externalId; private String login; private String searchString; private Map<String, String> userProperties; @@ -325,6 +326,14 @@ public class SearchIdentityParams { this.idAndExternalIds = idAndExternalIds; } + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + public List<Integer> getExactStatusList() { return exactStatusList; } diff --git a/src/main/java/org/olat/basesecurity/manager/AuthenticationDAO.java b/src/main/java/org/olat/basesecurity/manager/AuthenticationDAO.java index 6c5a5e456cbaa32353ee9289b5dbaf7f44cbd8fc..0dd9f9088e62efe47b9e71e87f1708571849f984 100644 --- a/src/main/java/org/olat/basesecurity/manager/AuthenticationDAO.java +++ b/src/main/java/org/olat/basesecurity/manager/AuthenticationDAO.java @@ -32,6 +32,7 @@ import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.core.logging.AssertException; +import org.olat.core.util.StringHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -126,6 +127,48 @@ public class AuthenticationDAO { .getResultList(); } + /** + * + * @param provider The authentication provider + * @return A list of identities (the user is not fetched) + */ + public List<Authentication> getAuthentications(String provider) { + StringBuilder sb = new StringBuilder(256); + sb.append("select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") + .append(" inner join fetch auth.identity as ident") + .append(" inner join fetch ident.user as identUser") + .append(" where auth.provider=:provider"); + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Authentication.class) + .setParameter("provider", provider) + .getResultList(); + } + + public Authentication getAuthentication(IdentityRef identity, String provider) { + if (identity == null || !StringHelper.containsNonWhitespace(provider)) { + throw new IllegalArgumentException("identity must not be null"); + } + + StringBuilder sb = new StringBuilder(); + sb.append("select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") + .append(" inner join auth.identity as ident") + .append(" inner join ident.user as user") + .append(" where auth.identity.key=:identityKey and auth.provider=:provider"); + + List<Authentication> results = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Authentication.class) + .setParameter("identityKey", identity.getKey()) + .setParameter("provider", provider) + .getResultList(); + if (results == null || results.isEmpty()) { + return null; + } + if (results.size() > 1) { + throw new AssertException("Found more than one Authentication for a given subject and a given provider."); + } + return results.get(0); + } + public Authentication getAuthentication(String authUsername, String provider) { StringBuilder sb = new StringBuilder(256); sb.append("select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java index 15fd5fd2a535eca16aedafc4031fa65420cf907c..0aad97bc76c1031833b973f34ee039d7406a4127 100644 --- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java +++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java @@ -170,7 +170,8 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie || params.hasRoles() || params.hasExcludedRoles() || params.getRepositoryEntryRole() != null || params.getBusinessGroupRole() != null || params.getCurriculumRole() != null || params.hasOrganisations() || params.hasOrganisationParents() - || StringHelper.containsNonWhitespace(params.getIdAndExternalIds()); + || StringHelper.containsNonWhitespace(params.getIdAndExternalIds()) + || StringHelper.containsNonWhitespace(params.getExternalId()); } private boolean createQueryPart(SearchIdentityParams params, QueryBuilder sb, boolean needsAnd) { @@ -284,6 +285,11 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie sb.append("ident.externalId=:idAndRefs)"); } + if(StringHelper.containsNonWhitespace(params.getExternalId())) { + needsAnd = checkAnd(sb, needsAnd); + sb.append("ident.externalId=:externalId"); + } + if(params.getManaged() != null) { needsAnd = checkAnd(sb, needsAnd); if(params.getManaged().booleanValue()) { @@ -370,28 +376,14 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie } // append query for login if (params.getLogin() != null) { - if (params.getLogin().contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append(" lower(ident.name) like :login ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append(" ident.name like :login"); - } else { - sb.append(" lower(ident.name) like :login"); - } - + sb.append("("); + PersistenceHelper.appendFuzzyLike(sb, "ident.name", "login", dbInstance.getDbVendor()); + sb.append(" or "); + PersistenceHelper.appendFuzzyLike(sb, "user.nickName", "login", dbInstance.getDbVendor()); sb.append(" or exists (select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") .append(" where ident.key=auth.identity.key and"); - - if (params.getLogin().contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append(" lower(auth.authusername) like :login ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append(" auth.authusername like :login"); - } else { - sb.append(" lower(auth.authusername) like :login"); - } - - sb.append(")"); + PersistenceHelper.appendFuzzyLike(sb, "auth.authusername", "login", dbInstance.getDbVendor()); + sb.append("))"); // if user fields follow a join element is needed needsUserPropertiesJoin = true; @@ -625,6 +617,10 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie } dbq.setParameter("idAndRefs", params.getIdAndExternalIds()); } + + if(params.getExternalId() != null) { + dbq.setParameter("externalId", params.getExternalId()); + } } private boolean checkAnd(QueryBuilder sb, boolean needsAnd) { diff --git a/src/main/java/org/olat/core/commons/services/notifications/PersonalRSSServlet.java b/src/main/java/org/olat/core/commons/services/notifications/PersonalRSSServlet.java index 488ec63e53b6debecd95789c82d1e54183b2b24c..c8f1b96a29f3d0b75a6ce2e5cb39a6382ce01c0e 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/PersonalRSSServlet.java +++ b/src/main/java/org/olat/core/commons/services/notifications/PersonalRSSServlet.java @@ -111,9 +111,9 @@ public class PersonalRSSServlet extends HttpServlet { if (encoding == null) { encoding = DEFAULT_ENCODING; if (log.isDebugEnabled()) { - log.debug("Feed encoding::" + encoding); + log.debug("Feed encoding::{}", encoding); } - log.warn("No encoding provided by feed::" + feed.getClass().getCanonicalName() + " Using utf-8 as default."); + log.warn("No encoding provided by feed::{} Using utf-8 as default.", feed.getClass().getCanonicalName()); } response.setCharacterEncoding(encoding); response.setContentType("application/rss+xml"); diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java index cba7f1a74f3a0b5b7732cab6f899f6cc43e84d52..6404937b90cbf9dcc8f7dfb6fda50b02db8ba376 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AutoCompleterRenderer.java @@ -54,7 +54,6 @@ public class AutoCompleterRenderer extends DefaultComponentRenderer { final int inputSize = 72; String id = autoCompleter.getFormDispatchId(); if(autoCompleter.isEnabled()) { - boolean showDisplayKey = false; String mapperUri = autoCompleter.getMapperUri(); int minLength = autoCompleter.getMinLength(); StringOutput command = new StringOutput(64); @@ -80,13 +79,9 @@ public class AutoCompleterRenderer extends DefaultComponentRenderer { .append(" filter: function ( response ) {\n") .append(" return jQuery.map(response, function (object) {\n") .append(" return {\n") - .append(" value: '' + object.key,\n"); - if(showDisplayKey) { - sb.append(" fullName: object.displayKey + ': ' + object.value\n"); - } else { - sb.append(" fullName: object.value\n"); - } - sb.append(" };\n") + .append(" value: '' + object.key,\n") + .append(" fullName: object.value\n") + .append(" };\n") .append(" });\n") .append(" }\n") .append(" }\n") diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java index 7ce7eb7722a9c8034e91c3c58b8725a2e001e4d0..f3f8ee400eb67e9dccebedcf939c41e866d67676 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java @@ -21,7 +21,6 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table; import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.ComponentRenderer; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.impl.FormDecorator; import org.olat.core.gui.components.form.flexible.impl.FormJSHelper; @@ -39,7 +38,7 @@ import org.olat.core.util.StringHelper; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements ComponentRenderer { +class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer { @Override public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator, diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index f91f0ee33198d0f37dd438f5dfe08b048e5f093f..3c9c8d470c27c0d752d81a109a6f9ced6a3f3087 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -40,7 +40,6 @@ import org.olat.core.gui.components.Component; import org.olat.core.gui.components.ComponentEventListener; import org.olat.core.gui.components.choice.Choice; import org.olat.core.gui.components.form.flexible.FormItem; -import org.olat.core.gui.components.form.flexible.FormItemCollection; import org.olat.core.gui.components.form.flexible.elements.AutoCompleter; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; @@ -80,7 +79,7 @@ import org.olat.core.util.prefs.Preferences; * @author Christian Guretzki * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement, FormItemCollection, +public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement, ControllerEventListener, ComponentEventListener, Disposable { //settings diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java index c2c4b052eecdf0c815f6b7299a10b56aee12ef66..ff34e922b2b3f423159db23a69bc037e786ba1c6 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessedIdentityListProvider.java @@ -84,7 +84,7 @@ public class AssessedIdentityListProvider implements ListProvider { maxEntries--; IdentityShort ident = it_res.next(); String key = ident.getKey().toString(); - String displayKey = null;//TODO username + String displayKey = ident.getNickName(); String displayText = userManager.getUserDisplayName(ident); receiver.addEntry(key, displayKey, displayText, CSSHelper.CSS_CLASS_USER); } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java index 31ec7a2322574809b4789670ddc7e2ae7695c372..a98c2f5b86747d0673a8b61df7c290dd590a50b3 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java @@ -307,7 +307,7 @@ public class IdentityListCourseNodeController extends FormBasicController if(!extendedFilters.isEmpty()) { tableEl.setExtendedFilterButton(translate("filter.groups"), extendedFilters); } - tableEl.setAndLoadPersistedPreferences(ureq, getTableId());//TODO username + tableEl.setAndLoadPersistedPreferences(ureq, getTableId()); } protected List<FlexiTableFilter> getFilters() { @@ -365,7 +365,7 @@ public class IdentityListCourseNodeController extends FormBasicController } protected String getTableId() { - return "assessment-tool-identity-list"; + return "assessment-tool-identity-list-v2"; } protected void initAssessmentColumns(FlexiTableColumnModel columnsModel, AssessmentConfig assessmentConfig) { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAIdentityListCourseNodeController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAIdentityListCourseNodeController.java index 096e1549a542e91d845325ef87d8766dbe4a81a1..bc17786b8dbae555d61e4def438762658e77acc0 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAIdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAIdentityListCourseNodeController.java @@ -91,7 +91,7 @@ public class GTAIdentityListCourseNodeController extends IdentityListCourseNodeC @Override protected String getTableId() { - return "gta-assessment-tool-identity-list"; + return "gta-assessment-tool-identity-list-v2"; } @Override diff --git a/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java b/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java index ee13d1c46a4b614976e46b6ee47d8993c0b300e2..9d947d602d9f07b2d43efce4151fd11e71834b04 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java @@ -147,9 +147,9 @@ public class IQIdentityListCourseNodeController extends IdentityListCourseNodeCo @Override protected String getTableId() { if(isTestQTI21()) { - return"qti21-assessment-tool-identity-list"; + return"qti21-assessment-tool-identity-list-v2"; } - return "qti-assessment-tool-identity-list"; + return "qti-assessment-tool-identity-list-v2"; } @Override diff --git a/src/main/java/org/olat/course/nodes/opencast/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/opencast/ui/_i18n/LocalStrings_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5f4192afb6668185f1bbb0deee90bae6cde7e506 --- /dev/null +++ b/src/main/java/org/olat/course/nodes/opencast/ui/_i18n/LocalStrings_fr.properties @@ -0,0 +1,15 @@ +#Fri Aug 14 06:56:56 CEST 2020 +config.display=Affichage +config.display.event=Vid\u00E9o +config.display.series=S\u00E9ries +config.event=Vid\u00E9o +config.identifier=Identifiant +config.series=S\u00E9ries +error.event.not.found=La vid\u00E9o "{0}" n'a pas pu \u00EAtre trouv\u00E9e sur le serveur Opencast. +error.no.selection.long=Pour "{0}", une vid\u00E9o ou une s\u00E9rie doivent \u00EAtre s\u00E9lectionn\u00E9es dans l'onglet "Configuration". +error.no.selection.short=Aucune vid\u00E9o ou s\u00E9rie n'est s\u00E9lectionn\u00E9e. +error.series.not.found=La s\u00E9rie "{0}" n'a pas \u00E9t\u00E9 trouv\u00E9e sur le serveur Opencast. +pane.tab.config=Configuration +start.event=D\u00E9marrer la vid\u00E9o +start.series=Ouvrir la s\u00E9rie +title=Opencast diff --git a/src/main/java/org/olat/course/nodes/st/STIdentityListCourseNodeController.java b/src/main/java/org/olat/course/nodes/st/STIdentityListCourseNodeController.java index eeed8113435539784378acc828900308c05b42ff..9ed677d73eb681c460eaf5061f6b40b34309df8c 100644 --- a/src/main/java/org/olat/course/nodes/st/STIdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/nodes/st/STIdentityListCourseNodeController.java @@ -117,7 +117,7 @@ public class STIdentityListCourseNodeController extends IdentityListCourseNodeCo @Override protected String getTableId() { - return "st-assessment-tool-identity-list"; + return "st-assessment-tool-identity-list-v2"; } @Override diff --git a/src/main/java/org/olat/group/manager/MemberViewQueries.java b/src/main/java/org/olat/group/manager/MemberViewQueries.java index f039714cc5a574940d3c7cc3caaeb031213785f7..37aba9ce786d7ef1f619eed5e7b61febfb042b99 100644 --- a/src/main/java/org/olat/group/manager/MemberViewQueries.java +++ b/src/main/java/org/olat/group/manager/MemberViewQueries.java @@ -296,18 +296,11 @@ public class MemberViewQueries { // append query for login boolean appendOr = false; - - if (params.getLogin() != null) { + if (params.getLogin() != null) {// backwards compatibility appendOr = true; - if (params.getLogin().contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append("lower(ident.name) like :login ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append("ident.name like :login"); - } else { - sb.append("lower(ident.name) like :login"); - } - //TODO username + PersistenceHelper.appendFuzzyLike(sb, "ident.name", "login", dbInstance.getDbVendor()); + sb.append(" or "); + PersistenceHelper.appendFuzzyLike(sb, "identUser.nickName", "login", dbInstance.getDbVendor()); } // append queries for user fields @@ -319,15 +312,7 @@ public class MemberViewQueries { } else { appendOr = true; } - - if(dbInstance.isMySQL()) { - sb.append("identUser.").append(key).append(" like :").append(key).append("_value"); - } else { - sb.append("lower(identUser.").append(key).append(") like :").append(key).append("_value"); - } - if(dbInstance.isOracle()) { - sb.append(" escape '\\'"); - } + PersistenceHelper.appendFuzzyLike(sb, "identUser.".concat(key), key.concat("_value"), dbInstance.getDbVendor()); } } diff --git a/src/main/java/org/olat/ldap/LDAPLoginManager.java b/src/main/java/org/olat/ldap/LDAPLoginManager.java index eaa506bf01e459a0b3f0aa326c0f48f9ad312f04..a937094eb06c88f854d11195074ed513deb943cb 100644 --- a/src/main/java/org/olat/ldap/LDAPLoginManager.java +++ b/src/main/java/org/olat/ldap/LDAPLoginManager.java @@ -51,7 +51,7 @@ public interface LDAPLoginManager { public Map<String,String> prepareUserPropertyForSync(Attributes attributes, Identity identity); - public List<Identity> getIdentitysDeletedInLdap(LdapContext ctx); + public List<Identity> getIdentitiesDeletedInLdap(LdapContext ctx); public Identity findIdentityByLdapAuthentication(Attributes attrs, LDAPError errors); @@ -69,8 +69,6 @@ public interface LDAPLoginManager { public void freeSyncLock(); - public void doSyncSingleUser(Identity ident); - /** * A filter is build from the login attribute value and the resulting * attributes are sync to the specified identity. diff --git a/src/main/java/org/olat/ldap/_spring/ldapContext.xml b/src/main/java/org/olat/ldap/_spring/ldapContext.xml index fb227ac844781bfd1db616e22e4483758aeca4a9..fd143fa0c4416ee1085dfa0f030f2d6b7d243e97 100644 --- a/src/main/java/org/olat/ldap/_spring/ldapContext.xml +++ b/src/main/java/org/olat/ldap/_spring/ldapContext.xml @@ -121,6 +121,7 @@ <entry key='${ldap.attributename.email}' value='email' /> <entry key='${ldap.attributename.firstName}' value='firstName' /> <entry key='${ldap.attributename.lastName}' value='lastName' /> + <entry key='${ldap.attributename.nickName}' value='nickName' /> <!-- example for another mapping <entry key='description' value='orgUnit' /> diff --git a/src/main/java/org/olat/ldap/manager/LDAPDAO.java b/src/main/java/org/olat/ldap/manager/LDAPDAO.java index d4bb5b696f03bd982e9dd9827f762affd10a2ab9..e35eef3dbbf6bf9d5b66ceaa81c79cc50167b620 100644 --- a/src/main/java/org/olat/ldap/manager/LDAPDAO.java +++ b/src/main/java/org/olat/ldap/manager/LDAPDAO.java @@ -194,7 +194,7 @@ public class LDAPDAO { } catch (Exception e) { log.error("Exception when trying to search users from LDAP using ldapBase::" + ldapBase + " on row::" + counter, e); } - log.debug("finished search for ldapBase:: " + ldapBase); + log.debug("finished search for ldapBase:: {}", ldapBase); } } @@ -368,7 +368,7 @@ public class LDAPDAO { private boolean isPagedResultControlSupported(LdapContext ctx) { // FXOLAT-299, might return false on 2nd execution - if (pagingSupportedAlreadyFound == true) return true; + if (pagingSupportedAlreadyFound) return true; try { SearchControls ctl = new SearchControls(); ctl.setReturningAttributes(new String[]{"supportedControl"}); diff --git a/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java b/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java index ac8760f3e63254c00679963543039d04792e414a..d2e893f920e82124ffcd5a08b7902862638935f3 100644 --- a/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java +++ b/src/main/java/org/olat/ldap/manager/LDAPLoginManagerImpl.java @@ -409,7 +409,9 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro */ @Override public boolean changePassword(Identity identity, String pwd, LDAPError errors) { - String uid = identity.getName(); + String uid = identity.getName();//TODO username + + String ldapUserPasswordAttribute = syncConfiguration.getLdapUserPasswordAttribute(); try { LdapContext ctx = bindSystem(); @@ -476,7 +478,7 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro public void deleteIdentities(List<Identity> identityList, Identity doer) { for (Identity identity: identityList) { if(Identity.STATUS_PERMANENT.equals(identity.getStatus())) { - log.info(Tracing.M_AUDIT, identity.getKey() + " was not deleted because is status is permanent."); + log.info(Tracing.M_AUDIT, "{} was not deleted because is status is permanent.", identity.getKey()); continue; } @@ -577,17 +579,20 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro String email = getAttributeValue(userAttributes.get(syncConfiguration.getOlatPropertyToLdapAttribute(UserConstants.EMAIL))); // Lookup user if (securityManager.findIdentityByLogin(uid) != null) { - log.error("Can't create user with username='{}', this username does already exist in OLAT database", uid); + log.error("Can't create user with username='{}', this username does already exist in the database", uid); + return null; + } + if(!securityModule.isIdentityNameAutoGenerated() && securityManager.findIdentityByName(uid) != null) { + log.error("Can't create user with username='{}', this identity name does already exist in the database", uid); return null; } - //TODO username () if (!MailHelper.isValidEmailAddress(email)) { // needed to prevent possibly an AssertException in findIdentityByEmail breaking the sync! log.error("Cannot try to lookup user {} by email with an invalid email::{}", uid, email); return null; } if (!userManager.isEmailAllowed(email)) { - log.error("Can't create user with email='{}', a user with that email does already exist in OLAT database", email); + log.error("Can't create user with email='{}', a user with that email does already exist in the database", email); return null; } @@ -721,10 +726,12 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro LdapContext ctx = bindSystem(); if (ctx == null) { log.error("could not bind to ldap"); + return; } String ldapUserIDAttribute = syncConfiguration.getOlatPropertyToLdapAttribute(LDAPConstants.LDAP_USER_IDENTIFYER); - String filter = ldapDao.buildSearchUserFilter(ldapUserIDAttribute, identity.getName()); + Authentication authentication = authenticationDao.getAuthentication(identity, LDAPAuthenticationController.PROVIDER_LDAP); + String filter = ldapDao.buildSearchUserFilter(ldapUserIDAttribute, authentication.getAuthusername()); boolean withCoacheOfGroups = StringHelper.containsNonWhitespace(syncConfiguration.getCoachedGroupAttribute()); List<String> ldapBases = syncConfiguration.getLdapBases(); @@ -794,7 +801,10 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro } /** - * Searches for Identity in OLAT. + * Searches for identity with the login attribute, with fallback to the uid attribute. + * If not found and configured to, try to convert an identity with an OLAT authentication + * to LDAP, or if the identity name are manually generated, try to convert an identity + * with the right name to LDAP. * * @param uid Name of Identity * @param errors LDAPError Object if user exits but not member of @@ -811,15 +821,14 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro return null; } - String uid = getAttributeValue(attrs.get(syncConfiguration - .getOlatPropertyToLdapAttribute(LDAPConstants.LDAP_USER_IDENTIFYER))); String token = getAttributeValue(attrs.get(syncConfiguration.getLdapUserLoginAttribute())); - Authentication ldapAuth = authenticationDao.getAuthentication(token, LDAPAuthenticationController.PROVIDER_LDAP); if(ldapAuth != null) { return ldapAuth.getIdentity(); } + String uid = getAttributeValue(attrs.get(syncConfiguration + .getOlatPropertyToLdapAttribute(LDAPConstants.LDAP_USER_IDENTIFYER))); ldapAuth = authenticationDao.getAuthentication(uid, LDAPAuthenticationController.PROVIDER_LDAP); if(ldapAuth != null) { if(StringHelper.containsNonWhitespace(token) && !token.equals(ldapAuth.getAuthusername())) { @@ -837,6 +846,15 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro log.info("Found identity by LDAP username that was not yet in LDAP security group. Converted user::{} to be an LDAP managed user", uid); return defaultAuth.getIdentity(); } + + if(!securityModule.isIdentityNameAutoGenerated()) { + Identity identity = securityManager.findIdentityByName(uid); + if(identity != null) { + securityManager.createAndPersistAuthentication(identity, LDAPAuthenticationController.PROVIDER_LDAP, token, null, null); + log.info("Found identity by identity name that was not yet in LDAP security group. Converted user::{} to be an LDAP managed user", uid); + return identity; + } + } } return null; } @@ -860,10 +878,11 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro * @throws NamingException */ @Override - public List<Identity> getIdentitysDeletedInLdap(LdapContext ctx) { + public List<Identity> getIdentitiesDeletedInLdap(LdapContext ctx) { if (ctx == null) { - return null; + return Collections.emptyList(); } + // Find all LDAP Users String userID = syncConfiguration.getOlatPropertyToLdapAttribute(LDAPConstants.LDAP_USER_IDENTIFYER); String userFilter = syncConfiguration.getLdapUserFilter(); @@ -883,18 +902,18 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro }, (userFilter == null ? "" : userFilter), new String[] { userID }, ctx); if (ldapList.isEmpty()) { - log.warn("No users in LDAP found, can't create deletionList!!"); + log.warn("No users in LDAP found, can't create the deletion list."); return Collections.emptyList(); } - + List<Identity> identityListToDelete = new ArrayList<>(); - List<Identity> olatListIdentity = authenticationDao.getIdentitiesWithAuthentication(LDAPAuthenticationController.PROVIDER_LDAP); - for (Identity ida:olatListIdentity) { - // compare usernames with lowercase - if (!ldapList.contains(ida.getName().toLowerCase())) { - identityListToDelete.add(ida); + List<Authentication> ldapAuthentications = authenticationDao.getAuthentications(LDAPAuthenticationController.PROVIDER_LDAP); + for (Authentication ldapAuthentication:ldapAuthentications) { + if (!ldapList.contains(ldapAuthentication.getAuthusername().toLowerCase())) { + identityListToDelete.add(ldapAuthentication.getIdentity()); } } + dbInstance.commitAndCloseSession(); return identityListToDelete; } @@ -1153,7 +1172,7 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro break; } default: { - log.error("LDAP Role synchronization not supported for: " + role); + log.error("LDAP Role synchronization not supported for: {}", role); } } } @@ -1161,11 +1180,12 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro private void doBatchSyncDeletedUsers(LdapContext ctx, String sinceSentence) { // create User to Delete List - List<Identity> deletedUserList = getIdentitysDeletedInLdap(ctx); + List<Identity> deletedUserList = getIdentitiesDeletedInLdap(ctx); // delete old users if (deletedUserList == null || deletedUserList.isEmpty()) { - log.info("LDAP batch sync: no users to delete" + sinceSentence); + log.info("LDAP batch sync: no users to delete {}", sinceSentence); } else { + int deletedUserListSize = deletedUserList.size(); if (ldapLoginModule.isDeleteRemovedLDAPUsersOnSync()) { // check if more not more than the defined percentages of // users managed in LDAP should be deleted @@ -1175,31 +1195,24 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro if (olatListIdentity.isEmpty()) log.info("No users managed by LDAP, can't delete users"); else { - int prozente = (int) (((float)deletedUserList.size() / (float) olatListIdentity.size())*100); - if (prozente >= ldapLoginModule.getDeleteRemovedLDAPUsersPercentage()) { - log.info("LDAP batch sync: more than " - + ldapLoginModule.getDeleteRemovedLDAPUsersPercentage() - + "% of LDAP managed users should be deleted. Please use Admin Deletion Job. Or increase deleteRemovedLDAPUsersPercentage. " - + prozente - + "% tried to delete."); + int prozente = (int) (((float)deletedUserListSize / (float) olatListIdentity.size()) * 100.0); + int cutValue = ldapLoginModule.getDeleteRemovedLDAPUsersPercentage(); + if (prozente >= cutValue) { + log.info("LDAP batch sync: more than {}% of LDAP managed users should be deleted. Please use Admin Deletion Job. Or increase deleteRemovedLDAPUsersPercentage. {}% tried to delete.", cutValue, prozente); } else { // delete users deleteIdentities(deletedUserList, null); - log.info("LDAP batch sync: " + deletedUserList.size() + " users deleted" + sinceSentence); + log.info("LDAP batch sync: {} users deleted {}", deletedUserListSize, sinceSentence); } } } else { // Do nothing, only log users to logfile - StringBuilder users = new StringBuilder(); + StringBuilder users = new StringBuilder(deletedUserListSize * 42); for (Identity toBeDeleted : deletedUserList) { - users.append(toBeDeleted.getName()).append(','); + users.append(toBeDeleted.getKey()).append(','); } - log.info("LDAP batch sync: " - + deletedUserList.size() - + " users detected as to be deleted" - + sinceSentence - + ". Automatic deleting is disabled in LDAPLoginModule, delete these users manually::[" - + users.toString() + "]"); + log.info("LDAP batch sync: {} users detected as to be deleted {}. Automatic deleting is disabled in LDAPLoginModule, delete these users manually::[{}]", + deletedUserListSize, sinceSentence, users); } } dbInstance.commitAndCloseSession(); @@ -1532,32 +1545,10 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro } return ldapUser; } - - @Override - public void doSyncSingleUser(Identity ident){ - LdapContext ctx = bindSystem(); - if (ctx == null) { - log.error("could not bind to ldap"); - } - String userDN = ldapDao.searchUserDNByUid(ident.getName(), ctx); - - final List<Attributes> ldapUserList = new ArrayList<>(); - ldapDao.searchInLdap(new LDAPVisitor() { - @Override - public void visit(SearchResult result) { - Attributes resAttribs = result.getAttributes(); - log.debug(" found : " + resAttribs.size() + " attributes in result " + result.getName()); - ldapUserList.add(resAttribs); - } - }, userDN, syncConfiguration.getUserAttributes(), ctx); - - Attributes attrs = ldapUserList.get(0); - Map<String, String> olatProToSync = prepareUserPropertyForSync(attrs, ident); - if (olatProToSync != null) { - syncUser(olatProToSync, ident); - } - } + /** + * Used by the Panther provider + */ @Override public void doSyncSingleUserWithLoginAttribute(Identity ident) { LdapContext ctx = bindSystem(); @@ -1566,15 +1557,12 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro } String ldapUserIDAttribute = syncConfiguration.getLdapUserLoginAttribute(); - String filter = ldapDao.buildSearchUserFilter(ldapUserIDAttribute, ident.getName()); + Authentication authentication = authenticationDao.getAuthentication(ident, LDAPAuthenticationController.PROVIDER_LDAP); + String filter = ldapDao.buildSearchUserFilter(ldapUserIDAttribute, authentication.getAuthusername()); List<Attributes> ldapUserAttrs = new ArrayList<>(); - ldapDao.searchInLdap(new LDAPVisitor() { - @Override - public void visit(SearchResult result) { - ldapUserAttrs.add(result.getAttributes()); - } - }, filter, syncConfiguration.getUserAttributes(), ctx); + ldapDao.searchInLdap(result -> ldapUserAttrs.add(result.getAttributes()), + filter, syncConfiguration.getUserAttributes(), ctx); if(ldapUserAttrs.size() == 1) { Attributes attrs = ldapUserAttrs.get(0); @@ -1583,13 +1571,10 @@ public class LDAPLoginManagerImpl implements LDAPLoginManager, AuthenticationPro syncUser(olatProToSync, ident); } } else { - log.error("Cannot sync the user because it was not found on LDAP server: " + ident); + log.error("Cannot sync the user because it was not found on LDAP server: {}", ident); } } - /** - * @see org.olat.ldap.LDAPLoginManager#getLastSyncDate() - */ @Override public Date getLastSyncDate() { return lastSyncDate; diff --git a/src/main/java/org/olat/ldap/ui/LDAPAdminController.java b/src/main/java/org/olat/ldap/ui/LDAPAdminController.java index 89cca444075aed75d47f08c59882e2ff18f5a07a..b5df6f6f3bf7cc5e87b718b3eccd4c09ad74fca5 100644 --- a/src/main/java/org/olat/ldap/ui/LDAPAdminController.java +++ b/src/main/java/org/olat/ldap/ui/LDAPAdminController.java @@ -168,7 +168,7 @@ public class LDAPAdminController extends BasicController implements GenericEvent } else if (source == userSearchCtrl) { calloutCtr.deactivate(); Identity choosenIdent = ((SingleIdentityChosenEvent)event).getChosenIdentity(); - ldapLoginManager.doSyncSingleUser(choosenIdent); + ldapLoginManager.doSyncSingleUserWithLoginAttribute(choosenIdent); } } } @@ -190,7 +190,7 @@ public class LDAPAdminController extends BasicController implements GenericEvent // get deleted users List<Identity> identitiesToDelete = null; try { - identitiesToDelete = ldapLoginManager.getIdentitysDeletedInLdap(ctx); + identitiesToDelete = ldapLoginManager.getIdentitiesDeletedInLdap(ctx); ctx.close(); } catch (NamingException e) { showError("delete.error.connection.close"); diff --git a/src/main/java/org/olat/login/auth/OLATAuthManager.java b/src/main/java/org/olat/login/auth/OLATAuthManager.java index 712af194bd97ed12d66c70c0bbdbdacc7a0f8990..2c956687e8095f08e98074246d8074a58dca1a49 100644 --- a/src/main/java/org/olat/login/auth/OLATAuthManager.java +++ b/src/main/java/org/olat/login/auth/OLATAuthManager.java @@ -218,7 +218,7 @@ public class OLATAuthManager implements AuthenticationSPI { //nothing to do } - private Identity findIdentInChangingEmailWorkflow(String login){ + private Identity findIdentInChangingEmailWorkflow(String login) { List<TemporaryKey> tk = registrationManager.loadTemporaryKeyByAction(RegistrationManager.EMAIL_CHANGE); if (tk != null) { for (TemporaryKey temporaryKey : tk) { @@ -228,6 +228,7 @@ public class OLATAuthManager implements AuthenticationSPI { String currentEmail = mails.get("currentEMail"); String changedEmail = mails.get("changedEMail"); if (login.equals(changedEmail) && StringHelper.containsNonWhitespace(currentEmail)) { + // legacy, probably wrong return securityManager.findIdentityByName(currentEmail); } } diff --git a/src/main/java/org/olat/login/oauth/OAuthDispatcher.java b/src/main/java/org/olat/login/oauth/OAuthDispatcher.java index 51e0896e21d31b12b6a9490b49bcb030da61291e..93806ad21a5df2783a9b6d6d476edada9230f4f7 100644 --- a/src/main/java/org/olat/login/oauth/OAuthDispatcher.java +++ b/src/main/java/org/olat/login/oauth/OAuthDispatcher.java @@ -231,7 +231,7 @@ public class OAuthDispatcher implements Dispatcher { securityManager.createAndPersistAuthentication(identity, registration.getAuthProvider(), id, null, null); registration.setIdentity(identity); } else { - log.error("OAuth Login failed, user with user name {} not found.", email); + log.error("OAuth Login failed, user with user name {} not found. OAuth user: {}", email, infos); } } } else { diff --git a/src/main/java/org/olat/login/validation/UsernameInUseRule.java b/src/main/java/org/olat/login/validation/UsernameInUseRule.java index 7da9cb6c38498155fbca76da54cad603dc749a94..7d9da8914042c0c13ef2119620b9a16855ecd531 100644 --- a/src/main/java/org/olat/login/validation/UsernameInUseRule.java +++ b/src/main/java/org/olat/login/validation/UsernameInUseRule.java @@ -20,6 +20,7 @@ package org.olat.login.validation; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.BaseSecurityModule; import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; @@ -38,7 +39,9 @@ class UsernameInUseRule extends DescriptionRule { @Override public boolean validate(String value, Identity identity) { BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); - return securityManager.findIdentityByLogin(value) == null; + BaseSecurityModule securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class); + return securityManager.findIdentityByLogin(value) == null + && (securityModule.isIdentityNameAutoGenerated() || securityManager.findIdentityByName(value) == null); } @Override diff --git a/src/main/java/org/olat/modules/appointments/ui/AppointmentsConfigController.java b/src/main/java/org/olat/modules/appointments/ui/AppointmentsConfigController.java deleted file mode 100644 index 125413f2cb71e7a990496e7ffe7944b5d2e6c497..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/appointments/ui/AppointmentsConfigController.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * <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.appointments.ui; - -import static org.olat.core.gui.translator.TranslatorHelper.translateAll; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.form.flexible.FormItem; -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.FormEvent; -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.course.editor.NodeEditController; -import org.olat.course.nodes.AppointmentsCourseNode; -import org.olat.modules.ModuleConfiguration; - -/** - * - * Initial date: 13 Apr 2020<br> - * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com - * - */ -public class AppointmentsConfigController extends FormBasicController { - - private static final String KEY_COACH = "role.coach"; - private static final String[] EDIT_TOPIC_KEYS = new String[] { KEY_COACH }; - private static final String[] EDIT_APPOINTMENT_KEYS = new String[] { KEY_COACH }; - - private MultipleSelectionElement editTopicEl; - private MultipleSelectionElement editAppointmentEl; - - private ModuleConfiguration config; - - public AppointmentsConfigController(UserRequest ureq, WindowControl wControl, AppointmentsCourseNode courseNode) { - super(ureq, wControl, LAYOUT_BAREBONE); - config = courseNode.getModuleConfiguration(); - initForm(ureq); - } - - @Override - protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - FormLayoutContainer rightsCont = FormLayoutContainer.createDefaultFormLayout("rights", getTranslator()); - formLayout.add(rightsCont); - rightsCont.setFormTitle(translate("user.rights")); - - editTopicEl = uifactory.addCheckboxesVertical("config.edit.topic", rightsCont, EDIT_TOPIC_KEYS, - translateAll(getTranslator(), EDIT_TOPIC_KEYS), 1); - editTopicEl.select(KEY_COACH, config.getBooleanSafe(AppointmentsCourseNode.CONFIG_COACH_EDIT_TOPIC)); - editTopicEl.addActionListener(FormEvent.ONCHANGE); - - editAppointmentEl = uifactory.addCheckboxesVertical("config.edit.appointment", rightsCont, - EDIT_APPOINTMENT_KEYS, translateAll(getTranslator(), EDIT_APPOINTMENT_KEYS), 1); - editAppointmentEl.select(KEY_COACH, - config.getBooleanSafe(AppointmentsCourseNode.CONFIG_COACH_EDIT_APPOINTMENT)); - editAppointmentEl.addActionListener(FormEvent.ONCHANGE); - } - - @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if (source == editTopicEl) { - doUserRights(ureq); - } else if (source == editAppointmentEl) { - doUserRights(ureq); - } - super.formInnerEvent(ureq, source, event); - } - - private void doUserRights(UserRequest ureq) { - config.setBooleanEntry(AppointmentsCourseNode.CONFIG_COACH_EDIT_TOPIC, editTopicEl.isAtLeastSelected(1)); - config.setBooleanEntry(AppointmentsCourseNode.CONFIG_COACH_EDIT_APPOINTMENT, editAppointmentEl.isAtLeastSelected(1)); - fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); - } - - @Override - protected void formOK(UserRequest ureq) { - // - } - - @Override - protected void doDispose() { - // - } - -} diff --git a/src/main/java/org/olat/modules/appointments/ui/AppointmentsEditController.java b/src/main/java/org/olat/modules/appointments/ui/AppointmentsEditController.java deleted file mode 100644 index 169cf02258e3f34cba00a19aaa33a1ca5531d0d2..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/modules/appointments/ui/AppointmentsEditController.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * <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.appointments.ui; - -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.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController; -import org.olat.course.nodes.AppointmentsCourseNode; - -/** - * - * Initial date: 13 Apr 2020<br> - * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com - * - */ -public class AppointmentsEditController extends ActivateableTabbableDefaultController { - - private static final String PANE_TAB_CONFIG = "pane.tab.config"; - private static final String[] paneKeys = { PANE_TAB_CONFIG }; - - private TabbedPane tabPane; - private AppointmentsConfigController configCtrl; - - public AppointmentsEditController(UserRequest ureq, WindowControl wControl, AppointmentsCourseNode courseNode) { - super(ureq, wControl); - - configCtrl = new AppointmentsConfigController(ureq, wControl, courseNode); - listenTo(configCtrl); - } - - @Override - public String[] getPaneKeys() { - return paneKeys; - } - - @Override - public TabbedPane getTabbedPane() { - return tabPane; - } - - @Override - protected void doDispose() { - // - } - - @Override - protected void event(UserRequest ureq, Component source, Event event) { - // - } - - @Override - public void event(UserRequest ureq, Controller source, Event event) { - if (source == configCtrl) { - fireEvent(ureq, event); - } - } - - @Override - public void addTabs(TabbedPane tabbedPane) { - tabPane = tabbedPane; - tabbedPane.addTab(translate(PANE_TAB_CONFIG), configCtrl.getInitialComponent()); - } - -} diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java index 43cd249ba184e8e6c75a7054d887515d94357b67..8214923b3fd069cb5e6ac1a374767ee93d367dc3 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java @@ -587,9 +587,8 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, .map(BigBlueButtonRecordingWithReference::getRecording) .collect(Collectors.toList()); getRecordingsHandler().deleteRecordings(recordings, meeting, errors); - - //TODO delete references } + bigBlueButtonRecordingReferenceDao.deleteRecordingReferences(meeting); } @Override diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java index fd9983adb6c262411c0c0dfac895074809fd3aff..9bc6c77da867e0c00fcedc6bc67d0fa2eceb369b 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonOpenCastRecordingsHandler.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Locale; import org.apache.logging.log4j.Logger; +import org.olat.basesecurity.BaseSecurityModule; import org.olat.core.gui.translator.Translator; import org.olat.core.id.User; import org.olat.core.id.UserConstants; @@ -72,6 +73,8 @@ public class BigBlueButtonOpenCastRecordingsHandler implements BigBlueButtonReco private OpencastModule opencastModule; @Autowired private OpencastService opencastService; + @Autowired + private BaseSecurityModule securityModule; @Override public String getId() { @@ -140,7 +143,12 @@ public class BigBlueButtonOpenCastRecordingsHandler implements BigBlueButtonReco uriBuilder.optionalParameter("meta_dc-creator", creatorFirstLastName); } - String username = creator.getProperty(UserConstants.NICKNAME, null); + String username; + if(securityModule.isIdentityNameAutoGenerated()) { + username = creator.getProperty(UserConstants.NICKNAME, null); + } else { + username = meeting.getCreator().getName(); + } if(StringHelper.containsNonWhitespace(username)) { uriBuilder.optionalParameter("meta_dc-rightsHolder", username); uriBuilder.optionalParameter("meta_opencast-acl-read-roles", "ROLE_OAUTH_USER ROLE_USER_" + username); diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonRecordingReferenceDAO.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonRecordingReferenceDAO.java index 152c1f6adaceca953d5a52b1ef01b063d165a50a..8921a882d14412ab4c648bab0e1f183d912e2e94 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonRecordingReferenceDAO.java +++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonRecordingReferenceDAO.java @@ -74,5 +74,13 @@ public class BigBlueButtonRecordingReferenceDAO { .setParameter("meetingKey", meeting.getKey()) .getResultList(); } + + public int deleteRecordingReferences(BigBlueButtonMeeting meeting) { + String query = "delete from bigbluebuttonrecording as record where record.meeting.key=:meetingKey"; + return dbInstance.getCurrentEntityManager() + .createQuery(query) + .setParameter("meetingKey", meeting.getKey()) + .executeUpdate(); + } } diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java index 4bb5159b48e20bed0693078c55d89ed3d0cddb34..d0936135988c2f8ed407703fe0e725cc6b62f316 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonMeetingController.java @@ -244,8 +244,10 @@ public class BigBlueButtonMeetingController extends FormBasicController implemen if(attendee != null && BigBlueButtonRecordingsPublishedRoles.has(publishTo, BigBlueButtonRecordingsPublishedRoles.all)) { return true; } - return ((administrator || moderator) && BigBlueButtonRecordingsPublishedRoles.has(publishTo, BigBlueButtonRecordingsPublishedRoles.coach)) - || BigBlueButtonRecordingsPublishedRoles.has(publishTo, BigBlueButtonRecordingsPublishedRoles.participant); + if(administrator || moderator) { + return BigBlueButtonRecordingsPublishedRoles.has(publishTo, BigBlueButtonRecordingsPublishedRoles.coach); + } + return BigBlueButtonRecordingsPublishedRoles.has(publishTo, BigBlueButtonRecordingsPublishedRoles.participant); } private boolean isEnded() { diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/PublishRecordingController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/PublishRecordingController.java index 170f54d6efaae5a977ee0d9b30ec561223d6033a..c24a28a1c5ce7a5ebdcd9062dce6d6bb2083e4a5 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/PublishRecordingController.java +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/PublishRecordingController.java @@ -62,8 +62,8 @@ public class PublishRecordingController extends FormBasicController { KeyValues publishToKeyValues = new KeyValues(); publishToKeyValues.add(KeyValues.entry(BigBlueButtonRecordingsPublishedRoles.coach.name(), translate("publish.to.coach"))); publishToKeyValues.add(KeyValues.entry(BigBlueButtonRecordingsPublishedRoles.participant.name(), translate("publish.to.participant"))); - publishToKeyValues.add(KeyValues.entry(BigBlueButtonRecordingsPublishedRoles.guest.name(), translate("publish.to.guest"))); publishToKeyValues.add(KeyValues.entry(BigBlueButtonRecordingsPublishedRoles.all.name(), translate("publish.to.all"))); + publishToKeyValues.add(KeyValues.entry(BigBlueButtonRecordingsPublishedRoles.guest.name(), translate("publish.to.guest"))); publishEl = uifactory.addCheckboxesVertical("publish.to.list", "publish.to.list", formLayout, publishToKeyValues.keys(), publishToKeyValues.values(), 1); BigBlueButtonRecordingsPublishedRoles[] currentRoles = row.getReference().getPublishToEnum(); diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties index d6566a445eef5edb066915396b86e67c8617768d..3411a3f94220ce5894a1936d5f1bbe3c87eb1cd4 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties @@ -82,7 +82,7 @@ meeting.join.button=Meeting beitreten meeting.layout=Darstellung meeting.leadTime=Vorlaufzeit (Min.) meeting.leadTime.explain=Die Vorlaufzeit ist nur f\u00fcr Moderatoren relevant. -meeting.main.presenter=Main presenter +meeting.main.presenter=Hauptmoderator meeting.name=Name meeting.permanent=Online-Termin Planung meeting.permanent.on=Ohne Datum @@ -118,7 +118,7 @@ option.enabled.server=Server aktivieren option.recordingurl=Aufzeichnung URL publish.recording=Publizieren publish.to=Publizieren -publish.to.all=Alle Teilnehmer des Meetings +publish.to.all=Alle Teilnehmer des Meetings (aussen G\u00E4ste) publish.to.guest=G\u00e4ste publish.to.list=Publizieren f\u00fcr: publish.to.coach=Besitzer / Betreuer diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties index 73cea11e866c64001f9705ca3ef0ab941200b4d1..32d588670a39dc0d1d371c4de4a1bbaf8dd4ad46 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties @@ -82,7 +82,7 @@ meeting.join.button=Join the online-meeting meeting.layout=Layout meeting.leadTime=Prep time (min.) meeting.leadTime.explain=Prep time is only relevant for moderators. -meeting.main.presenter=Hauptmoderator +meeting.main.presenter=Main presenter meeting.name=Name meeting.permanent=Online-Meeting scheduling meeting.permanent.on=Without date @@ -118,7 +118,7 @@ option.enabled.server=Activate server option.recordingurl=Recording URL publish.recording=Publish publish.to=Publish -publish.to.all=All meeting's attendees +publish.to.all=All meeting's attendees (without guests) publish.to.list=publish to: publish.to.guest=Guests publish.to.coach=Owners and coaches diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties index 9b2fdea4b72bfe815eda3022511459c5c0f2ab6d..ea534453a3103ac730f9073da04d75fca2ee8c56 100644 --- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties @@ -62,7 +62,7 @@ filter.this.instance=Cet OpenOlat layout.standard=Standard layout.webcam=Meeting webcam meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der. -meeting.creator=\=Cr\u00E9ateur +meeting.creator=Cr\u00E9ateur meeting.day=Date du meeting meeting.deleted=Le meeting a \u00E9t\u00E9 effac\u00E9. meeting.description=Description @@ -121,10 +121,10 @@ option.enabled.server=Activer le serveur option.recordingurl=URL enregistrement publish.recording=Publier publish.to=Publier -publish.to.all=Tous les participants du meeting +publish.to.all=Tous les participants du meeting (hormis invit\u00E9s) publish.to.coach=Propri\u00E9taires et coaches publish.to.guest=Invit\u00E9s -publish.to.list=publi\u00E9 pour\: +publish.to.list=Publi\u00E9 pour\: publish.to.participant=Participants cours / groupe recording.browser.infos=Les enregistrements ne peuvent \u00EAtre vus qu'avec Google Chrome ou Firefox. recording.type.podcast=Podcast diff --git a/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java b/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java index bfc7f5f448fe5f62c19f31212e62f1a74fae4da5..b4c6c9c40aa2360f4015c78711db9703bdd6bea8 100644 --- a/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java +++ b/src/main/java/org/olat/modules/coach/ui/StudentListProvider.java @@ -60,7 +60,6 @@ public class StudentListProvider implements ListProvider { if(contains(searchValue, entry)) { maxEntries--; String key = entry.getIdentityKey().toString(); - String displayKey = null;//TODO username was name String displayText = userManager.getUserDisplayName(entry.getIdentityKey()); receiver.addEntry(key, null, displayText, CSSHelper.CSS_CLASS_USER); } diff --git a/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java b/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java index aef29ab595f5e6ba7d7333b4cdbbf42308281efa..d0872c6a0fbe7efbd0907da9f2fd5660f9227cba 100644 --- a/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java +++ b/src/main/java/org/olat/modules/coach/ui/StudentsTableDataModel.java @@ -47,6 +47,7 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt implements SortableFlexiTableDataModel<StudentStatEntry> { private static final Logger log = Tracing.createLoggerFor(StudentsTableDataModel.class); + private static final Columns[] COLS = Columns.values(); private List<StudentStatEntry> backupList; @@ -92,9 +93,9 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt @Override public Object getValueAt(StudentStatEntry student, int col) { - if(col >= 0 && col < Columns.values().length) { + if(col >= 0 && col < COLS.length) { int countRepo = student.getCountRepo(); - switch(Columns.getValueAt(col)) { + switch(COLS[col]) { case countCourse: return Integer.valueOf(countRepo); case initialLaunch: { if(countRepo == 0) { @@ -134,6 +135,7 @@ public class StudentsTableDataModel extends DefaultFlexiTableDataModel<StudentSt } return new LightedValue(passed, light); } + default: return "ERROR"; } } diff --git a/src/main/java/org/olat/modules/coach/ui/UserSearchForm.java b/src/main/java/org/olat/modules/coach/ui/UserSearchForm.java index 13045f71f7b49468ed15d035b56ae9a019c08c71..9dd499f215eb689287ab1bbef927d05c65a54f76 100644 --- a/src/main/java/org/olat/modules/coach/ui/UserSearchForm.java +++ b/src/main/java/org/olat/modules/coach/ui/UserSearchForm.java @@ -50,7 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class UserSearchForm extends FormBasicController { - private static final String PROPS_IDENTIFIER = UserSearchForm.class.getName(); + private static final String PROPS_IDENTIFIER = UserSearchForm.class.getName(); private static final String[] activeKeys = new String[] { "on" }; private static final String[] activeValues = new String[] { "" }; @@ -84,7 +84,7 @@ public class UserSearchForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout); - login.setVisible(adminProps);//TODO username + login.setVisible(adminProps); userPropertyHandlers = userManager.getUserPropertyHandlersFor(PROPS_IDENTIFIER, adminProps); @@ -139,7 +139,9 @@ public class UserSearchForm extends FormBasicController { @Override protected boolean validateFormLogic(UserRequest ureq) { - return validate() & super.validateFormLogic(ureq); + boolean allOk = super.validateFormLogic(ureq); + allOk &= validate(); + return allOk; } private boolean validate() { diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java b/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java index e50a7b4205d78af19621472654ef31431fc2f764..0d1da581f97d0217eb227520e52a80f5c9145403 100644 --- a/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java +++ b/src/main/java/org/olat/modules/lecture/manager/LectureBlockRollCallDAO.java @@ -852,28 +852,13 @@ public class LectureBlockRollCallDAO { if(StringHelper.containsNonWhitespace(params.getLogin())) { String login = PersistenceHelper.makeFuzzyQueryString(params.getLogin()); - sb.append(" and ("); - if (login.contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append("lower(ident.name) like :login ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append("ident.name like :login"); - } else { - sb.append("lower(ident.name) like :login"); - } - + sb.append(" and ("); + PersistenceHelper.appendFuzzyLike(sb, "ident.name", "login", dbInstance.getDbVendor()); + sb.append(" or "); + PersistenceHelper.appendFuzzyLike(sb, "user.nickName", "login", dbInstance.getDbVendor()); sb.append(" or exists (select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") .append(" where ident.key=auth.identity.key and"); - - if (params.getLogin().contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append(" lower(auth.authusername) like :login ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append(" auth.authusername like :login"); - } else { - sb.append(" lower(auth.authusername) like :login"); - } - + PersistenceHelper.appendFuzzyLike(sb, "auth.authusername", "login", dbInstance.getDbVendor()); sb.append("))"); queryParams.put("login", login); @@ -897,14 +882,8 @@ public class LectureBlockRollCallDAO { } } - if(dbInstance.isMySQL()) { - sb.append(" and user.").append(handler.getName()).append(" like :").append(qName); - } else { - sb.append(" and lower(user.").append(handler.getName()).append(") like :").append(qName); - if(dbInstance.isOracle()) { - sb.append(" escape '\\'"); - } - } + sb.append(" and "); + PersistenceHelper.appendFuzzyLike(sb, "user.".concat(handler.getName()), qName, dbInstance.getDbVendor()); queryParams.put(qName, PersistenceHelper.makeFuzzyQueryString(propValue)); } } diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java index ee7bec4197b65c0b5a35a4c57c699224b6dcc9a2..d10fef867e3a65716931d6e36117f78956bb369e 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesSearchFormController.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.OrganisationModule; @@ -42,6 +43,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.OrganisationRef; import org.olat.core.id.Roles; +import org.olat.core.id.UserConstants; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.lecture.model.LectureStatisticsSearchParameters; @@ -67,9 +69,11 @@ public class LecturesSearchFormController extends FormBasicController { private TextElement login; private TextElement bulkEl; private FormLink searchButton; - private DateChooser startDateEl, endDateEl; + private DateChooser startDateEl; + private DateChooser endDateEl; private FormLayoutContainer privateDatesCont; - private SingleSelection dateTypesEl, publicDatesEl; + private SingleSelection dateTypesEl; + private SingleSelection publicDatesEl; private final boolean admin; private final boolean adminProps; @@ -110,7 +114,14 @@ public class LecturesSearchFormController extends FormBasicController { login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout); login.setVisible(adminProps); - userPropertyHandlers = userManager.getUserPropertyHandlersFor(PROPS_IDENTIFIER, adminProps); + List<UserPropertyHandler> allPropertyHandlers = userManager.getUserPropertyHandlersFor(PROPS_IDENTIFIER, adminProps); + if(adminProps) { + userPropertyHandlers = allPropertyHandlers.stream() + .filter(prop -> !UserConstants.NICKNAME.equals(prop.getName())) + .collect(Collectors.toList()); + } else { + userPropertyHandlers = allPropertyHandlers; + } for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { if (userPropertyHandler != null) { diff --git a/src/main/java/org/olat/modules/opencast/manager/client/GetEventsParams.java b/src/main/java/org/olat/modules/opencast/manager/client/GetEventsParams.java index 16140fee126a0c70eada22c8e9c0cba89756c21c..5fc081111684a1e76759abc7f91cb86183afeb64 100644 --- a/src/main/java/org/olat/modules/opencast/manager/client/GetEventsParams.java +++ b/src/main/java/org/olat/modules/opencast/manager/client/GetEventsParams.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.stream.Collectors; import org.olat.modules.opencast.AuthDelegate; +import org.olat.modules.opencast.AuthDelegate.Type; /** * @@ -33,6 +34,8 @@ import org.olat.modules.opencast.AuthDelegate; */ public class GetEventsParams { + private static final AuthDelegate AUTH_NONE = AuthDelegate.of(Type.None, null); + public enum Filter { title, textFilter @@ -47,7 +50,7 @@ public class GetEventsParams { private String sortParam; private GetEventsParams(Builder builder) { - this.authDelegate = builder.authDelegate; + this.authDelegate = builder.authDelegate != null? builder.authDelegate: AUTH_NONE; if (builder.limit != null) { this.limit = Integer.toString(builder.limit); diff --git a/src/main/java/org/olat/modules/opencast/manager/client/GetSeriesParams.java b/src/main/java/org/olat/modules/opencast/manager/client/GetSeriesParams.java index 2685924d0a33ce4ec95fbf058e986399f63fa4ae..dd1525d6fc8760df1f026ef92c8424c0c936a698 100644 --- a/src/main/java/org/olat/modules/opencast/manager/client/GetSeriesParams.java +++ b/src/main/java/org/olat/modules/opencast/manager/client/GetSeriesParams.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.stream.Collectors; import org.olat.modules.opencast.AuthDelegate; +import org.olat.modules.opencast.AuthDelegate.Type; /** * @@ -33,6 +34,8 @@ import org.olat.modules.opencast.AuthDelegate; */ public class GetSeriesParams { + private static final AuthDelegate AUTH_NONE = AuthDelegate.of(Type.None, null); + public enum Filter { title, textFilter @@ -47,7 +50,7 @@ public class GetSeriesParams { private String sortParam; private GetSeriesParams(Builder builder) { - this.authDelegate = builder.authDelegate; + this.authDelegate = builder.authDelegate != null? builder.authDelegate: AUTH_NONE; if (builder.limit != null) { this.limit = Integer.toString(builder.limit); diff --git a/src/main/java/org/olat/modules/opencast/ui/OpencastAdminController.java b/src/main/java/org/olat/modules/opencast/ui/OpencastAdminController.java index 20d3cc8a35eb774ad153e530bb2bc63e90cf53be..c539730157509dd97345f76b20f1ac050cabe628 100644 --- a/src/main/java/org/olat/modules/opencast/ui/OpencastAdminController.java +++ b/src/main/java/org/olat/modules/opencast/ui/OpencastAdminController.java @@ -191,7 +191,7 @@ public class OpencastAdminController extends FormBasicController { courseNodeSpacerEl.setVisible(enabled); courseNodeEnabledEl.setVisible(enabled); authDelegateTypeEl.setVisible(enabled); - boolean authDelegateRoles = authDelegateTypeEl.isOneSelected() && Type.Roles == Type.valueOf(authDelegateTypeEl.getSelectedValue()); + boolean authDelegateRoles = authDelegateTypeEl.isOneSelected() && Type.Roles == Type.valueOf(authDelegateTypeEl.getSelectedKey()); authDelegateRolesEl.setVisible(enabled && authDelegateRoles); rolesAdminEl.setVisible(enabled); rolesCoachEl.setVisible(enabled); @@ -203,7 +203,7 @@ public class OpencastAdminController extends FormBasicController { if (source == enabledEl) { updateUI(); } else if (source == authDelegateTypeEl) { - boolean authDelegateRoles = authDelegateTypeEl.isOneSelected() && Type.Roles == Type.valueOf(authDelegateTypeEl.getSelectedValue()); + boolean authDelegateRoles = authDelegateTypeEl.isOneSelected() && Type.Roles == Type.valueOf(authDelegateTypeEl.getSelectedKey()); authDelegateRolesEl.setVisible(authDelegateRoles); } else if (source == checkApiConnectionButton) { doCheckApiConnection(); diff --git a/src/main/java/org/olat/modules/opencast/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/opencast/ui/_i18n/LocalStrings_fr.properties index fdd6a02e31538dd8607fa128bf09727ad9267c89..2c2d8e67efc43caf14c93cd6e46b3d485fdebacf 100644 --- a/src/main/java/org/olat/modules/opencast/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/opencast/ui/_i18n/LocalStrings_fr.properties @@ -1,11 +1,24 @@ -#Wed Aug 12 07:23:27 CEST 2020 +#Fri Aug 14 07:01:32 CEST 2020 admin.api.password=Mot de passe API admin.api.url=URL de l'API (LTI) +admin.api.url.example=https\://admin.opencast.example.com/api admin.api.username=Nom d'utilisateur de l'API +admin.auth.delegate.roles=R\u00F4les des autorisations +admin.auth.delegate.type=Autorisation administrator +admin.auth.delegate.type.none=Aucune +admin.auth.delegate.type.roles=R\u00F4les +admin.auth.delegate.type.user=Utilisateur +admin.bbb.enabled=Enregistrements BigBlueButton admin.check.api.connection=Tester la connection \u00E0 l'API +admin.course.node.enabled=\u00C9lement de cours admin.enabled=Module "Opencast" admin.lti.key=Cl\u00E9 LTI admin.lti.secret=Secret LTI +admin.lti.sign.url=URL de la signature LTI +admin.lti.sign.url.example=http\://localhost\:8080/lti +admin.lti.sign.url.help=Pour certaines installations Opencast, l'URL LTI n'est pas utilis\u00E9e pour la validation de la signature LTI. Dans ce cas, vous recevrez un message "Signature non valide pour la m\u00E9thode de signature HMAC-SHA1" au moment de voir le contenu sur le serveur Opencast. Pour \u00E9viter cette erreur, vous pouvez saisir ici une URL alternative pour la validation de la signature. +admin.lti.url=URL LTI +admin.lti.url.example=https\://presentation.opencast.example.com/lti admin.menu.title=Opencast admin.menu.title.alt=Opencast admin.title=Configuration diff --git a/src/main/java/org/olat/registration/PwChangeController.java b/src/main/java/org/olat/registration/PwChangeController.java index be08efa826fd4f4e67b150255e0330077c50d9b6..63d1acb38bb282dcd25cfa18eef2b61d2926ae96 100644 --- a/src/main/java/org/olat/registration/PwChangeController.java +++ b/src/main/java/org/olat/registration/PwChangeController.java @@ -317,8 +317,8 @@ public class PwChangeController extends BasicController { * @return Identity or null if not found. */ private Identity findIdentityByUsernameOrEmail(String emailOrUsername) { - // See if the entered value is a username - Identity identity = securityManager.findIdentityByName(emailOrUsername); + // See if the entered value is the authusername of an authentication + Identity identity = securityManager.findIdentityByLogin(emailOrUsername); if (identity == null) { // Try fallback with email, maybe user used his email address instead identity = userManager.findUniqueIdentityByEmail(emailOrUsername); 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 c23d21797954c4e563fe2093a17d7eb577087c40..c8170428d38a6d52d8a472ecd363ff2c81e20bb9 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_ar.properties @@ -42,7 +42,7 @@ sr.error.disclaimer=\u064A\u062C\u0628 \u0642\u0628\u0648\u0644 \u0634\u0631\u06 sr.error.emailexists=.{0} \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0645\u0639 \u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0644\u0627\u0644\u0643\u062A\u0631\u0648\u0646\u0649 \u0645\u0648\u062C\u0648\u062F \u0628\u0627\u0644\u0641\u0639\u0644\u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0640 sr.error.loginexists=.{0} \u0625\u0630\u0627 \u0643\u0646\u062A \u0627\u0633\u062A\u062E\u062F\u0645\u062A \u0647\u0630\u0627 \u0627\u0644\u0627\u0633\u0645 \u0641\u0649 \u0627\u0644\u062F\u062E\u0648\u0644 \u0625\u0644\u0649 \u0623\u0648\u0644\u0627\u062A \u0645\u0646 \u0642\u0628\u0644\u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0640<br> \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0645\u0648\u062C\u0648\u062F \u0628\u0627\u0644\u0641\u0639\u0644 sr.header=\u0627\u0644\u062A\u0633\u062C\u064A\u0644 -sr.intro=\u0644\u0627 \u064A\u0645\u0643\u0646 \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u0627\u0633\u0645 \u0628\u0639\u062F \u0630\u0644\u0643 <b>\:\u0627\u0646\u062A\u0628\u0627\u0647</b> \u064A\u0631\u062C\u0649 \u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0644\u0644\u0639\u0645\u0644 \u062F\u0627\u062E\u0644 \u0623\u0648\u0644\u0627\u062A +sr.intro=\u0644\u0627 \u064A\u0645\u0643\u0646 \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u0627\u0633\u0645 \u0628\u0639\u062F \u0630\u0644\u0643 sr.login.meantimetaken=\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0645\u0648\u062C\u0648\u062F \u0628\u0627\u0644\u0641\u0639\u0644\u060C \u064A\u0631\u062C\u0649 \u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0633\u0645 \u0622\u062E\u0631. sr.select_language=\u064A\u0631\u062C\u0649 \u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u0644\u063A\u0629 \u0641\u0649 \u0627\u0644\u062A\u0633\u062C\u064A\u0644 \u0648\u062D\u0633\u0627\u0628 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u062F\u0627\u062E\u0644 \u0623\u0648\u0644\u0627\u062A\u060C \u0648\u064A\u0645\u0643\u0646\u0643 \u0645\u0644\u0627\u0626\u0645\u0629 \u0644\u063A\u062A\u0643 \u0641\u0649 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u0649 \u0627\u0644\u062E\u0627\u0635 \u0628\u0643 \u0644\u0627\u062D\u0642\u0627\u064B\u060C \u0648\u0633\u064A\u0645 \u0627\u0631\u0634\u0627\u062F\u0643 \u062E\u0644\u0627\u0644 \u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u062A\u0633\u062C\u064A\u0644. srf.email=\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0644\u0627\u0644\u0643\u062A\u0631\u0648\u0646\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 b46b350f80cabae2849d217880f040901020464e..c1db38f3e65fb8eaea9b9e75cc530d7cced9a11b 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_bg.properties @@ -39,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. 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. 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 15bac82e092da0082dcc515893d2c680fcf6ec00..216eee725607983567eb883b06c97b506420c00e 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_de.properties @@ -55,7 +55,7 @@ sr.error.disclaimer=Sie m\u00FCssen die Nutzungsbestimmungen akzeptieren, um den sr.error.emailexists=Es existiert bereits ein Benutzer mit der gleichen E-Mail-Adresse. Bitte wenden Sie sich an {0}. sr.error.loginexists=Benutzername existiert bereits. <br>Wenn Sie sich schon einmal unter diesem Namen in OLAT registriert haben, melden Sie sich bitte bei {0}. sr.header=Registrierung -sr.intro=W\u00E4hlen Sie einen Benutzernamen, unter welchem Sie in OLAT arbeiten m\u00F6chten. <b>Achtung\:</b> Dieser Name kann nachtr\u00E4glich nicht mehr ge\u00E4ndert werden\! +sr.intro=W\u00E4hlen Sie einen Benutzernamen, unter welchem Sie in OpenOlat arbeiten m\u00F6chten. sr.login.meantimetaken=Der gew\u00E4hlte Benutzername ist bereits registriert. Bitte w\u00E4hlen Sie einen anderen Benutzernamen. sr.select_language=W\u00E4hlen Sie die Sprache f\u00FCr die OLAT Registrierung und Ihr Benutzerkonto. Sie k\u00F6nnen die Sprache sp\u00E4ter in Ihrem Benutzerprofil jederzeit anpassen. Anschliessend werden Sie durch den Registrationprozess gef\u00FChrt. srf.email=E-Mail-Adresse 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 ec33b868ddd8f987152eba32c252027f163aec52..c2681772c63c8ec3877adaa8c4794a04b373b161 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_el.properties @@ -37,7 +37,7 @@ sr.error.disclaimer=\u0398\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03 sr.error.emailexists=\u0388\u03BD\u03B1\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03C0\u03B1\u03C1\u03BF\u03CD\u03C3\u03B1 \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 e-mail \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BA\u03BF\u03B9\u03BD\u03C9\u03BD\u03AE\u03C3\u03C4\u03B5 \u03BC\u03B5 {0}. sr.error.loginexists=\u03A4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7. <br>\u0391\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03CE\u03BD\u03C4\u03B1\u03C2 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C3\u03C4\u03BF OLAT \u03BA\u03B1\u03B9 \u03C0\u03B1\u03BB\u03B1\u03B9\u03CC\u03C4\u03B5\u03C1\u03B1, \u03C0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BA\u03BF\u03B9\u03BD\u03C9\u03BD\u03AE\u03C3\u03C4\u03B5 \u03BC\u03B5 {0}. sr.header=\u0395\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE -sr.intro=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BC\u03B5 \u03C4\u03BF \u03BF\u03C0\u03BF\u03AF\u03BF \u03B8\u03B1 \u03B4\u03BF\u03C5\u03BB\u03B5\u03CD\u03B5\u03C4\u03B5 \u03C3\u03C4\u03BF OLAT.b>Attention\:</b> \u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1\! +sr.intro=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BC\u03B5 \u03C4\u03BF \u03BF\u03C0\u03BF\u03AF\u03BF \u03B8\u03B1 \u03B4\u03BF\u03C5\u03BB\u03B5\u03CD\u03B5\u03C4\u03B5 \u03C3\u03C4\u03BF OpenOlat. sr.login.meantimetaken=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03AE\u03B4\u03B7. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE, \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03AC\u03BB\u03BB\u03BF. sr.select_language=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1 \u03BA\u03B1\u03B9 \u03AD\u03BD\u03B1\u03BD \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03B1\u03C2 \u03C3\u03C4\u03BF OLAT. \u0391\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03CC\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1 \u03C3\u03C4\u03BF \u03C0\u03C1\u03BF\u03C6\u03AF\u03BB \u03C3\u03B1\u03C2. \u03A4\u03CC\u03C4\u03B5 \u03B8\u03B1 \u03C3\u03B1\u03C2 \u03B4\u03BF\u03B8\u03BF\u03CD\u03BD \u03BF\u03B4\u03B7\u03B3\u03AF\u03B5\u03C2 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2. srf.email=\u0394\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 E-mail 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 3195b9daa625f79be288bb230bc922f56a235353..22946305ac77635e908ab6407c4461a9b9c67c20 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_en.properties @@ -54,9 +54,9 @@ sr.dlnok=Deny sr.dlok=Accept sr.error.disclaimer=You have to accept the terms of use in order to finish this registration process. sr.error.emailexists=A user with this e-mail address already exists. Please contact {0}. -sr.error.loginexists=User name already exists. <br>If you have registered using this name in OLAT before, please get in touch with {0}. +sr.error.loginexists=User name already exists. <br>If you have registered using this name in OpenOlat before, please get in touch with {0}. sr.header=Registration -sr.intro=Please choose a user name to work with OLAT. <b>Attention\:</b> This name cannot be changed afterwards\! +sr.intro=Please choose a user name to work with OpenOlat. sr.login.meantimetaken=This user name is already in use. Please choose another one. sr.select_language=Please select a language for your OLAT registration and user account. Later you can still adapt your language in your user profile. You will then be guided through the registration process. srf.email=E-mail address 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 a1551822e38a80819b6bc78b202934a6553722a5..71fc8b30b07c17262a314834affbab691314d69f 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_fr.properties @@ -47,9 +47,9 @@ sr.error.disclaimer=Vous devez accepter les conditions d'utilisation pour conclu sr.error.emailexists=Il existe d\u00E9j\u00E0 un utilisateur avec la m\u00EAme adresse e-mail. Veuillez vous adresser \u00E0 {0}, s.v.p.. sr.error.loginexists=Le nom d'utilisateur existe d\u00E9j\u00E0. <br>Si vous vous avez d\u00E9j\u00E0 inscrit dans OLAT avec ce nom, veuillez vous adresser \u00E0 {0}. sr.header=Enregistrement -sr.intro=Veuillez choisir un nom d'utilisateur sous lequel vous voulez travailler dans OLAT. <br>Attention\:</br> Ce nom ne peut plus \u00EAtre modifi\u00E9 par la suite\! +sr.intro=Veuillez choisir un nom d'utilisateur sous lequel vous voulez travailler dans OpenOlat. sr.login.meantimetaken=Le nom d'utilisateur choisi est d\u00E9j\u00E0 enregistr\u00E9. Veuillez choisir un autre nom d'utilisateur. -sr.select_language=S\u00E9lectionnez la langue pour l'enregistrement \u00E0 OLAT et votre compte d'utilisateur. Vous pouvez adapter la langue plus tard dans votre profil d'utilisateur. Ensuite vous serez guid\u00E9 \u00E0 travers le processus d'enregistrement. +sr.select_language=S\u00E9lectionnez la langue pour l'enregistrement \u00E0 OpenOlat et votre compte d'utilisateur. Vous pouvez adapter la langue plus tard dans votre profil d'utilisateur. Ensuite vous serez guid\u00E9 \u00E0 travers le processus d'enregistrement. srf.email=Adresse e-mail srf.error.blacklist=Le nom d'utilisateur choisi n'a pas \u00E9t\u00E9 accept\u00E9. srf.error.email.empty=L'adresse e-mail ne doit pas \u00EAtre vide. 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 b49c630d89751224cb9d71ff38735fbd9a42b1a0..40dab52ae3abcacfa476940329f5858c2d4fcc6c 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_it.properties @@ -46,7 +46,7 @@ sr.error.disclaimer=Deve accettare le condizioni d'uso per concludere la registr sr.error.emailexists=Esiste gi\u00E0 un utente con il medesimo indirizzo e-mail. Si rivolga a {0}, p.f. sr.error.loginexists=Il nome d'utente esiste gi\u00E0. <br>Se si \u00E8 gi\u00E0 registrata/o con questo nome in OLAT, contatti {0}, p.f. sr.header=Registrazione -sr.intro=Scelga un nome d'utente OLAT. <b>Attenzione\:</b> questo nome non potr\u00E0 pi\u00F9 essere modificato\! +sr.intro=Scelga un nome d'utente OpenOlat. sr.login.meantimetaken=Il nome d'utente scelto \u00E8 gi\u00E0 stato registrato. Scelga un altro nome, p.f. sr.select_language=Selezioni una lingua per questa registrazione OLAT e per il Suo conto d'utente. Potr\u00E0 modificare la lingua pi\u00F9 tardi, nel Suo profilo d'utente. In seguito verr\u00E0 diretta/o alla registrazione. srf.email=Indirizzo e-mail 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 77d64188e1d7212cc9cab5a8b9e8d702d824cbb9..5cf860522a7e56d05dd8fe17df0242b1c954b2f6 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 @@ -41,11 +41,11 @@ sr.dlnok=Weigeren sr.dlok=Accepteren sr.error.disclaimer=U moet de gebruiksvoorwaarden accepteren voordat u het registratieproces kunt be\u00EBindigen. sr.error.emailexists=Er bestaat al een gebruiker met dit e-mailadres. Gelieve {0} te contacteren. -sr.error.loginexists=Gebruikersnaam bestaat al. <br>Als u zich eerder in OLAT geregistreerd heeft met deze naam, gelieve dan contact op te nemen met {0}. +sr.error.loginexists=Gebruikersnaam bestaat al. <br>Als u zich eerder in OpenOlat geregistreerd heeft met deze naam, gelieve dan contact op te nemen met {0}. sr.header=Registratie -sr.intro=Gelieve een gebruikersnaam te kiezen om met OLAT te werken. <b>Opgelet\:</b> Deze naam kan nadien niet gewijzigd worden\! +sr.intro=Gelieve een gebruikersnaam te kiezen om met OpenOlat te werken. sr.login.meantimetaken=Deze gebruikersnaam is al in gebruik. Gelieve een andere te kiezen. -sr.select_language=Gelieve een taal te kiezen voor uw OLAT registratie en gebruikersaccount. U kunt later uw taal nog aanpassen in uw gebruikersprofiel. U zult dan geleid worden door het administratieproces. +sr.select_language=Gelieve een taal te kiezen voor uw OpenOlat registratie en gebruikersaccount. U kunt later uw taal nog aanpassen in uw gebruikersprofiel. U zult dan geleid worden door het administratieproces. srf.email=E-mailadres srf.error.blacklist=De geselecteerde gebruikersnaam werd niet geaccepteerd. srf.error.email.empty=U moet uw e-mailadres invullen. 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 83b88e93a0c35afbf89355baa32f2449abb0b98a..406d433f120ea28058cb84c6665cf92cbf3e8e35 100644 --- a/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/shibboleth/_i18n/LocalStrings_pl.properties @@ -40,11 +40,11 @@ sr.dlnok=Deny sr.dlok=Accept sr.error.disclaimer=You have to accept the terms of use in order to finish this registration process. sr.error.emailexists=A user with this e-mail address already exists. Please contact {0}. -sr.error.loginexists=User name already exists. <br>If you have registered using this name in OLAT before, please get in touch with {0}. +sr.error.loginexists=User name already exists. <br>If you have registered using this name in OpenOlat before, please get in touch with {0}. sr.header=Registration -sr.intro=Please choose a user name to work with OLAT. <b>Attention\:</b> This name cannot be changed afterwards\! +sr.intro=Please choose a user name to work with OpenOlat. sr.login.meantimetaken=This user name is already in use. Please choose another one. -sr.select_language=Please select a language for your OLAT registration and user account. Later you can still adapt your language in your user profile. You will then be guided through the registration process. +sr.select_language=Please select a language for your OpenOlat registration and user account. Later you can still adapt your language in your user profile. You will then be guided through the registration process. srf.email=E-mail address srf.error.blacklist=The selected user name has not been accepted. srf.error.email.empty=You have to fill in your e-mail address. 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 bdce5df907e30717e5b92832dfb97c2f81630a4d..b63011c4b65a8c51d1f889aca3bab29034d33abb 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 @@ -45,11 +45,11 @@ sr.dlnok=Negar sr.dlok=Aceitar sr.error.disclaimer=Voc\u00EA tem que aceitar os termos de uso, a fim de concluir este processo de registo. sr.error.emailexists=Um usu\u00E1rio com este endere\u00E7o de e-mail j\u00E1 existe. Entre em contato com {0}. -sr.error.loginexists=Nome de usu\u00E1rio j\u00E1 existe. <br>Se voc\u00EA tiver registrado usando esse nome no OLAT antes, por favor entrar em contato com {0}. +sr.error.loginexists=Nome de usu\u00E1rio j\u00E1 existe. <br>Se voc\u00EA tiver registrado usando esse nome no OpenOlat antes, por favor entrar em contato com {0}. sr.header=Registro -sr.intro=Por favor, escolha um nome de usu\u00E1rio para trabalhar com OLAT. <b>Aten\u00E7\u00E3o\:</b> Este nome n\u00E3o pode ser alterado mais tarde\! +sr.intro=Por favor, escolha um nome de usu\u00E1rio para trabalhar com OpenOlat. sr.login.meantimetaken=Este nome de usu\u00E1rio j\u00E1 est\u00E1 em uso. Por favor escolha outro. -sr.select_language=Por favor, selecione um idioma para o seu registo OLAT e conta de usu\u00E1rio. Mais tarde, voc\u00EA ainda pode configurar seu idioma em seu perfil de usu\u00E1rio. Voc\u00EA ent\u00E3o ser\u00E1 guiado atrav\u00E9s do processo de registro. +sr.select_language=Por favor, selecione um idioma para o seu registo OpenOlat e conta de usu\u00E1rio. Mais tarde, voc\u00EA ainda pode configurar seu idioma em seu perfil de usu\u00E1rio. Voc\u00EA ent\u00E3o ser\u00E1 guiado atrav\u00E9s do processo de registro. srf.email=Endere\u00E7o de E-mail srf.error.blacklist=O nome de usu\u00E1rio selecionado n\u00E3o foi aceito. srf.error.email.empty=Voc\u00EA tem que preencher o seu endere\u00E7o de e-mail. 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 330840f64bb91813773379c837e56955a84d38fa..c9112407733b2075c6a4175f45d1a5499cfd8bef 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 @@ -39,7 +39,7 @@ sr.error.disclaimer=\u60A8\u9700\u8981\u63A5\u53D7\u4F7F\u7528\u534F\u8BAE\u4EE5 sr.error.emailexists=\u4F7F\u7528\u6B64e-mail\u5730\u5740\u7684\u7528\u6237\u5DF2\u7ECF\u5B58\u5728\u3002\u8BF7\u8054\u7CFB{0}. sr.error.loginexists=\u7528\u6237\u540D\u5DF2\u5B58\u5728\u3002<br>\u5982\u679C\u60A8\u4E4B\u524D\u5DF2\u4F7F\u7528\u6B64\u7528\u6237\u540D\u5728OLAT\u7CFB\u7EDF\u4E2D\u6CE8\u518C\u8FC7\uFF0C\u8BF7\u8054\u7CFB{0}. sr.header=\u6CE8\u518C -sr.intro=\u8BF7\u9009\u62E9\u4E00\u4E2A\u5728OLAT\u4E2D\u4F7F\u7528\u7684\u7528\u6237\u540D\u3002<b>\u6CE8\u610F\uFF1A</b>\u6B64\u7528\u6237\u540D\u4EE5\u540E\u4E0D\u80FD\u8FDB\u884C\u66F4\u6539\uFF01 +sr.intro=\u8BF7\u9009\u62E9\u4E00\u4E2A\u5728OLAT\u4E2D\u4F7F\u7528\u7684\u7528\u6237\u540D\u3002 sr.login.meantimetaken=\u6B64\u7528\u6237\u540D\u5DF2\u5728\u4F7F\u7528\u4E2D\u3002\u8BF7\u9009\u62E9\u53E6\u4E00\u4E2A\u3002 sr.select_language=\u8BF7\u4E3A\u60A8\u7684OLAT\u6CE8\u518C\u548C\u7528\u6237\u8D26\u6237\u9009\u62E9\u4E00\u79CD\u8BED\u8A00\u3002\u4E4B\u540E\u60A8\u4ECD\u53EF\u4EE5\u5728\u4F60\u7684\u4E2A\u4EBA\u7B80\u4ECB\u4E2D\u4FEE\u6539\u6240\u4F7F\u7528\u7684\u8BED\u8A00\u3002\u60A8\u4F1A\u88AB\u5F15\u5BFC\u5B8C\u6210\u6574\u4E2A\u6CE8\u518C\u8FC7\u7A0B\u3002 srf.email=E-mail\u5730\u5740 diff --git a/src/main/java/org/olat/user/DisplayPortraitManager.java b/src/main/java/org/olat/user/DisplayPortraitManager.java index 791d515d3e563afed5d9bcea006ab523f65f1c79..d5c57fffcaf97857c3efc0dc0e16f80c564257db 100644 --- a/src/main/java/org/olat/user/DisplayPortraitManager.java +++ b/src/main/java/org/olat/user/DisplayPortraitManager.java @@ -129,8 +129,8 @@ public class DisplayPortraitManager implements UserDataDeletable, UserDataExport return getPortraitResource(identityKey, LOGO_SMALL_FILENAME); } - public MediaResource getBigLogoResource(String String) { - return getPortraitResource(String, LOGO_BIG_FILENAME); + public MediaResource getBigLogoResource(String username) { + return getPortraitResource(username, LOGO_BIG_FILENAME); } public MediaResource getBigLogoResource(Long identityKey) { return getPortraitResource(identityKey, LOGO_BIG_FILENAME); @@ -394,11 +394,11 @@ public class DisplayPortraitManager implements UserDataDeletable, UserDataExport @Override public void deleteUserData(Identity identity, String newDeletedUserName) { - File portraitDir = getPortraitDir(identity.getName(), false); + File portraitDir = getPortraitDir(identity, false); if(portraitDir.exists()) { FileUtils.deleteDirsAndFiles(portraitDir, true, true); } - log.debug("Homepage-config file deleted for identity=" + identity); + log.debug("Homepage-config file deleted for identity={}", identity.getKey()); } @Override public String getExporterID() { diff --git a/src/main/java/org/olat/user/PreferencesFormController.java b/src/main/java/org/olat/user/PreferencesFormController.java index 5da21938aeeed848f89b954d96da91fcbc5d3adc..a7758c48e2484b6549bcacb51a3621d3060ad965 100644 --- a/src/main/java/org/olat/user/PreferencesFormController.java +++ b/src/main/java/org/olat/user/PreferencesFormController.java @@ -27,6 +27,7 @@ import java.util.Set; import org.olat.admin.user.SystemRolesAndRightsController; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.BaseSecurityModule; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -63,7 +64,12 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class PreferencesFormController extends FormBasicController { private Identity tobeChangedIdentity; - private SingleSelection language, charset, notificationInterval, mailSystem; + + private SingleSelection charset; + private SingleSelection language; + private SingleSelection mailSystem; + private SingleSelection notificationInterval; + private static final String[] mailIntern = new String[]{"intern.only","send.copy"}; @Autowired @@ -77,6 +83,8 @@ public class PreferencesFormController extends FormBasicController { @Autowired private BaseSecurity securityManager; @Autowired + private BaseSecurityModule securityModule; + @Autowired private NotificationsManager notificiationMgr; /** @@ -132,9 +140,13 @@ public class PreferencesFormController extends FormBasicController { // load preferences Preferences prefs = tobeChangedIdentity.getUser().getPreferences(); - + // Username - StaticTextElement username = uifactory.addStaticTextElement("form.username", tobeChangedIdentity.getName(), formLayout); + String name = securityManager.findAuthenticationName(tobeChangedIdentity); + if(!StringHelper.containsNonWhitespace(name) && !securityModule.isIdentityNameAutoGenerated()) { + name = tobeChangedIdentity.getName(); + } + StaticTextElement username = uifactory.addStaticTextElement("form.username", name, formLayout); username.setElementCssClass("o_sel_home_settings_username"); username.setEnabled(false); @@ -227,8 +239,8 @@ public class PreferencesFormController extends FormBasicController { final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("button_layout", getTranslator()); formLayout.add(buttonLayout); buttonLayout.setElementCssClass("o_sel_home_settings_prefs_buttons"); - uifactory.addFormSubmitButton("submit", buttonLayout); uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl()); + uifactory.addFormSubmitButton("submit", buttonLayout); } @Override diff --git a/src/main/java/org/olat/user/restapi/UserVOFactory.java b/src/main/java/org/olat/user/restapi/UserVOFactory.java index a773f29bcd5d402146c1f8273d4803277d4300b9..242b73773bc76b04d8ddc40032e1b54df4ea15ec 100644 --- a/src/main/java/org/olat/user/restapi/UserVOFactory.java +++ b/src/main/java/org/olat/user/restapi/UserVOFactory.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -33,6 +34,7 @@ import java.util.Locale; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; +import org.olat.basesecurity.BaseSecurityModule; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; @@ -86,7 +88,7 @@ public class UserVOFactory { UserVO userVO = new UserVO(); User user = identity.getUser(); userVO.setKey(identity.getKey()); - if(identity != null) { + if(identity != null && !CoreSpringFactory.getImpl(BaseSecurityModule.class).isIdentityNameAutoGenerated()) { userVO.setLogin(identity.getName()); } userVO.setExternalId(identity.getExternalId()); @@ -100,7 +102,7 @@ public class UserVOFactory { try(InputStream input = new FileInputStream(portrait)) { byte[] datas = IOUtils.toByteArray(input); byte[] data64 = Base64.encodeBase64(datas); - userVO.setPortrait(new String(data64, "UTF8")); + userVO.setPortrait(new String(data64, StandardCharsets.UTF_8)); } catch (IOException e) { log.error("", e); } diff --git a/src/main/java/org/olat/user/restapi/UserWebService.java b/src/main/java/org/olat/user/restapi/UserWebService.java index 96937cb82c91cd687890b0f1896a81147702bda9..a1b2e1905c45a1abb46cb7d18305f79017480f93 100644 --- a/src/main/java/org/olat/user/restapi/UserWebService.java +++ b/src/main/java/org/olat/user/restapi/UserWebService.java @@ -191,7 +191,7 @@ public class UserWebService { @Content(mediaType = "application/xml", array = @ArraySchema(schema = @Schema(implementation = UserVO.class))) }) @ApiResponse(responseCode = "401", description = "The roles of the authenticated user are not sufficient") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - public Response getUserListQuery(@QueryParam("login") String login, + public Response getUserListQuery(@QueryParam("login") String login, @QueryParam("externalId") String externalId, @QueryParam("authProvider") String authProvider, @QueryParam("authUsername") String authUsername, @QueryParam("statusVisibleLimit") String statusVisibleLimit, @QueryParam("visibleStatus") @DefaultValue("0") Integer visibleStatus, @@ -247,7 +247,13 @@ public class UserWebService { } else if (visibleStatus != 0) { status = visibleStatus; } - identities = securityManager.getIdentitiesByPowerSearch(login, userProps, true, null, authProviders, null, null, null, null, status); + + SearchIdentityParams searchParams = new SearchIdentityParams(login, userProps, true, + null, authProviders, null, null, null, null, status); + if(StringHelper.containsNonWhitespace(externalId)) { + searchParams.setExternalId(externalId); + } + identities = securityManager.getIdentitiesByPowerSearch(searchParams, 0, -1); } int count = 0; diff --git a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql index fb3b2fa6aa6a5245e6d19c8f2361588339bfdcad..fdd3b6f7beb8fb27ef489ad1e6c76e2367ef4af8 100644 --- a/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql +++ b/src/main/resources/database/mysql/alter_15_1_x_to_15_2_0.sql @@ -1,5 +1,21 @@ alter table o_user add column u_nickname varchar(255); +drop view o_bs_identity_short_v; +create view o_bs_identity_short_v as ( + select + ident.id as id_id, + ident.name as id_name, + ident.external_id as id_external, + ident.lastlogin as id_lastlogin, + ident.status as id_status, + us.user_id as us_id, + us.u_firstname as first_name, + us.u_lastname as last_name, + us.u_nickname as nick_name, + us.u_email as email + from o_bs_identity as ident + inner join o_user as us on (ident.id = us.fk_identity) +); -- BigBlueButton create table o_bbb_attendee ( diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 8aa1db8c8d391d475781d5d049efd0764ef6e649..5e4256bc4fad84cc81aee400509986a46da24a4a 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -3130,11 +3130,13 @@ create view o_bs_identity_short_v as ( select ident.id as id_id, ident.name as id_name, + ident.external_id as id_external, ident.lastlogin as id_lastlogin, ident.status as id_status, us.user_id as us_id, us.u_firstname as first_name, us.u_lastname as last_name, + us.u_nickname as nick_name, us.u_email as email from o_bs_identity as ident inner join o_user as us on (ident.id = us.fk_identity) diff --git a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql index c828293c1782b4d894b6c40c00f0e571a36ae0b1..84c2a3397ff6015e9f3920c0a5233e851283eff3 100644 --- a/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql +++ b/src/main/resources/database/oracle/alter_15_1_x_to_15_2_0.sql @@ -1,5 +1,22 @@ alter table o_user add u_nickname varchar2(255 char); +drop view o_bs_identity_short_v; +create view o_bs_identity_short_v as ( + select + ident.id as id_id, + ident.name as id_name, + ident.external_id as id_external, + ident.lastlogin as id_lastlogin, + ident.status as id_status, + us.user_id as us_id, + us.u_firstname as first_name, + us.u_lastname as last_name, + us.u_nickname as nick_name, + us.u_email as email + from o_bs_identity ident + inner join o_user us on (ident.id = us.fk_identity) +); + -- BigBlueButton create table o_bbb_attendee ( diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 2fca15fa30c20c5607e9503c1faf11c3dcd1d672..30d2e6129cbfed22381c847b50403d0dc366fb38 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -3211,11 +3211,13 @@ create view o_bs_identity_short_v as ( select ident.id as id_id, ident.name as id_name, + ident.external_id as id_external, ident.lastlogin as id_lastlogin, ident.status as id_status, us.user_id as us_id, us.u_firstname as first_name, us.u_lastname as last_name, + us.u_nickname as nick_name, us.u_email as email from o_bs_identity ident inner join o_user us on (ident.id = us.fk_identity) diff --git a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql index ef307a74c64d598fa18d6d84f1d6bd1eb4348928..c5842cbe3b40e4f882339e8ace94c54069ac8d67 100644 --- a/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql +++ b/src/main/resources/database/postgresql/alter_15_1_x_to_15_2_0.sql @@ -1,5 +1,21 @@ alter table o_user add column u_nickname varchar(255); +drop view o_bs_identity_short_v; +create view o_bs_identity_short_v as ( + select + ident.id as id_id, + ident.name as id_name, + ident.external_id as id_external, + ident.lastlogin as id_lastlogin, + ident.status as id_status, + us.user_id as us_id, + us.u_firstname as first_name, + us.u_lastname as last_name, + us.u_nickname as nick_name, + us.u_email as email + from o_bs_identity as ident + inner join o_user as us on (ident.id = us.fk_identity) +); -- BigBlueButton create table o_bbb_attendee ( diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 151cc376f0f1576bddfdcc27eadb7dc748425a45..3fa447c61e9be7c15f9a68d9b225c0aa60b8228f 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -3152,11 +3152,13 @@ create view o_bs_identity_short_v as ( select ident.id as id_id, ident.name as id_name, + ident.external_id as id_external, ident.lastlogin as id_lastlogin, ident.status as id_status, us.user_id as us_id, us.u_firstname as first_name, us.u_lastname as last_name, + us.u_nickname as nick_name, us.u_email as email from o_bs_identity as ident inner join o_user as us on (ident.id = us.fk_identity) diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 94bb099a1a0c2a5afdf1239533b2c31daaf55538..d5e0ecd410d87fc1b8da249ad52c8a901bd42afc 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1234,6 +1234,7 @@ ldap.attributename.useridentifyer=sAMAccountName ldap.attributename.email=mail ldap.attributename.firstName=givenName ldap.attributename.lastName=sn +ldap.attributename.nickName=${ldap.attributename.useridentifyer} # Attribute used as username to log in. Note: the configured login attribute MUST be one of the mapped attributes below, e.g. genericTextProperty1 # If the login attribute should not be visible in OO, then disable the OO user property in all contexts. ldap.login.attribute=${ldap.attributename.useridentifyer} diff --git a/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java index de163287faeba94b563e68ae16f42dbaa00da1a6..d33831f52003f3af1100f97c3ae3495fc2fb6e6b 100644 --- a/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java +++ b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java @@ -304,8 +304,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase { // authentication provider search String[] authProviders = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib"}; - String[] authProvidersInvalid = { "nonexist" };// max length 8 ! - String[] authProvidersAll = { BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib", null }; + String[] authProvidersInvalid = { "nonexist" };// max length 8 ! List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, authProviders, null, null, null, null, null); Assert.assertFalse(results.isEmpty()); @@ -364,21 +363,6 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase { Assert.assertFalse("Found no results", results.isEmpty()); checkIdentitiesAreInGroups(results, groups1); checkIdentitiesHasAuthProvider(results,authProviders ); - - //TODO username - /* - results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, authProvidersAll, before, null, null, null, null); - Assert.assertTrue(results.contains(ident)); - Assert.assertTrue(results.contains(ident2)); - results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, authProvidersAll, before, null); - Assert.assertTrue(results.contains(ident)); - Assert.assertTrue(results.contains(ident2)); - - results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, authProvidersAll, null, before, null, null, null); - Assert.assertTrue(results.isEmpty()); - results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, authProvidersAll, null, before); - Assert.assertTrue(results.isEmpty()); - */ } @Test diff --git a/src/test/java/org/olat/basesecurity/manager/AuthenticationDAOTest.java b/src/test/java/org/olat/basesecurity/manager/AuthenticationDAOTest.java index 722c3b224e3d43712170ea436ce81476d9105be7..eb116d908e5f8e36009ec54170264f3cd88f6f33 100644 --- a/src/test/java/org/olat/basesecurity/manager/AuthenticationDAOTest.java +++ b/src/test/java/org/olat/basesecurity/manager/AuthenticationDAOTest.java @@ -70,6 +70,17 @@ public class AuthenticationDAOTest extends OlatTestCase { Assert.assertEquals(newToken, updatedAuth.getCredential()); } + @Test + public void getAuthenticationIdentityProvider() { + IdentityWithLogin ident = JunitTestHelper.createAndPersistRndUser("authdao-1-"); + dbInstance.commitAndCloseSession(); + + //check if the new token was saved + Authentication authentication = authenticationDao.getAuthentication(ident.getIdentity(), "OLAT"); + Assert.assertEquals(ident.getIdentity(), authentication.getIdentity()); + Assert.assertEquals(ident.getLogin(), authentication.getAuthusername()); + } + @Test public void getIdentitiesWithAuthentication() { String token = UUID.randomUUID().toString(); @@ -142,6 +153,19 @@ public class AuthenticationDAOTest extends OlatTestCase { Assert.assertEquals(ident.getIdentity(), olatAuthentications.get(0).getIdentity()); } + @Test + public void getAuthenticationsByProvider() { + IdentityWithLogin ident = JunitTestHelper.createAndPersistRndUser("authdao-2-"); + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(ident); + + List<Authentication> olatAuthentications = authenticationDao.getAuthentications("OLAT"); + Assert.assertNotNull(olatAuthentications); + for(Authentication authentication:olatAuthentications) { + Assert.assertEquals("OLAT", authentication.getProvider()); + } + } + @Test public void getAuthenticationsByAuthusername_providersList() { String token = UUID.randomUUID().toString(); diff --git a/src/test/java/org/olat/ldap/LDAPLoginTest.java b/src/test/java/org/olat/ldap/LDAPLoginTest.java index b9eed1f6e86e8367055b6e8bb176e432d085839d..9bd88973d6e4942ee5878e27c1e8170bb7273dc9 100644 --- a/src/test/java/org/olat/ldap/LDAPLoginTest.java +++ b/src/test/java/org/olat/ldap/LDAPLoginTest.java @@ -33,10 +33,8 @@ import org.zapodot.junit.ldap.EmbeddedLdapRuleBuilder; /** - * Description:<br> - * LDAP junit tests - * - * please import "olattest.ldif" into your configured LDAP directory + * Low level LDAP authentication unit tests. this test must happend + * before LDAPLoginManagerTest (it will do a sync). * * <P> * Initial Date: June 30, 2008 <br> @@ -48,6 +46,8 @@ public class LDAPLoginTest extends OlatTestCase { private LDAPLoginManager ldapManager; @Autowired private LDAPLoginModule ldapLoginModule; + @Autowired + private LDAPSyncConfiguration syncConfiguration; @Rule public EmbeddedLdapRule embeddedLdapRule = EmbeddedLdapRuleBuilder @@ -67,7 +67,7 @@ public class LDAPLoginTest extends OlatTestCase { } @Test - public void testUserBind() throws Exception { + public void userBind() throws Exception { Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); LDAPError errors = new LDAPError(); @@ -99,4 +99,21 @@ public class LDAPLoginTest extends OlatTestCase { Assert.assertNull(attrs); Assert.assertEquals("Username and password must be selected", errors.get()); } + + @Test + public void userBindLoginWithAlternativeLoginAttribute() throws Exception { + Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); + String currentLoginAttr = syncConfiguration.getLdapUserLoginAttribute(); + + // use SN as login attribute + syncConfiguration.setLdapUserLoginAttribute("sn"); + + LDAPError errors = new LDAPError(); + Attributes attrs = ldapManager.bindUser("Forster", "olat", errors); + Assert.assertNotNull(attrs); + Assert.assertEquals("Forster", attrs.get("sn").get()); + Assert.assertTrue(errors.isEmpty()); + + syncConfiguration.setLdapUserLoginAttribute(currentLoginAttr); + } } diff --git a/src/test/java/org/olat/ldap/junittestdata/olattest.ldif b/src/test/java/org/olat/ldap/junittestdata/olattest.ldif index 7a590048b0b971d800c557a7a4abcfd04817e59a..21c3f3d57f5196cb495f519f3d7e7aa11593674d 100644 --- a/src/test/java/org/olat/ldap/junittestdata/olattest.ldif +++ b/src/test/java/org/olat/ldap/junittestdata/olattest.ldif @@ -133,4 +133,93 @@ uid: krass userpassword:: e1NIQX1SWEhpU0lWZGN1SU1EdVNiVCtaaFpOcWFwYWs9 modifyTimestamp: 20100630180000Z +dn: uid=dforster,ou=person,dc=olattest,dc=org +objectClass: organizationalPerson +objectClass: person +objectClass: inetOrgPerson +objectClass: top +cn: Dalia Forster +givenname: Dalia +labeleduri: https://www.openolat.com/dforster +mail: dforster@openolat.com +o: Informatik +sn: Forster +uid: dforster +userPassword: olat +modifyTimestamp: 20100630180000Z + +dn: uid=sramljak,ou=person,dc=olattest,dc=org +objectClass: organizationalPerson +objectClass: person +objectClass: inetOrgPerson +objectClass: top +cn: Sandy Ramljak +givenname: Sandy +labeleduri: https://www.openolat.com/sramljak +mail: sramljak@openolat.com +o: Informatik +sn: Ramljak +uid: sramljak +userPassword: olat +modifyTimestamp: 20100630180000Z + +dn: uid=cguerrera,ou=person,dc=olattest,dc=org +objectClass: organizationalPerson +objectClass: person +objectClass: inetOrgPerson +objectClass: top +cn: Carmen Guerrera +givenname: Carmen +labeleduri: https://www.openolat.com/cguerrera +mail: cguerrera@openolat.com +o: Informatik +sn: Guerrera +uid: cguerrera +userPassword: olat +modifyTimestamp: 20100630180000Z + +dn: uid=lsalathe,ou=person,dc=olattest,dc=org +objectClass: organizationalPerson +objectClass: person +objectClass: inetOrgPerson +objectClass: top +cn: Leyla Salathe +givenname: Leyla +labeleduri: https://www.openolat.com/lsalathe +mail: lsalathe@openolat.com +o: Informatik +sn: Salathe +uid: lsalathe +userPassword: olat +modifyTimestamp: 20100630180000Z + +dn: uid=ahentschel,ou=person,dc=olattest,dc=org +objectClass: organizationalPerson +objectClass: person +objectClass: inetOrgPerson +objectClass: top +cn: Alessandro Hentschel +givenname: Alessandro +labeleduri: https://www.openolat.com/ahentschel +mail: ahentschel@openolat.com +o: Informatik +sn: Hentschel +uid: ahentschel +userPassword: olat +modifyTimestamp: 20100630180000Z + + + + + + + + + + + + + + + diff --git a/src/test/java/org/olat/ldap/manager/LDAPLoginManagerTest.java b/src/test/java/org/olat/ldap/manager/LDAPLoginManagerTest.java index a681c79c81f72b5a53afd9fab1b95567f6987371..a8bbc666384c147c9dfd3ac7c4e616f2dc31bc7c 100644 --- a/src/test/java/org/olat/ldap/manager/LDAPLoginManagerTest.java +++ b/src/test/java/org/olat/ldap/manager/LDAPLoginManagerTest.java @@ -20,23 +20,36 @@ package org.olat.ldap.manager; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; import javax.naming.directory.Attributes; +import javax.naming.ldap.LdapContext; import org.junit.Assert; import org.junit.Assume; +import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; +import org.junit.runners.MethodSorters; import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.model.FindNamedIdentity; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.services.webdav.manager.WebDAVAuthManager; import org.olat.core.id.Identity; +import org.olat.core.id.User; +import org.olat.core.id.UserConstants; +import org.olat.core.util.Encoder.Algorithm; import org.olat.ldap.LDAPError; import org.olat.ldap.LDAPLoginManager; import org.olat.ldap.LDAPLoginModule; +import org.olat.ldap.LDAPSyncConfiguration; import org.olat.ldap.ui.LDAPAuthenticationController; +import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; @@ -53,6 +66,7 @@ import com.unboundid.ldap.sdk.ModificationType; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class LDAPLoginManagerTest extends OlatTestCase { @Autowired @@ -60,11 +74,15 @@ public class LDAPLoginManagerTest extends OlatTestCase { @Autowired private UserManager userManager; @Autowired + private BaseSecurity securityManager; + @Autowired private LDAPLoginManager ldapManager; @Autowired private LDAPLoginModule ldapLoginModule; @Autowired - private BaseSecurity securityManager; + private BaseSecurityModule securityModule; + @Autowired + private LDAPSyncConfiguration syncConfiguration; @Rule public EmbeddedLdapRule embeddedLdapRule = EmbeddedLdapRuleBuilder @@ -75,18 +93,72 @@ public class LDAPLoginManagerTest extends OlatTestCase { .bindingToPort(1389) .build(); + /** + * a to be the first to be called. + */ @Test - public void syncUsers() { + public void aSyncUsers() { Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); LDAPError errors = new LDAPError(); boolean allOk = ldapManager.doBatchSync(errors); Assert.assertTrue(allOk); - + + // historic Identity identity = userManager.findUniqueIdentityByEmail("hhuerlimann@openolat.com"); Assert.assertNotNull(identity); } + @Test + public void getIdentitiesDeletedInLdap() { + Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); + Identity orphan = JunitTestHelper.createAndPersistIdentityAsRndUser("ldap-orphan"); + securityManager.createAndPersistAuthentication(orphan, LDAPAuthenticationController.PROVIDER_LDAP, + UUID.randomUUID().toString(), null, null); + dbInstance.commitAndCloseSession(); + + LdapContext ctx = ldapManager.bindSystem(); + List<Identity> identities = ldapManager.getIdentitiesDeletedInLdap(ctx); + + Assert.assertNotNull(identities); + Assert.assertTrue(identities.contains(orphan)); + + // historic + Identity identity1 = userManager.findUniqueIdentityByEmail("hhuerlimann@openolat.com"); + Assert.assertFalse(identities.contains(identity1)); + Identity identity2 = userManager.findUniqueIdentityByEmail("ahentschel@openolat.com"); + Assert.assertFalse(identities.contains(identity2)); + } + + @Test + public void doSyncSingleUserWithLoginAttribute() throws LDAPException { + Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); + + // sync single user + Identity identity = userManager.findUniqueIdentityByEmail("ahentschel@openolat.com"); + Assert.assertNotNull(identity); + Assert.assertNotEquals("ahentschel", identity.getName()); + + // make a change + String dn = "uid=ahentschel,ou=person,dc=olattest,dc=org"; + List<Modification> modifications = new ArrayList<>(); + modifications.add(new Modification(ModificationType.REPLACE, "sn", "Herschell")); + embeddedLdapRule.ldapConnection().modify(dn, modifications); + + // simple sync + ldapManager.doSyncSingleUserWithLoginAttribute(identity); + dbInstance.commitAndCloseSession(); + + Identity reloadIdentity = securityManager.loadIdentityByKey(identity.getKey()); + Assert.assertNotNull(reloadIdentity); + Assert.assertNotEquals("ahentschel", reloadIdentity.getName()); + Assert.assertEquals(identity, reloadIdentity); + Assert.assertEquals("Alessandro", reloadIdentity.getUser().getFirstName()); + Assert.assertEquals("Herschell", reloadIdentity.getUser().getLastName()); + Assert.assertEquals("ahentschel@openolat.com", reloadIdentity.getUser().getEmail()); + Assert.assertEquals("ahentschel", reloadIdentity.getUser().getProperty(UserConstants.NICKNAME, null)); + } + @Test public void testUserBindDigest() throws Exception { Assume.assumeTrue(ldapLoginModule.isLDAPEnabled()); @@ -191,5 +263,99 @@ public class LDAPLoginManagerTest extends OlatTestCase { Authentication validLdapAuthentication = securityManager.findAuthentication(identity, LDAPAuthenticationController.PROVIDER_LDAP); Assert.assertNotNull(validLdapAuthentication); } + + @Test + public void findIdentityByLdapAuthentication() { + LDAPError ldapError = new LDAPError(); + + // use SN as login attribute + String currentLoginAttr = syncConfiguration.getLdapUserLoginAttribute(); + syncConfiguration.setLdapUserLoginAttribute("sn"); + + Attributes attrs = ldapManager.bindUser("Ramljak", "olat", ldapError); + Assert.assertNotNull(attrs); + + LDAPError errors = new LDAPError(); + Identity identity = ldapManager.findIdentityByLdapAuthentication(attrs, errors); + Assert.assertNotNull(identity); + Assert.assertEquals("Ramljak", identity.getUser().getLastName()); + + syncConfiguration.setLdapUserLoginAttribute(currentLoginAttr); + } + + @Test + public void findIdentityByLdapAuthenticationConvertFromOlat() { + LDAPError ldapError = new LDAPError(); + + // Take an LDAP user, delete her LDAP authentication + List<String> firstLastName = Collections.singletonList("Carmen Guerrera"); + List<FindNamedIdentity> foundIdentities = securityManager.findIdentitiesBy(firstLastName); + Assert.assertEquals(1, foundIdentities.size()); + + Identity identity = foundIdentities.get(0).getIdentity(); + Authentication authentication = securityManager.findAuthentication(identity, LDAPAuthenticationController.PROVIDER_LDAP); + Assert.assertNotNull(authentication); + securityManager.deleteAuthentication(authentication); + securityManager.createAndPersistAuthentication(identity, "OLAT", "cguerrera", "secret", Algorithm.sha512); + dbInstance.commitAndCloseSession(); + + // convert users to LDAP + boolean currentConvertExistingLocalUsers = ldapLoginModule.isConvertExistingLocalUsersToLDAPUsers(); + ldapLoginModule.setConvertExistingLocalUsersToLDAPUsers(true); + + // use uid as login attribute + Attributes attrs = ldapManager.bindUser("cguerrera", "olat", ldapError); + Assert.assertNotNull(attrs); + + LDAPError errors = new LDAPError(); + Identity convertedIdentity = ldapManager.findIdentityByLdapAuthentication(attrs, errors); + Assert.assertNotNull(convertedIdentity); + Assert.assertEquals("Guerrera", convertedIdentity.getUser().getLastName()); + + // revert configuration + ldapLoginModule.setConvertExistingLocalUsersToLDAPUsers(currentConvertExistingLocalUsers); + } + + @Test + public void findIdentityByLdapAuthenticationConvertFromIdentityName() { + // Take an LDAP user, delete her LDAP authentication + List<String> firstLastName = Collections.singletonList("Leyla Salathe"); + List<FindNamedIdentity> foundIdentities = securityManager.findIdentitiesBy(firstLastName); + List<Identity> deleteList = foundIdentities.stream() + .map(FindNamedIdentity::getIdentity) + .collect(Collectors.toList()); + ldapManager.deleteIdentities(deleteList, null); + dbInstance.commitAndCloseSession(); + + String currentIdentityNameGenerator = securityModule.getIdentityName(); + securityModule.setIdentityName("manual"); + + // Create the user without OLAT login + User user = userManager.createUser("Leyla", "Salathe", "lsalathe@openolat.com"); + Identity identity = securityManager.createAndPersistIdentityAndUser("lsalathe", null, null, user, null, null, null); + + // convert users to LDAP + boolean currentConvertExistingLocalUsers = ldapLoginModule.isConvertExistingLocalUsersToLDAPUsers(); + ldapLoginModule.setConvertExistingLocalUsersToLDAPUsers(true); + + // use uid as login attribute + LDAPError ldapError = new LDAPError(); + Attributes attrs = ldapManager.bindUser("lsalathe", "olat", ldapError); + Assert.assertNotNull(attrs); + + LDAPError errors = new LDAPError(); + Identity convertedIdentity = ldapManager.findIdentityByLdapAuthentication(attrs, errors); + Assert.assertNotNull(convertedIdentity); + Assert.assertEquals("Salathe", convertedIdentity.getUser().getLastName()); + + // revert configuration + ldapLoginModule.setConvertExistingLocalUsersToLDAPUsers(currentConvertExistingLocalUsers); + securityModule.setIdentityName(currentIdentityNameGenerator); + + // check + Assert.assertEquals(identity, convertedIdentity); + Authentication authentication = securityManager.findAuthentication(convertedIdentity, LDAPAuthenticationController.PROVIDER_LDAP); + Assert.assertNotNull(authentication); + } } diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java index bf47cff058b7276a8588a65dcc0ad21c9878149a..df510531827ec481be9b647b3fe48f9a1c7aec1d 100644 --- a/src/test/java/org/olat/restapi/UserMgmtTest.java +++ b/src/test/java/org/olat/restapi/UserMgmtTest.java @@ -63,6 +63,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.OrganisationRoles; import org.olat.basesecurity.OrganisationService; @@ -165,6 +166,8 @@ public class UserMgmtTest extends OlatRestTestCase { @Autowired private BaseSecurity securityManager; @Autowired + private BaseSecurityModule securityModule; + @Autowired private RepositoryService repositoryService; @Autowired private OrganisationService organisationService; @@ -360,12 +363,170 @@ public class UserMgmtTest extends OlatRestTestCase { .queryParam("login", id.getLogin()).build(); HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); - assertEquals(200, response.getStatusLine().getStatusCode()); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); List<UserVO> vos = parseUserArray(response.getEntity()); - assertNotNull(vos); - assertEquals(1, vos.size()); - assertEquals(id.getIdentity().getName(), vos.get(0).getLogin()); + Assert.assertNotNull(vos); + Assert.assertEquals(1, vos.size()); + Assert.assertEquals(id.getIdentity().getKey(), vos.get(0).getKey()); + Assert.assertNull(vos.get(0).getLogin()); + conn.shutdown(); + } + + @Test + public void testFindUsersByLogin_manualIdentityName() throws IOException, URISyntaxException { + String currentIdentityNameSetting = securityModule.getIdentityName(); + securityModule.setIdentityName("manual"); + + //there is user-rest-... + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("u-rest-manual"); + Assert.assertNotNull(id); + + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + URI request = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("login", id.getLogin()).build(); + HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + List<UserVO> vos = parseUserArray(response.getEntity()); + + Assert.assertNotNull(vos); + Assert.assertEquals(1, vos.size()); + Assert.assertEquals(id.getIdentity().getKey(), vos.get(0).getKey()); + Assert.assertEquals(id.getIdentity().getName(), vos.get(0).getLogin()); + conn.shutdown(); + securityModule.setIdentityName(currentIdentityNameSetting); + } + + @Test + public void testFindUsersByExternalId() throws IOException, URISyntaxException { + //there is user-rest-... + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-external-id"); + Assert.assertNotNull(id); + String externalId = UUID.randomUUID().toString(); + Identity identity = securityManager.setExternalId(id.getIdentity(), externalId); + dbInstance.commitAndCloseSession(); + + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + URI request = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("externalId", externalId) + .queryParam("statusVisibleLimit", "all") + .build(); + + HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + List<UserVO> vos = parseUserArray(response.getEntity()); + + Assert.assertNotNull(vos); + Assert.assertEquals(1, vos.size()); + Assert.assertEquals(identity.getKey(), vos.get(0).getKey()); + Assert.assertNull(vos.get(0).getLogin()); + conn.shutdown(); + } + + @Test + public void testFindUsersByAuthusername() throws IOException, URISyntaxException { + //there is user-rest-... + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-auth-name"); + Assert.assertNotNull(id); + + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + URI request = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("authProvider", "OLAT") + .queryParam("authUsername", id.getLogin()) + .queryParam("statusVisibleLimit", "all") + .build(); + + HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + List<UserVO> vos = parseUserArray(response.getEntity()); + + Assert.assertNotNull(vos); + Assert.assertEquals(1, vos.size()); + Assert.assertEquals(id.getKey(), vos.get(0).getKey()); + Assert.assertNull(vos.get(0).getLogin()); + conn.shutdown(); + } + + @Test + public void testFindUsersByAuthusernameShib() throws IOException, URISyntaxException { + //there is user-rest-... + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-auth-name"); + Assert.assertNotNull(id); + String shibIdent = UUID.randomUUID().toString(); + securityManager.createAndPersistAuthentication(id.getIdentity(), "Shib", shibIdent, null, null); + dbInstance.commitAndCloseSession(); + + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + URI request = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("authProvider", "Shib") + .queryParam("authUsername", shibIdent) + .queryParam("statusVisibleLimit", "all") + .build(); + + HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + List<UserVO> vos = parseUserArray(response.getEntity()); + + Assert.assertNotNull(vos); + Assert.assertEquals(1, vos.size()); + Assert.assertEquals(id.getKey(), vos.get(0).getKey()); + Assert.assertNull(vos.get(0).getLogin()); + + // false check + URI negativeRequest = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("authProvider", "OLAT") + .queryParam("authUsername", shibIdent) + .queryParam("statusVisibleLimit", "all") + .build(); + + HttpGet negativeMethod = conn.createGet(negativeRequest, MediaType.APPLICATION_JSON, true); + HttpResponse negativeResponse = conn.execute(negativeMethod); + Assert.assertEquals(200, negativeResponse.getStatusLine().getStatusCode()); + List<UserVO> negativeVos = parseUserArray(negativeResponse.getEntity()); + + Assert.assertNotNull(negativeVos); + Assert.assertTrue(negativeVos.isEmpty()); + + conn.shutdown(); + } + + @Test + public void testFindUsersByExternalId_negatif() throws IOException, URISyntaxException { + //there is user-rest-... + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("user-external-id-2"); + Assert.assertNotNull(id); + String externalId = UUID.randomUUID().toString(); + Identity identity = securityManager.setExternalId(id.getIdentity(), externalId); + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(identity); + + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + URI request = UriBuilder.fromUri(getContextURI()).path("users") + .queryParam("externalId", "a-non-existing-external-key") + .queryParam("statusVisibleLimit", "all") + .build(); + + HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + List<UserVO> vos = parseUserArray(response.getEntity()); + + Assert.assertNotNull(vos); + Assert.assertTrue(vos.isEmpty()); conn.shutdown(); }