IDEMPIERE-5813 Change Role must close session like Logout does (#1959)
* IDEMPIERE-5813 Change Role must close session like Logout does * IDEMPIERE-5813 Change Role must close session like Logout does
This commit is contained in:
parent
159fbbd04c
commit
03c6187fde
|
@ -127,6 +127,8 @@ public final class Env
|
||||||
public static final String M_PRICELIST_ID = "#M_PriceList_ID";
|
public static final String M_PRICELIST_ID = "#M_PriceList_ID";
|
||||||
public static final String M_PRODUCT_CATEGORY_ID = "#M_Product_Category_ID";
|
public static final String M_PRODUCT_CATEGORY_ID = "#M_Product_Category_ID";
|
||||||
public static final String M_WAREHOUSE_ID = "#M_Warehouse_ID";
|
public static final String M_WAREHOUSE_ID = "#M_Warehouse_ID";
|
||||||
|
/** Context for multi factor authentication */
|
||||||
|
public static final String MFA_Registration_ID = "#MFA_Registration_ID";
|
||||||
/** Context for POS ID */
|
/** Context for POS ID */
|
||||||
public static final String POS_ID = "#POS_ID";
|
public static final String POS_ID = "#POS_ID";
|
||||||
public static final String R_STATUSCATEGORY_ID = "#R_StatusCategory_ID";
|
public static final String R_STATUSCATEGORY_ID = "#R_StatusCategory_ID";
|
||||||
|
|
|
@ -708,6 +708,7 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
Env.setContext(properties, Env.CLIENT_INFO_ORIENTATION, clientInfo.orientation);
|
Env.setContext(properties, Env.CLIENT_INFO_ORIENTATION, clientInfo.orientation);
|
||||||
Env.setContext(properties, Env.CLIENT_INFO_MOBILE, clientInfo.tablet);
|
Env.setContext(properties, Env.CLIENT_INFO_MOBILE, clientInfo.tablet);
|
||||||
Env.setContext(properties, Env.CLIENT_INFO_TIME_ZONE, clientInfo.timeZone.getID());
|
Env.setContext(properties, Env.CLIENT_INFO_TIME_ZONE, clientInfo.timeZone.getID());
|
||||||
|
Env.setContext(properties, Env.MFA_Registration_ID, Env.getContext(Env.getCtx(), Env.MFA_Registration_ID));
|
||||||
|
|
||||||
Desktop desktop = Executions.getCurrent().getDesktop();
|
Desktop desktop = Executions.getCurrent().getDesktop();
|
||||||
Locale locale = (Locale) desktop.getSession().getAttribute(Attributes.PREFERRED_LOCALE);
|
Locale locale = (Locale) desktop.getSession().getAttribute(Attributes.PREFERRED_LOCALE);
|
||||||
|
@ -715,12 +716,12 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
Env.setContext(properties, SessionContextListener.SERVLET_SESSION_ID, httpRequest.getSession().getId());
|
Env.setContext(properties, SessionContextListener.SERVLET_SESSION_ID, httpRequest.getSession().getId());
|
||||||
if (Env.getCtx().get(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER) != null)
|
if (Env.getCtx().get(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER) != null)
|
||||||
properties.put(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER, Env.getCtx().get(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER));
|
properties.put(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER, Env.getCtx().get(ServerContextURLHandler.SERVER_CONTEXT_URL_HANDLER));
|
||||||
|
|
||||||
//desktop cleanup
|
//desktop cleanup
|
||||||
IDesktop appDesktop = getAppDeskop();
|
IDesktop appDesktop = getAppDeskop();
|
||||||
HttpSession session = httpRequest.getSession();
|
HttpSession session = httpRequest.getSession();
|
||||||
if (appDesktop != null)
|
if (appDesktop != null)
|
||||||
appDesktop.logout(T -> {if (T) asyncChangeRole(session, locale, properties);});
|
appDesktop.logout(T -> {if (T) asyncChangeRole(session, locale, properties, desktop);});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -728,8 +729,9 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
* @param httpSession
|
* @param httpSession
|
||||||
* @param locale
|
* @param locale
|
||||||
* @param properties
|
* @param properties
|
||||||
|
* @param desktop
|
||||||
*/
|
*/
|
||||||
private void asyncChangeRole(HttpSession httpSession, Locale locale, Properties properties) {
|
private void asyncChangeRole(HttpSession httpSession, Locale locale, Properties properties, Desktop desktop) {
|
||||||
//stop key listener
|
//stop key listener
|
||||||
if (keyListener != null) {
|
if (keyListener != null) {
|
||||||
keyListener.detach();
|
keyListener.detach();
|
||||||
|
@ -761,6 +763,8 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
|
|
||||||
//show change role window and set new context for env and session
|
//show change role window and set new context for env and session
|
||||||
onChangeRole(locale, properties);
|
onChangeRole(locale, properties);
|
||||||
|
|
||||||
|
Executions.schedule(desktop, e -> DesktopWatchDog.removeOtherDesktopsInSession(desktop), new Event("onRemoveOtherDesktops"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -376,7 +376,7 @@ public class ValidateMFAPanel extends Window implements EventListener<Event> {
|
||||||
PO.clearCrossTenantSafe();
|
PO.clearCrossTenantSafe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Env.setContext(m_ctx, "#MFA_Registration_ID", registrationId);
|
Env.setContext(m_ctx, Env.MFA_Registration_ID, registrationId);
|
||||||
|
|
||||||
if (m_isClientDefined) {
|
if (m_isClientDefined) {
|
||||||
wndLogin.showRolePanel(m_userName, m_showRolePanel, m_clientsKNPairs, m_isClientDefined, true);
|
wndLogin.showRolePanel(m_userName, m_showRolePanel, m_clientsKNPairs, m_isClientDefined, true);
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class SessionManager
|
||||||
String adRoleId = Env.getContext(ctx, Env.AD_ROLE_ID);
|
String adRoleId = Env.getContext(ctx, Env.AD_ROLE_ID);
|
||||||
String adClientId = Env.getContext(ctx, Env.AD_CLIENT_ID);
|
String adClientId = Env.getContext(ctx, Env.AD_CLIENT_ID);
|
||||||
String adOrgId = Env.getContext(ctx, Env.AD_ORG_ID);
|
String adOrgId = Env.getContext(ctx, Env.AD_ORG_ID);
|
||||||
String mfaId = Env.getContext(ctx, "#MFA_Registration_ID");
|
String mfaId = Env.getContext(ctx, Env.MFA_Registration_ID);
|
||||||
|
|
||||||
return ( !"".equals(mfaId)
|
return ( !"".equals(mfaId)
|
||||||
&& !"".equals(adOrgId)
|
&& !"".equals(adOrgId)
|
||||||
|
|
|
@ -133,4 +133,29 @@ public class DesktopWatchDog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove other desktops that share the same session with the pass in desktop parameter
|
||||||
|
* @param desktop
|
||||||
|
*/
|
||||||
|
public static void removeOtherDesktopsInSession(Desktop desktop) {
|
||||||
|
Iterator<DesktopEntry> iterator = INSTANCE.desktops.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
DesktopEntry entry = iterator.next();
|
||||||
|
if (entry.desktop == desktop)
|
||||||
|
continue;
|
||||||
|
if (entry.desktop.getSession() != desktop.getSession())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
iterator.remove();
|
||||||
|
try {
|
||||||
|
final WebApp wapp = desktop.getWebApp();
|
||||||
|
final Session session = desktop.getSession();
|
||||||
|
final DesktopCache desktopCache = ((WebAppCtrl) wapp).getDesktopCache(session);
|
||||||
|
desktopCache.removeDesktop(entry.desktop);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue