Search in sources :

Example 21 with Window

use of org.olat.core.gui.components.Window in project OpenOLAT by OpenOLAT.

the class AuthenticatedDispatcher method processBusinessPath.

private void processBusinessPath(String businessPath, UserRequest ureq, UserSession usess) {
    ChiefController chiefController = Windows.getWindows(usess).getChiefController();
    if (chiefController == null) {
        if (usess.isAuthenticated()) {
            AuthHelper.createAuthHome(ureq).getWindow();
            chiefController = Windows.getWindows(usess).getChiefController();
        } else {
            redirectToDefaultDispatcher(ureq.getHttpReq(), ureq.getHttpResp());
            return;
        }
    }
    WindowBackOffice windowBackOffice = chiefController.getWindow().getWindowBackOffice();
    if (chiefController.isLoginInterceptionInProgress()) {
        Window w = windowBackOffice.getWindow();
        // renderOnly
        w.dispatchRequest(ureq, true);
    } else {
        String wSettings = (String) usess.removeEntryFromNonClearedStore(WINDOW_SETTINGS);
        if (wSettings != null) {
            WindowSettings settings = WindowSettings.parse(wSettings);
            windowBackOffice.setWindowSettings(settings);
        }
        try {
            BusinessControl bc = null;
            String historyPointId = ureq.getHttpReq().getParameter("historyPointId");
            if (StringHelper.containsNonWhitespace(historyPointId)) {
                HistoryPoint point = ureq.getUserSession().getHistoryPoint(historyPointId);
                bc = BusinessControlFactory.getInstance().createFromContextEntries(point.getEntries());
            }
            if (bc == null) {
                bc = BusinessControlFactory.getInstance().createFromString(businessPath);
            }
            WindowControl wControl = windowBackOffice.getChiefController().getWindowControl();
            WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, wControl);
            NewControllerFactory.getInstance().launch(ureq, bwControl);
            // render the window
            Window w = windowBackOffice.getWindow();
            // renderOnly
            w.dispatchRequest(ureq, true);
        } catch (Exception e) {
            // try to render something
            try {
                Window w = windowBackOffice.getWindow();
                // renderOnly
                w.dispatchRequest(ureq, true);
            } catch (Exception e1) {
                redirectToDefaultDispatcher(ureq.getHttpReq(), ureq.getHttpResp());
            }
            log.error("", e);
        }
    }
}
Also used : Window(org.olat.core.gui.components.Window) BusinessControl(org.olat.core.id.context.BusinessControl) WindowBackOffice(org.olat.core.gui.control.WindowBackOffice) ChiefController(org.olat.core.gui.control.ChiefController) WindowControl(org.olat.core.gui.control.WindowControl) HistoryPoint(org.olat.core.id.context.HistoryPoint) IOException(java.io.IOException) InvalidRequestParameterException(org.olat.core.gui.components.form.flexible.impl.InvalidRequestParameterException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) WindowSettings(org.olat.core.gui.WindowSettings)

Example 22 with Window

use of org.olat.core.gui.components.Window in project OpenOLAT by OpenOLAT.

the class DMZDispatcher method execute.

