Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ChangePrefsController.java 13.18 KiB
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/

package org.olat.user;

import java.util.Set;

import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.WindowManager;
import org.olat.core.gui.components.Component;
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.elements.SingleSelection;
import org.olat.core.gui.components.form.flexible.elements.TextElement;
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.components.velocity.VelocityContainer;
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.controller.BasicController;
import org.olat.core.gui.media.RedirectMediaResource;
import org.olat.core.id.Identity;
import org.olat.core.id.User;
import org.olat.core.id.context.HistoryManager;
import org.olat.core.id.context.HistoryModule;
import org.olat.core.util.StringHelper;
import org.olat.core.util.UserSession;
import org.olat.core.util.WebappHelper;
import org.olat.core.util.i18n.I18nModule;
import org.olat.core.util.prefs.Preferences;
import org.olat.core.util.prefs.PreferencesFactory;
import org.olat.core.util.session.UserSessionManager;
import org.olat.properties.PropertyManager;
import org.springframework.beans.factory.annotation.Autowired;


/**
 * Initial Date: Apr 27, 2004
 * 
 * @author gnaegi Comment: This controller allows the user to edit the
 *         preferences of any subject. Make sure you check for security when
 *         creating this controller since this controller does not have any
 *         security checks whatsoever.
 */

public class ChangePrefsController extends BasicController {
	
	private VelocityContainer myContent;
	private Controller generalPrefsCtr;
	private Controller specialPrefsCtr;
	private Controller toolsPrefsCtr;
	private Controller resetCtr;
	
	/**
	 * Constructor for the change user preferences controller
	 * 
	 * @param ureq The user request
	 * @param wControl The current window controller
	 * @param changeableIdentity The subject whose profile should be changed
	 */
	public ChangePrefsController(UserRequest ureq, WindowControl wControl, Identity changeableIdentity) {
		super(ureq, wControl);

		myContent = createVelocityContainer("prefs");

		generalPrefsCtr = new PreferencesFormController(ureq, wControl, changeableIdentity);
		listenTo(generalPrefsCtr);
		
		specialPrefsCtr = new SpecialPrefsForm(ureq, wControl, changeableIdentity);
		listenTo(specialPrefsCtr);
		
		resetCtr = new UserPrefsResetForm(ureq, wControl, changeableIdentity);
		listenTo(resetCtr);
		
		toolsPrefsCtr = new ToolsPrefsController(ureq, wControl, changeableIdentity);
		listenTo(toolsPrefsCtr);
		
		myContent.put("general", generalPrefsCtr.getInitialComponent());
		myContent.put("special", specialPrefsCtr.getInitialComponent());
		myContent.put("tools", toolsPrefsCtr.getInitialComponent());
		myContent.put("reset", resetCtr.getInitialComponent());
		
		putInitialPanel(myContent);
	}

	/**
	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
	 *      org.olat.core.gui.components.Component,
	 *      org.olat.core.gui.control.Event)
	 */
	@Override
	public void event(UserRequest ureq, Component source, Event event) {
		if (source == myContent) {
			if (event.getCommand().equals("exeBack")) {
				fireEvent(ureq, Event.CANCELLED_EVENT);
			}
		} 
	}
	
	@Override
	public void event(UserRequest ureq, Controller source, Event event) {
		if (source == generalPrefsCtr) {
			if (event == Event.DONE_EVENT) {
				fireEvent(ureq, Event.DONE_EVENT);				
			} else if (event == Event.CANCELLED_EVENT) {
				fireEvent(ureq, Event.CANCELLED_EVENT);
			}
		}
		
	} 
	
	/**
	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
	 */
	@Override
	protected void doDispose() {
		//
	}
}

/**
 * 
 * Description:<br>
 * The special prefs form is used to configure the delivery mode. Users can
 * choose between web 1.0, web 2.0 and web 2.a. The configuration for web 1.0
 * and web 2.0 is only available for user managers. Normal users can only
 * enable/disable the web 2.a mode
 * 
 * <P>
 * Initial Date: 09.11.2010 <br>
 * 
 * @author gnaegi
 */
