diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java index a976bb03f030311fbee0b07fcdd57e99cb0a7ad4..37f1b4e247fc703bd1e895754b60bd2636d489fb 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java @@ -74,11 +74,10 @@ import com.thoughtworks.xstream.XStream; */ class ImportStep00 extends BasicStep { - boolean canCreateOLATPassword; - static final String usageIdentifyer = UserImportController.class.getCanonicalName(); - Mapper excelMapper; - String formatexplanationPart2; - TextElement textAreaElement; + private static final String usageIdentifyer = UserImportController.class.getCanonicalName(); + private boolean canCreateOLATPassword; + private Mapper excelMapper; + private TextElement textAreaElement; public ImportStep00(UserRequest ureq, boolean canCreateOLATPassword) { super(ureq); @@ -108,14 +107,17 @@ class ImportStep00 extends BasicStep { private final class ImportStepForm00 extends StepFormBasicController { - private FormLayoutContainer textContainer; - private List<UserPropertyHandler> userPropertyHandlers; - private List<TransientIdentity> newIdents; private List<Identity> idents; + private List<UpdateIdentity> updateIdents; + private List<TransientIdentity> newIdents; + private List<UserPropertyHandler> userPropertyHandlers; + + private final UserManager um; public ImportStepForm00(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) { super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null); flc.setTranslator(getTranslator()); + um = UserManager.getInstance(); initForm(ureq); } @@ -124,11 +126,11 @@ class ImportStep00 extends BasicStep { // } - @SuppressWarnings("synthetic-access") @Override protected void formOK(UserRequest ureq) { addToRunContext("idents", idents); addToRunContext("newIdents", newIdents); + addToRunContext("updateIdents", updateIdents); addToRunContext("validImport", Boolean.TRUE); boolean newUsers = false; if (newIdents.size() != 0) { @@ -149,22 +151,9 @@ class ImportStep00 extends BasicStep { idents = new ArrayList<Identity>(); newIdents = new ArrayList<TransientIdentity>(); - // fxdiff: check also emails in change-workflow, see OLAT-5723 - Set<String> tempEmailsInUse = new HashSet<String>(); - RegistrationManager rm = RegistrationManager.getInstance(); - List<TemporaryKey> tk = rm.loadTemporaryKeyByAction(RegistrationManager.EMAIL_CHANGE); - if (tk != null) { - for (TemporaryKey temporaryKey : tk) { - XStream xml = new XStream(); - @SuppressWarnings("unchecked") - Map<String, String> mails = (Map<String, String>) xml.fromXML(temporaryKey.getEmailAddress()); - for(Map.Entry<String, String> mailEntry:mails.entrySet()) { - tempEmailsInUse.add(mailEntry.getKey()); - tempEmailsInUse.add(mailEntry.getValue()); - } - } - } - // fxdiff > + updateIdents = new ArrayList<UpdateIdentity>(); + //check also emails in change-workflow, see OLAT-5723 + Set<String> tempEmailsInUse = getTemporaryEmailInUse(); // Note: some values are fix and required: login, pwd and lang, those // can not be configured in the config file @@ -178,173 +167,197 @@ class ImportStep00 extends BasicStep { String[] lines = inp.split("\r?\n"); for (int i = 0; i < lines.length; i++) { String line = lines[i]; - if (!line.equals("")) { // ignore empty lines - String delimiter = "\t"; - // use comma as fallback delimiter, e.g. for better testing - if (line.indexOf(delimiter) == -1) delimiter = ","; - String[] parts = line.split(delimiter); - String login, pwd, lang; - - int columnId = 0; + if (line.equals("")) continue; + + String delimiter = "\t"; + // use comma as fallback delimiter, e.g. for better testing + if (line.indexOf(delimiter) == -1) delimiter = ","; + String[] parts = line.split(delimiter); + String login, pwd, lang; + + int columnId = 0; + + // login row + if (parts.length > columnId) { + login = parts[columnId].trim(); + if (!UserManager.getInstance().syntaxCheckOlatLogin(login)) { + textAreaElement.setErrorKey("error.login", new String[] { String.valueOf(i + 1), login }); + importDataError = true; + break; + } + } else { + textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) }); + importDataError = true; + break; + } + columnId++; - // login row + // pwd row + if (canCreateOLATPassword) { if (parts.length > columnId) { - login = parts[columnId].trim(); - if (!UserManager.getInstance().syntaxCheckOlatLogin(login)) { - textAreaElement.setErrorKey("error.login", new String[] { String.valueOf(i + 1), login }); - importDataError = true; - break; + pwd = parts[columnId].trim(); + if (StringHelper.containsNonWhitespace(pwd)) { + if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) { + textAreaElement.setErrorKey("error.pwd", new String[] { String.valueOf(i + 1), pwd }); + importDataError = true; + break; + } + } else { + // treat all white-space-only passwords as non-passwords. + // the user generation code below will then generate no + // authentication token for this user + pwd = null; } } else { textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) }); importDataError = true; break; } - columnId++; + } else { + pwd = null; + } + columnId++; - // pwd row - if (canCreateOLATPassword) { - if (parts.length > columnId) { - pwd = parts[columnId].trim(); - if (StringHelper.containsNonWhitespace(pwd)) { - if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) { - textAreaElement.setErrorKey("error.pwd", new String[] { String.valueOf(i + 1), pwd }); - importDataError = true; - break; - } - } else { - // treat all white-space-only passwords as non-passwords. - // the user generation code below will then generate no - // authentication token for this user - pwd = null; - } - } else { - textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) }); - importDataError = true; - break; - } - } else { - pwd = null; + // optional language fields + if (parts.length > columnId) { + lang = parts[columnId].trim(); + if (lang.equals("")) { + lang = defaultlang; + } else if (!languages.contains(lang)) { + textAreaElement.setErrorKey("error.lang", new String[] { String.valueOf(i + 1), lang }); + importDataError = true; + break; } - columnId++; + } else { + lang = defaultlang; + } + columnId++; - // optional language fields - if (parts.length > columnId) { - lang = parts[columnId].trim(); - if (lang.equals("")) { - lang = defaultlang; - } else if (!languages.contains(lang)) { - textAreaElement.setErrorKey("error.lang", new String[] { String.valueOf(i + 1), lang }); + Identity ident = BaseSecurityManager.getInstance().findIdentityByName(login); + if (ident != null) { + // update existing accounts, add info message + idents.add(ident); + + ident.getUser().getPreferences().setLanguage(lang); + importDataError = updateUserProperties(ident, parts, i, columnId, tempEmailsInUse, importedEmails, true); + if(importDataError) break; + + UpdateIdentity uIdentity = new UpdateIdentity(ident, pwd); + updateIdents.add(uIdentity); + } else { + // no identity/user yet, create + // check that no user with same login name is already in list + for (Iterator<TransientIdentity> it_news = newIdents.iterator(); it_news.hasNext();) { + TransientIdentity singleUser = it_news.next(); + if (singleUser.getName().equalsIgnoreCase(login)) { + textAreaElement.setErrorKey("error.login.douplicate", new String[] { String.valueOf(i + 1), login }); importDataError = true; break; } - } else { - lang = defaultlang; } - columnId++; - Identity ident = BaseSecurityManager.getInstance().findIdentityByName(login); - if (ident != null) { - // ignore existing accounts, add info message - idents.add(ident); - } else { - // no identity/user yet, create - UserManager um = UserManager.getInstance(); - UserPropertyHandler userPropertyHandler; - String thisKey = ""; - String thisValue = ""; - // check that no user with same login name is already in list - for (Iterator<TransientIdentity> it_news = newIdents.iterator(); it_news.hasNext();) { - TransientIdentity singleUser = it_news.next(); - if (singleUser.getName().equalsIgnoreCase(login)) { - textAreaElement.setErrorKey("error.login.douplicate", new String[] { String.valueOf(i + 1), login }); - importDataError = true; - break; - } - } + TransientIdentity ud = new TransientIdentity(); + // insert fix fields: login, pwd, lang from above + ud.setName(login); + ud.setPassword(pwd); + ud.setLanguage(lang); + importDataError = updateUserProperties(ud, parts, i, columnId, tempEmailsInUse, importedEmails, false); + if(importDataError) break; + + idents.add(ud); + newIdents.add(ud); + } + } - TransientIdentity ud = new TransientIdentity(); - // insert fix fields: login, pwd, lang from above - ud.setName(login); - ud.setPassword(pwd); - ud.setLanguage(lang); - - for (int j = 0; j < userPropertyHandlers.size(); j++) { - userPropertyHandler = userPropertyHandlers.get(j); - thisKey = userPropertyHandler.getName(); - // last columns may be empty if not mandatory - if (parts.length <= columnId) { - thisValue = ""; - } else { - thisValue = parts[columnId].trim(); - } - boolean isMandatoryField = um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler); - if (isMandatoryField && !StringHelper.containsNonWhitespace(thisValue)) { - textAreaElement.setErrorKey("error.mandatory", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()) }); - importDataError = true; - break; - } - // used for call-back value depending on PropertyHandler - ValidationError validationError = new ValidationError(); - if (!userPropertyHandler.isValidValue(null, thisValue, validationError, getLocale())) { - textAreaElement.setErrorKey("error.lengthorformat", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()), - translate(validationError.getErrorKey(), validationError.getArgs()) }); - importDataError = true; - break; - } - // check that no user with same (institutional) e-mail is already in OLAT - if ( (thisKey.equals(UserConstants.INSTITUTIONALEMAIL) || thisKey.equals(UserConstants.EMAIL)) && !thisValue.isEmpty() ) { - // check that no user with same email is already in OLAT - Identity identity = UserManager.getInstance().findIdentityByEmail(thisValue); - if (identity != null) { - textAreaElement.setErrorKey("error.email.exists", new String[] { String.valueOf(i + 1), thisValue }); - importDataError = true; - break; - } - } - // check that no user with same email is already in list - if (thisKey.equals(UserConstants.EMAIL)) { - // check that no user with same email is already in list - Integer mailPos = importedEmails.indexOf(thisValue); - // fxdiff - //TODO unique user property - boolean duplicate = mailPos != -1; - if (!duplicate) { - duplicate |= tempEmailsInUse.contains(thisValue); - } - if(!duplicate) { - duplicate |= um.isEmailInUse(thisValue); - } - - if (duplicate) { // fxdiff > - mailPos++; - textAreaElement.setErrorKey("error.email.douplicate", - new String[] { String.valueOf(i + 1), thisValue, mailPos.toString() }); - importDataError = true; - break; - } else { - importedEmails.add(thisValue); - } - } - ud.setProperty(thisKey, thisValue); - columnId++; - } - idents.add(ud); - newIdents.add(ud); + return !importDataError; + } + + private Set<String> getTemporaryEmailInUse() { + Set<String> tempEmailsInUse = new HashSet<String>(); + RegistrationManager rm = RegistrationManager.getInstance(); + List<TemporaryKey> tk = rm.loadTemporaryKeyByAction(RegistrationManager.EMAIL_CHANGE); + if (tk != null) { + for (TemporaryKey temporaryKey : tk) { + XStream xml = new XStream(); + @SuppressWarnings("unchecked") + Map<String, String> mails = (Map<String, String>) xml.fromXML(temporaryKey.getEmailAddress()); + for(Map.Entry<String, String> mailEntry:mails.entrySet()) { + tempEmailsInUse.add(mailEntry.getKey()); + tempEmailsInUse.add(mailEntry.getValue()); } } } + return tempEmailsInUse; + } + + private boolean updateUserProperties(Identity ud, String[] parts, int i, int columnId, + Set<String> tempEmailsInUse, List<String> importedEmails, boolean update) { + + boolean importDataError = false; + for (int j = 0; j < userPropertyHandlers.size(); j++) { + UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(j); + String thisKey = userPropertyHandler.getName(); + String thisValue = ""; + // last columns may be empty if not mandatory + if (parts.length <= columnId) { + thisValue = ""; + } else { + thisValue = parts[columnId].trim(); + } + boolean isMandatoryField = um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler); + if (isMandatoryField && !StringHelper.containsNonWhitespace(thisValue)) { + textAreaElement.setErrorKey("error.mandatory", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()) }); + importDataError = true; + break; + } + // used for call-back value depending on PropertyHandler + ValidationError validationError = new ValidationError(); + if (!userPropertyHandler.isValidValue(null, thisValue, validationError, getLocale())) { + textAreaElement.setErrorKey("error.lengthorformat", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()), + translate(validationError.getErrorKey(), validationError.getArgs()) }); + importDataError = true; + break; + } + // check that no user with same (institutional) e-mail is already in OLAT + if ( (thisKey.equals(UserConstants.INSTITUTIONALEMAIL) || thisKey.equals(UserConstants.EMAIL)) && !thisValue.isEmpty() ) { + // check that no user with same email is already in OLAT + Identity identity = UserManager.getInstance().findIdentityByEmail(thisValue); + if (identity != null && !identity.equals(ud)) { + textAreaElement.setErrorKey("error.email.exists", new String[] { String.valueOf(i + 1), thisValue }); + importDataError = true; + break; + } + } + // check that no user with same email is already in list + if (thisKey.equals(UserConstants.EMAIL)) { + // check that no user with same email is already in list + Integer mailPos = importedEmails.indexOf(thisValue); + boolean duplicate = mailPos != -1; + if (!duplicate) { + duplicate |= tempEmailsInUse.contains(thisValue); + } - if (importDataError) return false; - - return true; + if (duplicate) { + mailPos++; + textAreaElement.setErrorKey("error.email.douplicate", + new String[] { String.valueOf(i + 1), thisValue, mailPos.toString() }); + importDataError = true; + break; + } else { + importedEmails.add(thisValue); + } + } + ud.getUser().setProperty(thisKey, thisValue); + columnId++; + } + return importDataError; } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormTitle("title"); - textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step0.html"); + FormLayoutContainer textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step0.html"); formLayout.add(textContainer); textContainer.contextPut("canCreateOLATPassword", canCreateOLATPassword); diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep01.java b/src/main/java/org/olat/admin/user/imp/ImportStep01.java index 8a34b2070384812a6fe17e06c766f9c5d3ede8da..6fe6989a7be1524ce77f1fc54bffdcb41a1711f9 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep01.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep01.java @@ -28,6 +28,7 @@ import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer; @@ -51,26 +52,22 @@ import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; class ImportStep01 extends BasicStep { + private static final String usageIdentifyer = UserImportController.class.getCanonicalName(); - boolean canCreateOLATPassword; - boolean newUsers; - static final String usageIdentifyer = UserImportController.class.getCanonicalName(); + private boolean newUsers; + private boolean canCreateOLATPassword; public ImportStep01(UserRequest ureq, boolean canCreateOLATPassword, boolean newUsers) { super(ureq); - this.canCreateOLATPassword = canCreateOLATPassword; this.newUsers = newUsers; + this.canCreateOLATPassword = canCreateOLATPassword; setI18nTitleAndDescr("step1.description", "step1.short.description"); - setNextStep(new ImportStep02(ureq)); //fxdiff: 101 have another step for group addition + setNextStep(new ImportStep02(ureq)); } @Override public PrevNextFinishConfig getInitialPrevNextFinishConfig() { - if (newUsers) { - return new PrevNextFinishConfig(true, true, true); - } else { - return new PrevNextFinishConfig(true, false, false); - } + return new PrevNextFinishConfig(true, true, true); } @Override @@ -80,9 +77,9 @@ class ImportStep01 extends BasicStep { } private final class ImportStepForm01 extends StepFormBasicController { - private List<TransientIdentity> newIdents; - private List<Identity> idents; + private FormLayoutContainer textContainer; + private MultipleSelectionElement updatePasswordEl; private List<UserPropertyHandler> userPropertyHandlers; public ImportStepForm01(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) { @@ -96,23 +93,31 @@ class ImportStep01 extends BasicStep { @Override protected void doDispose() { - // TODO Auto-generated method stub + // } @Override protected void formOK(UserRequest ureq) { + Boolean update = Boolean.FALSE; + if(updatePasswordEl != null && updatePasswordEl.isAtLeastSelected(1)) { + update = Boolean.TRUE; + } + addToRunContext("updatePasswords", update); fireEvent(ureq, StepsEvent.ACTIVATE_NEXT); } - @SuppressWarnings("unchecked") @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { FormLayoutContainer formLayoutVertical = FormLayoutContainer.createVerticalFormLayout("vertical", getTranslator()); formLayout.add(formLayoutVertical); - idents = (List<Identity>) getFromRunContext("idents"); - newIdents = (List<TransientIdentity>) getFromRunContext("newIdents"); - textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), this.velocity_root + "/step1.html"); + @SuppressWarnings("unchecked") + List<Identity> idents = (List<Identity>) getFromRunContext("idents"); + @SuppressWarnings("unchecked") + List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) getFromRunContext("updateIdents"); + @SuppressWarnings("unchecked") + List<TransientIdentity> newIdents = (List<TransientIdentity>) getFromRunContext("newIdents"); + textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), velocity_root + "/step1.html"); formLayoutVertical.add(textContainer); int cntall = idents.size(); @@ -121,6 +126,12 @@ class ImportStep01 extends BasicStep { textContainer.contextPut("newusers", newUsers); String overview = getTranslator().translate("import.confirm", new String[] { "" + cntall, "" + cntNew, "" + cntOld }); textContainer.contextPut("overview", overview); + textContainer.contextPut("updateusers", updateIdents.isEmpty()); + if(!updateIdents.isEmpty() && canCreateOLATPassword) { + String[] theValues = new String[]{ translate("update.password") }; + updatePasswordEl = uifactory + .addCheckboxesHorizontal("update.password", textContainer, new String[]{"on"}, theValues, null); + } FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); int colPos = 0; @@ -191,5 +202,4 @@ class UserNewOldCustomFlexiCellRenderer extends CSSIconFlexiCellRenderer { } return translator.translate("error"); } - } \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep02.java b/src/main/java/org/olat/admin/user/imp/ImportStep02.java index 48863d223282cf46b0151f04c6ad49f8cb5c9e96..e975a912262342d5dffef5ad40db9ab04556287c 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep02.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep02.java @@ -74,5 +74,4 @@ public class ImportStep02 extends BasicStep { StepFormController stepI = new GroupSearchController(ureq, windowControl, form, stepsRunContext); return stepI; } - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java b/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java index 9c57666e082c99018923b8eec392951268b1e3a8..935998548ea72c2ccc46bad5b5d9724339da437a 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java @@ -60,5 +60,4 @@ public class ImportStep03SendMail extends BasicStep { StepFormController stepI = new SendMailConfirmationController(ureq, windowControl, form, stepsRunContext); return stepI; } - } diff --git a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java new file mode 100644 index 0000000000000000000000000000000000000000..be9a8503f3b1d9de2c4a663f5b41954756189aee --- /dev/null +++ b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java @@ -0,0 +1,47 @@ +/** + * <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.admin.user.imp; + +import org.olat.core.id.Identity; + +/** + * + * Initial date: 20.12.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class UpdateIdentity { + + private final Identity identity; + private final String password; + + public UpdateIdentity(Identity identity, String password) { + this.identity = identity; + this.password = password; + } + + public String getPassword() { + return password; + } + + public Identity getIdentity() { + return identity; + } +} diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java index cd06ab1ed161993ba29d55764f2d4808b7ff997d..95d72b72be7304bb78ab30b3fbd274d87a13d124 100644 --- a/src/main/java/org/olat/admin/user/imp/UserImportController.java +++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Set; import org.olat.basesecurity.AuthHelper; +import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurity; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; @@ -54,6 +55,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.mail.MailPackage; import org.olat.group.BusinessGroupService; import org.olat.group.model.BusinessGroupMembershipChange; +import org.olat.login.auth.OLATAuthManager; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; @@ -76,7 +78,9 @@ public class UserImportController extends BasicController { private StepsMainRunController importStepsController; private final BaseSecurity securityManager; + private final OLATAuthManager olatAuthManager; private final BusinessGroupService businessGroupService; + private final UserManager um ; /** * @param ureq @@ -86,7 +90,9 @@ public class UserImportController extends BasicController { */ public UserImportController(UserRequest ureq, WindowControl wControl, boolean canCreateOLATPassword) { super(ureq, wControl); + um = UserManager.getInstance(); securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); + olatAuthManager = CoreSpringFactory.getImpl(OLATAuthManager.class); businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); this.canCreateOLATPassword = canCreateOLATPassword; mainVC = createVelocityContainer("importindex"); @@ -127,7 +133,7 @@ public class UserImportController extends BasicController { } // Create transient user without firstName,lastName, email - UserManager um = UserManager.getInstance(); + User newUser = um.createUser(null, null, null); List<UserPropertyHandler> userProperties = userPropertyHandlers; @@ -143,6 +149,19 @@ public class UserImportController extends BasicController { Identity ident = AuthHelper.createAndPersistIdentityAndUserWithUserGroup(login, pwd, newUser); return ident; } + + private Identity doUpdateIdentity(UpdateIdentity singleUser, Boolean updatePassword) { + String password = singleUser.getPassword(); + Identity identity = singleUser.getIdentity(); + um.updateUserFromIdentity(identity); + if(StringHelper.containsNonWhitespace(password) && updatePassword != null && updatePassword.booleanValue()) { + Authentication auth = securityManager.findAuthentication(identity, "OLAT"); + if(auth != null) { + olatAuthManager.changePassword(getIdentity(), identity, password); + } + } + return singleUser.getIdentity(); + } /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) @@ -155,8 +174,8 @@ public class UserImportController extends BasicController { protected void event(UserRequest ureq, Component source, Event event) { if (source == startLink){ // use fallback translator for user property translation - setTranslator(UserManager.getInstance().getPropertyHandlerTranslator(getTranslator())); - userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true); + setTranslator(um.getPropertyHandlerTranslator(getTranslator())); + userPropertyHandlers = um.getUserPropertyHandlersFor(usageIdentifyer, true); Step start = new ImportStep00(ureq, canCreateOLATPassword); // callback executed in case wizard is finished. @@ -172,6 +191,13 @@ public class UserImportController extends BasicController { for (TransientIdentity newIdent:newIdents) { doCreateAndPersistIdentity(newIdent); } + + Boolean updatePasswords = (Boolean)runContext.get("updatePasswords"); + @SuppressWarnings("unchecked") + List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) runContext.get("updateIdents"); + for (UpdateIdentity updateIdent:updateIdents) { + doUpdateIdentity(updateIdent, updatePasswords); + } @SuppressWarnings("unchecked") List<Long> ownGroups = (List<Long>) runContext.get("ownerGroups"); diff --git a/src/main/java/org/olat/admin/user/imp/_content/step1.html b/src/main/java/org/olat/admin/user/imp/_content/step1.html index bbd446a3b62eaf709ab22eab118639c4817b5267..8903c067c303a6b5836e2612e6026e32bb38fda9 100644 --- a/src/main/java/org/olat/admin/user/imp/_content/step1.html +++ b/src/main/java/org/olat/admin/user/imp/_content/step1.html @@ -3,4 +3,8 @@ $overview #else $r.translate("step1.nonewusers") +#end + +#if($r.visible("update.password")) + <br/><br/>$r.render("update.password") #end \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties index 67141bc89cb3608cd3580df1f5e8447cda382eae..884230ca776dc0358ab4811d9a9e957ba3dc5977 100644 --- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties @@ -47,3 +47,4 @@ table.user.lang=Sprache table.user.login=Benutzername table.user.pwd=Passwort title=Import von Benutzern +update.password=Passw\u00F6rter \u00E4ndern f\u00FCr existierende Benutzer diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties index 08f2e91dc5c085aee9ca5f8204cf20aa4223628d..1f58eeecc05699212615041a7483025f98c71698 100644 --- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties @@ -47,3 +47,4 @@ table.user.lang=Language table.user.login=User name table.user.pwd=Password title=User import +update.password=Update passwords of current users diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties index 96cc5b7c5f1e7806a33ee309ef8bc3570b2890b7..9de09bf493b8b8ca9b5ca5a1a11cf2ef06ef6ed2 100644 --- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties @@ -48,3 +48,4 @@ table.user.lang=Langue table.user.login=Nom d'utilisateur table.user.pwd=Mot de passe title=Importation des utilisateurs +update.password=Changer les mots-de-passe de utilisateurs existants