/**
 * Main method called by OpenOLATServlet. This processess all requests for
 * users who are not authenticated.
 *
 * @param request
 * @param response
 * @param uriPrefix
 */
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
    if (rejectRequest(request, response)) {
        return;
    }
    UserRequest ureq = null;
    String uriPrefix = DispatcherModule.getLegacyUriPrefix(request);
    try {
        // upon creation URL is checked for
        ureq = new UserRequestImpl(uriPrefix, request, response);
    } catch (NumberFormatException nfe) {
        // a 404 message must be shown -> e.g. robots correct their links.
        if (log.isDebug()) {
            log.debug("Bad Request " + request.getPathInfo());
        }
        DispatcherModule.sendBadRequest(request.getPathInfo(), response);
        return;
    }
    try {
        // find out about which subdispatcher is meant
        // e.g. got here because of /dmz/...
        // maybe something like /dmz/registration/
        // 
        // add the context path to align with uriPrefix e.g. /olat/dmz/
        String pathInfo = request.getContextPath() + request.getPathInfo();
        ChiefControllerCreator subPathccc = null;
        // if /olat/dmz/
        boolean dmzOnly = pathInfo.equals(uriPrefix);
        if (!dmzOnly) {
            int sl = pathInfo.indexOf('/', uriPrefix.length());
            String sub;
            if (sl > 1) {
                // e.g. something like /registration/ or /pwchange/
                sub = pathInfo.substring(uriPrefix.length() - 1, sl + 1);
            } else {
                // e.g. something like /info.html from (/dmz/info.html)
                sub = pathInfo;
            }
            // chief controller creator for sub path, e.g.
            subPathccc = dmzServicesByPath.get(sub);
            if (subPathccc != null) {
                UserSession usess = ureq.getUserSession();
                Windows ws = Windows.getWindows(usess);
                synchronized (ws) {
                    // o_clusterOK by:fj per user session
                    ChiefController occ = subPathccc.createChiefController(ureq);
                    Window window = occ.getWindow();
                    window.setUriPrefix(uriPrefix);
                    ws.registerWindow(window);
                    window.dispatchRequest(ureq, true);
                    return;
                }
            }
        }
        // else a /olat/dmz/ request
        UserSession usess = ureq.getUserSession();
        Windows ws = Windows.getWindows(usess);
        // and make it useless under heavily load or 2 concurrent requests
        synchronized (usess) {
            // o_clusterOK by:fj per user session
            Window window;
            boolean windowHere = ws.isExisting(uriPrefix, ureq.getWindowID());
            boolean validDispatchUri = ureq.isValidDispatchURI();
            if (validDispatchUri && !windowHere) {
                // probably valid framework link from previous user && new Session(no window):
                // when a previous user logged off, and 30min later (when the httpsession is invalidated), the next user clicks e.g. on
                // the log-in link in the -same- browser window ->
                // -> there is no window -> create a new one
                window = null;
                CoreSpringFactory.getImpl(UserSessionManager.class).signOffAndClear(usess);
                usess.setLocale(LocaleNegotiator.getPreferedLocale(ureq));
                // update locale infos
                I18nManager.updateLocaleInfoToThread(usess);
                // request new windows since it is a new usersession, the old one was purged
                ws = Windows.getWindows(usess);
            } else if (validDispatchUri) {
                window = ws.getWindow(ureq);
            } else if (dmzOnly) {
                // e.g. /dmz/ -> start screen, clear previous session data
                window = null;
                CoreSpringFactory.getImpl(UserSessionManager.class).signOffAndClear(usess);
                usess.setLocale(LocaleNegotiator.getPreferedLocale(ureq));
                // update locale infos
                I18nManager.updateLocaleInfoToThread(usess);
                OAuthLoginModule oauthModule = CoreSpringFactory.getImpl(OAuthLoginModule.class);
                if (canRedirectConfigurableOAuth(request, response, oauthModule)) {
                    return;
                } else if (canRedirectOAuth(request, oauthModule)) {
                    OAuthSPI oauthSpi = oauthModule.getRootProvider();
                    HttpSession session = request.getSession();
                    OAuthResource.redirect(oauthSpi, response, session);
                    return;
                }
                // request new windows since it is a new usersession, the old one was purged
                ws = Windows.getWindows(usess);
            } else {
                response.sendError(HttpServletResponse.SC_BAD_REQUEST);
                return;
            }
            if (window == null) {
                // no window found, -> start a new WorkFlow/Controller and obtain the window
                // main controller which also implements the windowcontroller for pagestatus and modal dialogs
                Object wSettings = usess.getEntry(WINDOW_SETTINGS);
                ChiefController occ = chiefControllerCreator.createChiefController(ureq);
                window = occ.getWindow();
                window.setUriPrefix(uriPrefix);
                ws.registerWindow(window);
                String businessPath = (String) usess.removeEntryFromNonClearedStore(DMZDISPATCHER_BUSINESSPATH);
                if (businessPath != null) {
                    List<ContextEntry> ces = BusinessControlFactory.getInstance().createCEListFromString(businessPath);
                    window.getDTabs().activate(ureq, null, ces);
                }
                // apply the settings forward
                usess.putEntryInNonClearedStore(WINDOW_SETTINGS, wSettings);
            }
            window.dispatchRequest(ureq);
        }
    } catch (InvalidRequestParameterException e) {
        try {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        } catch (IOException e1) {
            log.error("An exception occured while handling the invalid request parameter exception...", e1);
        }
    } catch (Throwable th) {
        try {
            ChiefController msgcc = MsgFactory.createMessageChiefController(ureq, th);
            // the controller's window must be failsafe also
            msgcc.getWindow().dispatchRequest(ureq, true);
        // do not dispatch (render only), since this is a new Window created as
        // a result of another window's click.
        } catch (Throwable t) {
            log.error("An exception occured while handling the exception...", t);
        }
    }
}
Also used : Window(org.olat.core.gui.components.Window) OAuthLoginModule(org.olat.login.oauth.OAuthLoginModule) HttpSession(javax.servlet.http.HttpSession) Windows(org.olat.core.gui.Windows) ChiefController(org.olat.core.gui.control.ChiefController) IOException(java.io.IOException) ContextEntry(org.olat.core.id.context.ContextEntry) UserSessionManager(org.olat.core.util.session.UserSessionManager) InvalidRequestParameterException(org.olat.core.gui.components.form.flexible.impl.InvalidRequestParameterException) ChiefControllerCreator(org.olat.core.gui.control.ChiefControllerCreator) UserSession(org.olat.core.util.UserSession) OAuthSPI(org.olat.login.oauth.OAuthSPI) UserRequest(org.olat.core.gui.UserRequest) UserRequestImpl(org.olat.core.gui.UserRequestImpl)