class SpecialPrefsForm extends FormBasicController {

	private Identity tobeChangedIdentity;
	private Preferences prefs;
	
	private SingleSelection resumeElement;
	private TextElement landingPageEl;
	private String[] resumeKeys, resumeValues;

	@Autowired
	private HistoryModule historyModule;
	@Autowired
	private UserSessionManager sessionManager;
	
	public SpecialPrefsForm(final UserRequest ureq, final WindowControl wControl, final Identity changeableIdentity) {
		super(ureq, wControl);
		tobeChangedIdentity = changeableIdentity;
		
		// OLAT-6429 load GUI prefs from user session for myself, load it from factory for other users (as user manager)
		if (ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) {
			prefs = ureq.getUserSession().getGuiPreferences();
		} else {
			prefs = PreferencesFactory.getInstance().getPreferencesFor(tobeChangedIdentity, false);			
		}
		
		resumeKeys = new String[]{"none", "auto", "ondemand"}; 
		resumeValues = new String[] {
				translate("resume.none"),
				translate("resume.auto"),
				translate("resume.ondemand"),
		};

		initForm(ureq);
	}

	@Override
	protected void formOK(UserRequest ureq) {
		// OLAT-6429 don't change another users GUI prefs when he is logged in 
		if (!ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) {
			if (sessionManager.isSignedOnIdentity(tobeChangedIdentity.getKey())) {
				String fullName = CoreSpringFactory.getImpl(UserManager.class).getUserDisplayName(tobeChangedIdentity);
				showError("error.user.logged.in",fullName);
				return;
			}
		}
		
		if(resumeElement != null) {
			prefs.put(WindowManager.class, "resume-prefs", resumeElement.getSelectedKey());
		}
		String landingPage = landingPageEl.isVisible() ? landingPageEl.getValue() : "";
		prefs.put(WindowManager.class, "landing-page", landingPage);
		
		if (ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) {
			showInfo("preferences.successful");
		}
		
		// finally, save preferences
		prefs.save();
	}
	
	@Override
	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
		if(resumeElement == source) {
			if(resumeElement.isOneSelected()) {
				landingPageEl.setVisible(!resumeElement.getSelectedKey().equals("auto"));
			}
		}
		super.formInnerEvent(ureq, source, event);
	}

	@Override
	protected void formCancelled(UserRequest ureq) {
		update();
	}
	
	@Override
	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
		setFormTitle("title.prefs.special");
		setFormContextHelp("Configuration#_specifics");

		if(historyModule.isResumeEnabled()) {
			resumeElement = uifactory.addRadiosVertical("resume", "resume.label", formLayout, resumeKeys, resumeValues);
			resumeElement.setElementCssClass("o_sel_home_settings_resume");
			resumeElement.addActionListener(FormEvent.ONCHANGE);
		}
		
		landingPageEl = uifactory.addTextElement("landingpages", "landing.pages", 256, "", formLayout);
		landingPageEl.setElementCssClass("o_sel_home_settings_landing_page");
		
		update();
		
		final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("button_layout", getTranslator());
		formLayout.add(buttonLayout);
		buttonLayout.setElementCssClass("o_sel_home_settings_gui_buttons");
		uifactory.addFormSubmitButton("submit", buttonLayout);
		uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
	}

	private void update() {
		boolean landingPageVisible = true;
		if(resumeElement != null) {
			String resumePrefs = (String)prefs.get(WindowManager.class, "resume-prefs");
			if(StringHelper.containsNonWhitespace(resumePrefs)) {
				resumeElement.select(resumePrefs, true);
			} else {
				String defaultSetting = historyModule.getResumeDefaultSetting();
				try {
					resumeElement.select(defaultSetting, true);
				} catch (Exception e) {
					logError("Unavailable setting for resume function: " + defaultSetting, e);
				}
			}
			
			if(resumeElement.isOneSelected()) {
				landingPageVisible = !resumeElement.getSelectedKey().equals("auto");
			}
		}

		String landingPage = (String)prefs.get(WindowManager.class, "landing-page");
		landingPageEl.setValue(landingPage);
		landingPageEl.setVisible(landingPageVisible);
	}
	
	@Override
	protected void doDispose() {
		//
	}
	
}

