[ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642630#action_12642630 ]
BJ Freeman commented on OFBIZ-2020: ----------------------------------- can you give a overview for this requirement. I am interested in how entity-views across applications, therefor delegators are handled. how do you deal with the sandbox? also why not entity-sync. > Using one Ofbiz instance with multiple databases > ------------------------------------------------ > > Key: OFBIZ-2020 > URL: https://issues.apache.org/jira/browse/OFBIZ-2020 > Project: OFBiz > Issue Type: New Feature > Affects Versions: SVN trunk > Reporter: youssef khaye > Fix For: SVN trunk > > Attachments: ofbiz-multi.patch > > > I want to share my work with you implementing the use of one OFBiz instance > with multiple databases, by defining multiple delegators, in the > entityengine.xml, one for each databases. this is useful when we implementing > ofbiz for semi-independent subsidiaries of one company having users allowed > to use two or more databases. > This involve mainly the user authentication procedure by asking for a company > name in the login form. This company name represents a delegator name that > describe a specific subsidiary database. After a successful user login > operation, the passed company name is used to retrieve the corresponding > delegator. The method CoreEvents.chageDelegator is modified to change the > delegator of related Dispatcher and JobManager. > Of course I needed to store the delegator name in the GenericValue UserLogin > to navigate among different ofbiz applications keeping the same original > database. > I also provided a kind of mechanism to activate or deactivates the use of > multi-delegator by adding a "multi.delegator" property in the > security.properties configuration file that when set true, cause the ofbiz to > display he company field in the login form and do the necessary work to > switch from default database to the provided one. > I will be open to discuss any suggestion for improving this issue. > Following is a patch for current ofbiz trunk version: > Index: > /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml > =================================================================== > --- > /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml > (working copy) > @@ -2611,6 +2611,9 @@ > </extend-entity> > <extend-entity entity-name="UserLogin"> > <field name="partyId" type="id"></field> > + <!--Begin specific : field used to store the delegator name along > theuse session --> > + <field name="delegator" type="id"></field> > + <!-- End Specific --> > <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party"> > <key-map field-name="partyId"/> > </relation> > Index: > /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml > =================================================================== > --- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml > (revision 705872) > +++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml > (working copy) > @@ -1617,6 +1617,23 @@ > <value xml:lang="zh_CN">十二月</value> > <value xml:lang="zh">十二月</value> > </property> > + <property key="CommonCompany"> > + <value xml:lang="ar">المؤسسة</value> > + <value xml:lang="en">Company</value> > + <value xml:lang="fr">Entreprise</value> > + </property> > <property key="CommonDelete"> > <value xml:lang="ar">حذف</value> > <value xml:lang="cs">Smazat</value> > Index: > /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java > (working copy) > @@ -90,7 +90,7 @@ > if (username == null) username = (String) context.get("username"); > String password = (String) context.get("login.password"); > if (password == null) password = (String) context.get("password"); > - > + String userDelegatorName = (String) context.get("userDelegatorName"); > // get the visitId for the history entity > String visitId = (String) context.get("visitId"); > > @@ -193,7 +193,9 @@ > // successful login & no loggout flag, no > need to change anything, so don't do the store > doStore = false; > } > - > + > if("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + userLogin.set("delegator", > userDelegatorName); > + } > successfulLogin = "Y"; > > if (!isServiceAuth) { > Index: > /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl > (working copy) > @@ -96,6 +96,7 @@ > </div> > <div id="masthead"> > <ul> > + <li> Delegator : ${delegator.getDelegatorName()}</li> > <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y"> > <li class="logo-area"> > <#if shortcutIcon?has_content> > Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl > =================================================================== > --- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl > (revision 705872) > +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl > (working copy) > @@ -18,7 +18,7 @@ > --> > > <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = > requestAttributes.uiLabelMap></#if> > - > +<#assign multidelegator = > Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", > "multi.delegator")> > <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists> > <#if previousParams?has_content> > <#assign previousParams = "?" + previousParams> > @@ -46,6 +46,12 @@ > <td class="label">${uiLabelMap.CommonPassword}</td> > <td><input type="password" name="PASSWORD" value="" > size="20"/></td> > </tr> > + <#if multidelegator=="true"> > + <tr> > + <td class="label">${uiLabelMap.CommonCompany}</td> > + <td><input type="text" class="inputBox" name="DELEGATOR" value="" > size="20"/></td> > + </tr> > + </#if> > <tr> > <td colspan="2" align="center"> > <input type="submit" value="${uiLabelMap.CommonLogin}"/> > Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml > =================================================================== > --- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml > (revision 705872) > +++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml > (working copy) > @@ -53,6 +53,9 @@ > <group-map group-name="org.ofbiz" datasource-name="localderby"/> > <group-map group-name="org.ofbiz.olap" > datasource-name="localderbyolap"/> > </delegator> > + <delegator name="entreprise1" entity-model-reader="main" > entity-group-reader="main" entity-eca-reader="main"> > + <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/> > > + </delegator> > <delegator name="default-no-eca" entity-model-reader="main" > entity-group-reader="main" entity-eca-reader="main" > entity-eca-enabled="false" distributed-cache-clear-enabled="false"> > <group-map group-name="org.ofbiz" datasource-name="localderby"/> > <group-map group-name="org.ofbiz.olap" > datasource-name="localderbyolap"/> > @@ -327,6 +330,33 @@ > pool-maxsize="250"/> > <!-- <jndi-jdbc jndi-server-name="localjndi" > jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> --> > </datasource> > + <datasource name="localpostgres1" > + helper-class="org.ofbiz.entity.datasource.GenericHelperDAO" > + schema-name="public" > + field-type-name="postgres" > + check-on-start="true" > + add-missing-on-start="true" > + use-fk-initially-deferred="false" > + alias-view-columns="false" > + join-style="ansi" > + use-binary-type-for-blob="true"> > + <!-- use this attribute to make the EntityListIterator more > effective for pgjdbc 7.5devel and later: > + result-fetch-size="50" > + --> > + <read-data reader-name="seed"/> > + <read-data reader-name="seed-initial"/> > + <read-data reader-name="demo"/> > + <read-data reader-name="ext"/> > + <inline-jdbc > + jdbc-driver="org.postgresql.Driver" > + jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1" > + jdbc-username="ofbiz" > + jdbc-password="ofbiz" > + isolation-level="ReadCommitted" > + pool-minsize="2" > + pool-maxsize="250"/> > + <!-- <jndi-jdbc jndi-server-name="localjndi" > jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> --> > + </datasource> > > <datasource name="localpostgres" > helper-class="org.ofbiz.entity.datasource.GenericHelperDAO" > Index: > /home/youssef/workspace/ofbiz/framework/security/config/security.properties > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/security/config/security.properties > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/security/config/security.properties > (working copy) > @@ -77,3 +77,6 @@ > > # -- Hours after which EmailAdressVerification should expire > email_verification.expire.hours=48 > + > +# -- are we using multi delegator > +multi.delegator=false > Index: > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java > (working copy) > @@ -182,7 +182,14 @@ > public GenericDelegator getDelegator() { > return dispatcher.getDelegator(); > } > - > + > + /** > + * @see org.ofbiz.service.LocalDispatcher#setDelegator() > + */ > + public void setDelegator(GenericDelegator delegator) { > + dispatcher.setDelegator(delegator); > + } > + > /** > * @see org.ofbiz.service.LocalDispatcher#getSecurity() > */ > Index: > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java > (working copy) > @@ -100,7 +100,9 @@ > public GenericDelegator getDelegator() { > return this.delegator; > } > - > + public void setDelegator(GenericDelegator delegator) { > + this.delegator=delegator; > + } > public synchronized List<Job> poll() { > List<Job> poll = FastList.newInstance(); > > Index: > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java > (working copy) > @@ -317,7 +317,7 @@ > * @return GenericEntityDelegator associated with this dispatcher > */ > public GenericDelegator getDelegator(); > - > + public void setDelegator(GenericDelegator delegator); > /** > * Gets the Security object associated with this dispatcher > * @return Security object associated with this dispatcher > Index: > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java > (working copy) > @@ -789,7 +789,14 @@ > public GenericDelegator getDelegator() { > return this.delegator; > } > - > + > + /** > + * Gets the GenericDelegator associated with this dispatcher > + * @return GenericDelegator associated with this dispatcher > + */ > + public void setDelegator(GenericDelegator delegator) { > + this.delegator = delegator; > + } > /** > * Gets the Security object associated with this dispatcher > * @return Security object associated with this dispatcher > Index: > /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml > =================================================================== > --- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml > (revision 705872) > +++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml > (working copy) > @@ -271,6 +271,15 @@ > <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value> > <value xml:lang="zh">密码是空的,请重新输入。</value> > </property> > + <property key="loginevents.delegator_not_found_reenter"> > + <value xml:lang="de">Company not found, please re-enter.</value> > + <value xml:lang="en">Company not found, please re-enter.</value> > + <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value> > + <value xml:lang="it">Company not found, please re-enter.</value> > + <value xml:lang="ru">Company not found, please re-enter.</value> > + <value xml:lang="th">Company not found, please re-enter.</value> > + <value xml:lang="zh">Company not found, please re-enter.</value> > + </property> > <property key="loginevents.unable_to_login_this_application"> > <value xml:lang="de">Sie können sich nicht bei dieser Anwendung > anmelden (benötigte Berechtigungen fehlen).</value> > <value xml:lang="en">Login for this application couldn't be > completed (required permissions missing).</value> > Index: > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java > (working copy) > @@ -18,6 +18,8 @@ > > *******************************************************************************/ > package org.ofbiz.webapp.control; > > +import static org.ofbiz.base.util.UtilGenerics.checkMap; > + > import java.io.UnsupportedEncodingException; > import java.math.BigInteger; > import java.net.URLEncoder; > @@ -23,7 +25,6 @@ > import java.net.URLEncoder; > import java.security.cert.X509Certificate; > import java.util.Enumeration; > -import java.util.HashMap; > import java.util.List; > import java.util.Map; > import java.util.regex.Matcher; > @@ -47,7 +48,6 @@ > import org.ofbiz.base.util.GeneralException; > import org.ofbiz.base.util.KeyStoreUtil; > import org.ofbiz.base.util.UtilFormatOut; > -import static org.ofbiz.base.util.UtilGenerics.checkMap; > import org.ofbiz.base.util.UtilHttp; > import org.ofbiz.base.util.UtilMisc; > import org.ofbiz.base.util.UtilProperties; > @@ -58,7 +58,6 @@ > import org.ofbiz.entity.GenericValue; > import org.ofbiz.entity.condition.EntityCondition; > import org.ofbiz.entity.condition.EntityConditionList; > -import org.ofbiz.entity.condition.EntityExpr; > import org.ofbiz.entity.condition.EntityOperator; > import org.ofbiz.entity.model.ModelEntity; > import org.ofbiz.entity.transaction.GenericTransactionException; > @@ -68,6 +67,7 @@ > import org.ofbiz.service.LocalDispatcher; > import org.ofbiz.service.ModelService; > import org.ofbiz.service.ServiceUtil; > +import org.ofbiz.webapp.event.CoreEvents; > import org.ofbiz.webapp.stats.VisitHandler; > > /** > @@ -192,6 +192,9 @@ > Debug.logError("Could not find UserLogin record for > setLoggedOut with userLoginId [" + userLoginId + "]", module); > } else { > userLogin.set("hasLoggedOut", "Y"); > + > if("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + userLogin.set("delegator", null); > + } > userLogin.store(); > } > } catch (GenericEntityException e) { > @@ -308,9 +311,11 @@ > > String username = request.getParameter("USERNAME"); > String password = request.getParameter("PASSWORD"); > - > + String userDelegatorName = request.getParameter("DELEGATOR"); > + > if (username == null) username = (String) > session.getAttribute("USERNAME"); > if (password == null) password = (String) > session.getAttribute("PASSWORD"); > + if (userDelegatorName == null) userDelegatorName = (String) > session.getAttribute("DELEGATOR"); > > // allow a username and/or password in a request attribute to > override the request parameter or the session attribute; this way a > preprocessor can play with these a bit... > if (UtilValidate.isNotEmpty((String) > request.getAttribute("USERNAME"))) { > @@ -319,6 +324,11 @@ > if (UtilValidate.isNotEmpty((String) > request.getAttribute("PASSWORD"))) { > password = (String) request.getAttribute("PASSWORD"); > } > + > if("true".equals(UtilProperties.getPropertyValue("securiy.properties", > "multi.delegator"))){ > + if (UtilValidate.isNotEmpty((String) > request.getAttribute("DELEGATOR"))) { > + userDelegatorName = (String) > request.getAttribute("DELEGATOR"); > + } > + } > > List<String> unpwErrMsgList = FastList.newInstance(); > if (UtilValidate.isEmpty(username)) { > @@ -339,7 +349,21 @@ > if ((password != null) && > ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", > "password.lowercase")))) { > password = password.toLowerCase(); > } > - > + if ((userDelegatorName == null) && > ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", > "multi.delegator")))) { > + String errMsg = UtilProperties.getMessage(resourceWebapp, > "loginevents.delegator_not_found_reenter", UtilHttp.getLocale(request)); > + request.setAttribute("_ERROR_MESSAGE_", errMsg); > + return "error"; > + } > + GenericDelegator userDelegator=null; > + if > ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))) { > + > userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName); > + if (userDelegator==null){ > + String errMsg = UtilProperties.getMessage(resourceWebapp, > "loginevents.delegator_not_found_reenter", UtilHttp.getLocale(request)); > + request.setAttribute("_ERROR_MESSAGE_", errMsg); > + return "error"; > + } > + } > + > String requirePasswordChange = > request.getParameter("requirePasswordChange"); > > // get the visit id to pass to the userLogin for history > @@ -373,6 +397,10 @@ > } > > try { > + if > ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))) { > + dispatcher.setDelegator(userDelegator); > + request.getSession().setAttribute("delegatorName", > userDelegatorName); > + } > result = dispatcher.runSync("userLogin", > UtilMisc.toMap("login.username", username, "login.password", password, > "visitId", visitId, "locale", UtilHttp.getLocale(request))); > } catch (GenericServiceException e) { > Debug.logError(e, "Error calling userLogin service", module); > @@ -385,6 +413,18 @@ > if > (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) > { > GenericValue userLogin = (GenericValue) result.get("userLogin"); > Map<String, Object> userLoginSession = > checkMap(result.get("userLoginSession"), String.class, Object.class); > + > + try{ > + > if("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + userLogin.set("delegator", userDelegatorName); > + } > + userLogin.store(); > + } > + catch(GenericEntityException e){ > + request.setAttribute("_ERROR_MESSAGE_", "Unable to store > userLogin"); > + return "error"; > + } > + > if (userLogin != null && > "Y".equals(userLogin.getString("requirePasswordChange"))) { > return "requirePasswordChange"; > } > @@ -419,7 +459,15 @@ > if (userLoginSession != null) { > session.setAttribute("userLoginSession", userLoginSession); > } > - > + > + > + > + //Begin specific > + if > ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))) { > + request.getSession().setAttribute("delegatorName", > userLogin.getString("delegator")); > + CoreEvents.changeDelegator(request, response); > + } > + //End specific > request.setAttribute("_LOGIN_PASSED_", "TRUE"); > > // run the after-login events > @@ -499,6 +547,16 @@ > // set the logged out flag > LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), > delegator); > > + //Begin specific :come back to default delegator for next login > + > if("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + GenericDelegator > defaultdelegator=GenericDelegator.getGenericDelegator("default"); > + request.getSession().setAttribute("delegatorName", > defaultdelegator.getDelegatorName()); > + HttpServletResponse response=null; > + CoreEvents.changeDelegator(request, response); > + } > + //End specific > + > + > // this is a setting we don't want to lose, although it would be > good to have a more general solution here... > String currCatalog = (String) > session.getAttribute("CURRENT_CATALOG_ID"); > // also make sure the delegatorName is preserved, especially so that > a new Visit can be created > @@ -778,8 +836,14 @@ > GenericValue currentUserLogin = (GenericValue) > session.getAttribute("userLogin"); > if (currentUserLogin != null) { > if > (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) > { > - // is the same user, just carry on... > - return "success"; > + GenericDelegator currentDelegator=(GenericDelegator) > session.getAttribute("delegator"); > + > if(("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){ > + // is the same user, just carry on... > + return "success"; > + } > + else{ > + return "success"; > + } > } > > // logout the current user and login the new user... > @@ -786,8 +850,19 @@ > logout(request, response); > // ignore the return value; even if the operation failed we > want to set the new UserLogin > } > - > + > doBasicLogin(userLogin, request); > + > + //Begin specific > + > if("true".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + String userDelegatorName = userLogin.getString("delegator"); > + request.getSession().setAttribute("delegatorName", > userDelegatorName); > + request.setAttribute("delegatorName", userDelegatorName); > + CoreEvents.changeDelegator(request, response); > + } > + //End specific > + > + > } else { > Debug.logWarning("Could not find userLogin for external login > key: " + externalKey, module); > } > Index: > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java > =================================================================== > --- > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java > (revision 705872) > +++ > /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java > (working copy) > @@ -18,6 +18,9 @@ > > *******************************************************************************/ > package org.ofbiz.webapp.event; > > +import static org.ofbiz.base.util.UtilGenerics.checkCollection; > +import static org.ofbiz.base.util.UtilGenerics.checkMap; > + > import java.io.File; > import java.io.FileInputStream; > import java.io.FileNotFoundException; > @@ -28,7 +31,6 @@ > import java.util.Iterator; > import java.util.Locale; > import java.util.Map; > -import java.util.Set; > import java.util.TimeZone; > > import javax.servlet.http.HttpServletRequest; > @@ -38,8 +40,6 @@ > import javolution.util.FastMap; > > import org.ofbiz.base.util.Debug; > -import static org.ofbiz.base.util.UtilGenerics.checkCollection; > -import static org.ofbiz.base.util.UtilGenerics.checkMap; > import org.ofbiz.base.util.UtilHttp; > import org.ofbiz.base.util.UtilProperties; > import org.ofbiz.base.util.UtilValidate; > @@ -54,6 +54,7 @@ > import org.ofbiz.service.ModelService; > import org.ofbiz.service.ServiceDispatcher; > import org.ofbiz.service.calendar.RecurrenceRule; > +import org.ofbiz.webapp.control.LoginWorker; > import org.ofbiz.webapp.control.RequestHandler; > > /** > @@ -104,12 +105,54 @@ > String delegatorName = request.getParameter("delegator"); > Security security = (Security) request.getAttribute("security"); > Locale locale = UtilHttp.getLocale(request); > + GenericDelegator delegator=null; > + //Begin multi-delegator Specific : search for delegatorName into > session information > + if("".equals(UtilProperties.getPropertyValue("security.properties", > "multi.delegator"))){ > + String externalKey = > request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR); > + if (externalKey != null) { > + GenericValue userLogin = (GenericValue) > LoginWorker.externalLoginKeys.get(externalKey); > + if (userLogin != null && delegatorName==null) { > + delegatorName = userLogin.getString("delegator"); > + } > + } > + > + if(delegatorName==null){ > + delegatorName = (String) > request.getSession().getAttribute("delegatorName"); > + } > + if (delegatorName == null) { > + String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.delegator_not_passed", locale); > + request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > + return "error"; > + } > > - if (!security.hasPermission("ENTITY_MAINT", request.getSession())) { > - String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.not_authorized_use_fct", locale); > - request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > - return "error"; > + delegator = GenericDelegator.getGenericDelegator(delegatorName); > + > + if (delegator == null) { > + String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.no_delegator_name_defined", locale); > + request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > + return "error"; > + } > + //set the secruity delegator to precise the database against wich > the user permissions are checked > + security.setDelegator(delegator); > + if (!security.hasPermission("ENTITY_MAINT", > request.getSession())) { > + String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.not_authorized_use_fct", locale); > + request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > + return "error"; > + } > + } > + //End multi-delegator specific > + else{ > + > + if (!security.hasPermission("ENTITY_MAINT", > request.getSession())) { > + String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.not_authorized_use_fct", locale); > + request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > + return "error"; > + } > + > + > + delegator = GenericDelegator.getGenericDelegator(delegatorName); > } > + > if (delegatorName == null) { > String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.delegator_not_passed", locale); > request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > @@ -115,15 +158,6 @@ > request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > return "error"; > } > - > - GenericDelegator delegator = > GenericDelegator.getGenericDelegator(delegatorName); > - > - if (delegator == null) { > - String errMsg = > UtilProperties.getMessage(CoreEvents.err_resource, > "coreEvents.no_delegator_name_defined", locale); > - request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg); > - return "error"; > - } > - > // now change the dispatcher to use this delegator > LocalDispatcher dispatcher = (LocalDispatcher) > request.getAttribute("dispatcher"); > DispatchContext dctx = dispatcher.getDispatchContext(); > @@ -144,7 +178,14 @@ > > request.getSession().setAttribute("delegator", delegator); > request.getSession().setAttribute("dispatcher", dispatcher); > - > + dispatcher.getJobManager().setDelegator(delegator); > + dispatcher.setDelegator(delegator); > + request.getSession().setAttribute("delegatorName", > delegator.getDelegatorName()); > + request.setAttribute("delegator", delegator); > + request.setAttribute("delegatorName", delegator.getDelegatorName()); > + request.setAttribute("dispatcher", dispatcher); > + request.setAttribute("security", security); > + > return "success"; > } > -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.