Example 23 with Window

use of org.olat.core.gui.components.Window in project OpenOLAT by OpenOLAT.

the class RESTDispatcher method execute.

@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
    // 
    // create a ContextEntries String which can be used to create a BusinessControl -> move to
    // 
    String uriPrefix = DispatcherModule.getLegacyUriPrefix(request);
    final String origUri = request.getRequestURI();
    String encodedRestPart = origUri.substring(uriPrefix.length());
    String restPart = encodedRestPart;
    try {
        restPart = URLDecoder.decode(encodedRestPart, "UTF8");
    } catch (UnsupportedEncodingException e) {
        log.error("Unsupported encoding", e);
    }
    String[] split = restPart.split("/");
    if (split.length % 2 != 0) {
        // assert(split.length % 2 == 0);
        // The URL is not a valid business path
        DispatcherModule.sendBadRequest(origUri, response);
        log.warn("URL is not valid: " + restPart);
        return;
    }
    String businessPath = BusinessControlFactory.getInstance().formatFromSplittedURI(split);
    if (log.isDebug()) {
        log.debug("REQUEST URI: " + origUri);
        log.debug("REQUEST PREFIX " + restPart);
        log.debug("calc buspath " + businessPath);
    }
    // check if the businesspath is valid
    try {
        BusinessControl bc = BusinessControlFactory.getInstance().createFromString(businessPath);
        if (!bc.hasContextEntry()) {
            // The URL is not a valid business path
            DispatcherModule.sendBadRequest(origUri, response);
            return;
        }
    } catch (Exception e) {
        DispatcherModule.sendBadRequest(origUri, response);
        log.warn("Error with business path: " + origUri, e);
        return;
    }
    // 
    // create the olat ureq and get an associated main window to spawn the "tab"
    // 
    UserSession usess = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(request);
    if (usess != null) {
        ThreadLocalUserActivityLoggerInstaller.initUserActivityLogger(request);
    }
    UserRequest ureq = null;
    try {
        // upon creation URL is checked for
        ureq = new UserRequestImpl(uriPrefix, request, response);
    } catch (NumberFormatException nfe) {
        // a 404 message must be shown -> e.g. robots correct their links.
        if (log.isDebug()) {
            log.debug("Bad Request " + request.getPathInfo());
        }
        DispatcherModule.sendBadRequest(request.getPathInfo(), response);
        return;
    }
    // XX:GUIInterna.setLoadPerformanceMode(ureq);
    // Do auto-authenticate if url contains a X-OLAT-TOKEN Single-Sign-On REST-Token
    String xOlatToken = ureq.getParameter(RestSecurityHelper.SEC_TOKEN);
    if (xOlatToken != null) {
        // Lookup identity that is associated with this token
        RestSecurityBean securityBean = (RestSecurityBean) CoreSpringFactory.getBean(RestSecurityBean.class);
        Identity restIdentity = securityBean.getIdentity(xOlatToken);
        // 
        if (log.isDebug()) {
            if (restIdentity == null)
                log.debug("Found SSO token " + RestSecurityHelper.SEC_TOKEN + " in url, but token is not bound to an identity");
            else
                log.debug("Found SSO token " + RestSecurityHelper.SEC_TOKEN + " in url which is bound to identity::" + restIdentity.getName());
        }
        // 
        if (restIdentity != null) {
            // after the REST dispatcher finishes. No need to change it here.
            if (!usess.isAuthenticated() || !restIdentity.equalsByPersistableKey(usess.getIdentity())) {
                // Re-authenticate user session for this user and start a fresh
                // standard OLAT session
                int loginStatus = AuthHelper.doLogin(restIdentity, RestSecurityHelper.SEC_TOKEN, ureq);
                if (loginStatus == AuthHelper.LOGIN_OK) {
                    // fxdiff: FXOLAT-268 update last login date and register active user
                    UserDeletionManager.getInstance().setIdentityAsActiv(restIdentity);
                } else {
                    // error, redirect to login screen
                    DispatcherModule.redirectToDefaultDispatcher(response);
                }
            } else if (Windows.getWindows(usess).getChiefController() == null) {
                // Session is already available, but no main window (Head-less REST
                // session). Only create the base chief controller and the window
                Window currentWindow = AuthHelper.createAuthHome(ureq).getWindow();
                // the user is authenticated successfully with a security token, we can set the authenticated path
                currentWindow.setUriPrefix(WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED);
                Windows ws = Windows.getWindows(ureq);
                ws.registerWindow(currentWindow);
            // no need to call setIdentityAsActive as this was already done by RestApiLoginFilter...
            }
        }
    }
    boolean auth = usess.isAuthenticated();
    if (auth) {
        if (Windows.getWindows(usess).getChiefController() == null) {
            // Session is already available, but no main window (Head-less REST
            // session). Only create the base chief controller and the window
            setBusinessPathInUserSession(usess, businessPath, ureq.getParameter(WINDOW_SETTINGS));
            AuthHelper.createAuthHome(ureq);
            String url = getRedirectToURL(usess) + ";jsessionid=" + usess.getSessionInfo().getSession().getId();
            DispatcherModule.redirectTo(response, url);
        } else {
            // redirect to the authenticated dispatcher which support REST url
            String url = WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED + encodedRestPart;
            DispatcherModule.redirectTo(response, url);
        }
    } else {
        // prepare for redirect
        LoginModule loginModule = CoreSpringFactory.getImpl(LoginModule.class);
        setBusinessPathInUserSession(usess, businessPath, ureq.getParameter(WINDOW_SETTINGS));
        String invitationAccess = ureq.getParameter(AuthenticatedDispatcher.INVITATION);
        if (invitationAccess != null && loginModule.isInvitationEnabled()) {
            // try to log in as anonymous
            // use the language from the lang paramter if available, otherwhise use the system default locale
            Locale guestLoc = getLang(ureq);
            int loginStatus = AuthHelper.doInvitationLogin(invitationAccess, ureq, guestLoc);
            if (loginStatus == AuthHelper.LOGIN_OK) {
                Identity invite = usess.getIdentity();
                // fxdiff: FXOLAT-268 update last login date and register active user
                UserDeletionManager.getInstance().setIdentityAsActiv(invite);
                // logged in as invited user, continue
                String url = getRedirectToURL(usess);
                DispatcherModule.redirectTo(response, url);
            } else if (loginStatus == AuthHelper.LOGIN_NOTAVAILABLE) {
                DispatcherModule.redirectToServiceNotAvailable(response);
            } else {
                // error, redirect to login screen
                DispatcherModule.redirectToDefaultDispatcher(response);
            }
        } else {
            String guestAccess = ureq.getParameter(AuthenticatedDispatcher.GUEST);
            if (guestAccess == null || !loginModule.isGuestLoginLinksEnabled()) {
                DispatcherModule.redirectToDefaultDispatcher(response);
                return;
            } else if (guestAccess.equals(AuthenticatedDispatcher.TRUE)) {
                // try to log in as anonymous
                // use the language from the lang paramter if available, otherwhise use the system default locale
                Locale guestLoc = getLang(ureq);
                int loginStatus = AuthHelper.doAnonymousLogin(ureq, guestLoc);
                if (loginStatus == AuthHelper.LOGIN_OK) {
                    // logged in as anonymous user, continue
                    String url = getRedirectToURL(usess);
                    DispatcherModule.redirectTo(response, url);
                } else if (loginStatus == AuthHelper.LOGIN_NOTAVAILABLE) {
                    DispatcherModule.redirectToServiceNotAvailable(response);
                } else {
                    // error, redirect to login screen
                    DispatcherModule.redirectToDefaultDispatcher(response);
                }
            }
        }
    }
}
Also used : Window(org.olat.core.gui.components.Window) Locale(java.util.Locale) BusinessControl(org.olat.core.id.context.BusinessControl) UnsupportedEncodingException(java.io.UnsupportedEncodingException) LoginModule(org.olat.login.LoginModule) Windows(org.olat.core.gui.Windows) UnsupportedEncodingException(java.io.UnsupportedEncodingException) UserSessionManager(org.olat.core.util.session.UserSessionManager) UserSession(org.olat.core.util.UserSession) Identity(org.olat.core.id.Identity) UserRequest(org.olat.core.gui.UserRequest) UserRequestImpl(org.olat.core.gui.UserRequestImpl) RestSecurityBean(org.olat.restapi.security.RestSecurityBean)