/**
 * Controller to reset the users GUI prefs and other preferences
 */
class UserPrefsResetForm extends FormBasicController {

	private Identity tobeChangedIdentity;
	private MultipleSelectionElement resetElements;
	private String[] keys, values;

	@Autowired
	private I18nModule i18nModule;
	@Autowired
	private HistoryManager historyManager;
	@Autowired
	private UserSessionManager sessionManager;
	
	public UserPrefsResetForm(UserRequest ureq, WindowControl wControl, Identity changeableIdentity) {
		super(ureq, wControl);
		tobeChangedIdentity = changeableIdentity;
		initForm(ureq);
	}

	@Override
	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
		setFormTitle("reset.title");
		setFormDescription("reset.desc");
		
		keys = new String[]{"guiprefs", "sysprefs", "resume"};
		values = new String[] {translate("reset.elements.guiprefs"), translate("reset.elements.sysprefs"), translate("reset.elements.resume")};
		
		resetElements = uifactory.addCheckboxesVertical("prefs", "reset.elements", formLayout, keys, values, 1);
		resetElements.setElementCssClass("o_sel_home_settings_reset_sysprefs");
		resetElements.setMandatory(true);
		
		final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("button_layout", getTranslator());
		formLayout.add(buttonLayout);
		buttonLayout.setElementCssClass("o_sel_home_settings_reset_sysprefs_buttons");
		uifactory.addFormSubmitButton("reset.submit", buttonLayout);
	}
	
	@Override
	protected boolean validateFormLogic(UserRequest ureq) {
		boolean allOk = true;
		
		resetElements.clearError();
		if(!resetElements.isAtLeastSelected(1)) {
			resetElements.setErrorKey("form.legende.mandatory", null);
			allOk &= false;
		}
		
		return allOk & super.validateFormLogic(ureq);
	}

	@Override
	protected void formOK(UserRequest ureq) {
		if (resetElements.isAtLeastSelected(1)) {
			// Log out user first if logged in
			boolean logout = false;
			Set<UserSession> sessions = sessionManager.getAuthenticatedUserSessions();
			for (UserSession session : sessions) {
				Identity ident = session.getIdentity();
				if (ident != null && tobeChangedIdentity.equalsByPersistableKey(ident)) {
					sessionManager.signOffAndClear(session);
					logout = true;
					break;
				}
			}
			// Delete gui prefs
			if (resetElements.isSelected(0)) {
				PropertyManager pm = PropertyManager.getInstance();
				pm.deleteProperties(tobeChangedIdentity, null, null, null, "v2guipreferences");
			}
			// Reset preferences
			if (resetElements.isSelected(1)) {
				UserManager um = UserManager.getInstance();
				User user = um.loadUserByKey(tobeChangedIdentity.getUser().getKey());
				org.olat.core.id.Preferences preferences = user.getPreferences();
				preferences.setFontsize(null);
				preferences.setNotificationInterval(null);
				preferences.setPresenceMessagesPublic(false);
				preferences.setReceiveRealMail(null);
				um.updateUser(user);
				PropertyManager pm = PropertyManager.getInstance();
				pm.deleteProperties(tobeChangedIdentity, null, null, null, "charset");
			}
			// Reset history
			if (resetElements.isSelected(2)) {
				historyManager.deleteHistory(tobeChangedIdentity);
			}
			// reset form buttons
			resetElements.uncheckAll();
			
			if(logout) {
				//if logout, need a redirect to the login page
				String lang = i18nModule.getLocaleKey(ureq.getLocale());
				ureq.getDispatchResult().setResultingMediaResource(
						new RedirectMediaResource(WebappHelper.getServletContextPath() + "/dmz/?lang=" + lang + "&logout=true"));
			}
		}
	}
	
	@Override
	protected void doDispose() {
		//
	}
	
}