Example 24 with Window

use of org.olat.core.gui.components.Window in project OpenOLAT by OpenOLAT.

the class RemoteLoginformDispatcher method getRedirectToURL.

private String getRedirectToURL(UserSession usess) {
    Window w = Windows.getWindows(usess).getChiefController().getWindow();
    URLBuilder ubu = new URLBuilder("", w.getInstanceId(), String.valueOf(w.getTimestamp()));
    StringOutput sout = new StringOutput(30);
    ubu.buildURI(sout, null, null);
    return WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED + sout.toString();
}
Also used : Window(org.olat.core.gui.components.Window) StringOutput(org.olat.core.gui.render.StringOutput) URLBuilder(org.olat.core.gui.render.URLBuilder)

Example 25 with Window

use of org.olat.core.gui.components.Window in project openolat by klemens.

the class AuthHelper method doLogin.

/**
 * Used by DMZDispatcher to do regular logins and by ShibbolethDispatcher
 * which is somewhat special because logins are handled asynchronuous ->
 * therefore a dedicated dispatcher is needed which also has to have access to
 * the doLogin() method.
 *
 * @param identity
 * @param authProvider
 * @param ureq
 * @return True if success, false otherwise.
 */
public static int doLogin(Identity identity, String authProvider, UserRequest ureq) {
    int initializeStatus = initializeLogin(identity, authProvider, ureq, false);
    if (initializeStatus != LOGIN_OK) {
        // login not successfull
        return initializeStatus;
    }
    // do logging
    ThreadLocalUserActivityLogger.log(OlatLoggingAction.OLAT_LOGIN, AuthHelper.class, LoggingResourceable.wrap(identity));
    // brasato:: fix it
    // successfull login, reregister window
    ChiefController occ;
    if (ureq.getUserSession().getRoles().isGuestOnly()) {
        occ = createGuestHome(ureq);
    } else {
        occ = createAuthHome(ureq);
    }
    Window currentWindow = occ.getWindow();
    currentWindow.setUriPrefix(WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED);
    Windows.getWindows(ureq).registerWindow(currentWindow);
    RedirectMediaResource redirect;
    String redirectTo = (String) ureq.getUserSession().getEntry("redirect-bc");
    if (StringHelper.containsNonWhitespace(redirectTo)) {
        String url = WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED + redirectTo;
        redirect = new RedirectMediaResource(url);
    } else {
        // redirect to AuthenticatedDispatcher
        // IMPORTANT: windowID has changed due to re-registering current window -> do not use ureq.getWindowID() to build new URLBuilder.
        URLBuilder ubu = new URLBuilder(WebappHelper.getServletContextPath() + DispatcherModule.PATH_AUTHENTICATED, currentWindow.getInstanceId(), "1");
        StringOutput sout = new StringOutput(30);
        ubu.buildURI(sout, null, null);
        redirect = new RedirectMediaResource(sout.toString());
    }
    ureq.getDispatchResult().setResultingMediaResource(redirect);
    return LOGIN_OK;
}
Also used : Window(org.olat.core.gui.components.Window) RedirectMediaResource(org.olat.core.gui.media.RedirectMediaResource) StringOutput(org.olat.core.gui.render.StringOutput) ChiefController(org.olat.core.gui.control.ChiefController) URLBuilder(org.olat.core.gui.render.URLBuilder)

Aggregations

Window (org.olat.core.gui.components.Window)30 UserSession (org.olat.core.util.UserSession)10 Windows (org.olat.core.gui.Windows)8 ChiefController (org.olat.core.gui.control.ChiefController)8 StringOutput (org.olat.core.gui.render.StringOutput)8 WindowBackOffice (org.olat.core.gui.control.WindowBackOffice)6 RedirectMediaResource (org.olat.core.gui.media.RedirectMediaResource)6 URLBuilder (org.olat.core.gui.render.URLBuilder)6 Identity (org.olat.core.id.Identity)6 BusinessControl (org.olat.core.id.context.BusinessControl)6 IOException (java.io.IOException)4 UnsupportedEncodingException (java.io.UnsupportedEncodingException)4 UserRequest (org.olat.core.gui.UserRequest)4 UserRequestImpl (org.olat.core.gui.UserRequestImpl)4 InvalidRequestParameterException (org.olat.core.gui.components.form.flexible.impl.InvalidRequestParameterException)4 WindowControl (org.olat.core.gui.control.WindowControl)4 ContextEntry (org.olat.core.id.context.ContextEntry)4 UserSessionManager (org.olat.core.util.session.UserSessionManager)4 ArrayList (java.util.ArrayList)2 Locale (java.util.Locale)2