Hi, As per the offline discussion with senaka, since the previous fix is causing lot of platform level issues, I'll change BAM/RSS any dependent components to use PrivilegedCarbonContext.getThreadLocalCarbonContext(), and make it work for tenant flow during the stub call.
Thanks, Sinthuka. On Sat, Dec 15, 2012 at 11:43 PM, Senaka Fernando <[email protected]> wrote: > Hi Sinthuja, > > Use PrivilegedCarbonContext.getThreadLocalCarbonContext() in BAM, which > should solve the issue AFAIU. > > Thanks, > Senaka. > > > On Sat, Dec 15, 2012 at 11:40 PM, Senaka Fernando <[email protected]> wrote: > >> Hi Sinthuja, >> >> No I don't think this will break BAM analytics functionality. Also, the >> proposed fix won't work since the incoming tenant ID is valid, but the >> username is wrong, which is the issue that we ran into. I have made the >> change in r151877 (please note the changes are in two places). Can you >> validate BAM and if it breaks, can you paste the trace in here? >> >> Thanks, >> Senaka. >> >> >> On Sat, Dec 15, 2012 at 11:34 PM, Sinthuja Ragendran >> <[email protected]>wrote: >> >>> Hi, >>> >>> this change was done because there was an issue when starting tenant >>> flow during stub call. Please refer mail thread in 'problem in starting >>> tenant flow with stub call'. Therefore If you revert this change it will >>> break BAM analytics functionality . :( >>> >>> So rather reverting the change in getCurrentCarbonContextHolder(), shall >>> we check whether returned tenant id from the ThreadLocalCarbonContext is >>> valid and if it's invalid shall we pick it from MessageContext and >>> ConfigurationContext? >>> >>> >>> public static CarbonContextDataHolder getCurrentCarbonContextHolder() { >>> //1. Check ThreadLocalCarbonContextHolder >>> CarbonContextDataHolder currentCarbonContext = >>> getThreadLocalCarbonContextHolder(); >>> *if (MultitenantConstants.INVALID_TENANT_ID == >>> currentCarbonContext.getTenantId()){* >>> >>> try { >>> //2. Check MessageContext >>> MessageContext messageContext = >>> MessageContext.getCurrentMessageContext(); >>> if (messageContext != null) { >>> currentCarbonContext = >>> getCurrentCarbonContextHolder(messageContext); >>> } else { >>> //3. Check ConfigurationContext >>> currentCarbonContext = >>> getCurrentCarbonContextHolder((ConfigurationContext) null); >>> } >>> } catch (NullPointerException ignore) { >>> currentCarbonContext = null; >>> } catch (NoClassDefFoundError ignore) { >>> currentCarbonContext = null; >>> } >>> } >>> return currentCarbonContext; >>> } >>> >>> >>> Thanks, >>> Sinthuja. >>> >>> >>> On Sat, Dec 15, 2012 at 10:40 PM, Senaka Fernando <[email protected]>wrote: >>> >>>> Hi all, >>>> >>>> So, I debugged this and here's the scenario. The e-mail is a bit >>>> lengthy but it explains the root cause of this, :). >>>> >>>> *Normal Login Sequence, without Basic Auth Headers* >>>> >>>> 1. Login Request Comes in. >>>> 2. Hits the CarbonContextCreator valve, which sets the details to >>>> Thread Local CarbonContext (now the authenticated session has not been >>>> created so it sets username null). >>>> 3. Authentication happens, which updates session. >>>> 4. Subsequent requests are made using the session, which user >>>> separate threads. >>>> 5. Hits the CarbonContextCreator valve, which sets the details to >>>> Thread Local CarbonContext (now the authenticated session has already >>>> been >>>> created so it reads proper username). >>>> 6. Hits AbstractAdmin which uses CarbonContext.getCurrentContext() >>>> 7. Returns Context with proper values. >>>> >>>> *Login with Basic Auth Sequence.* >>>> >>>> 1. Login Request Comes in. >>>> 2. Hits the CarbonContextCreator valve, which sets the details to >>>> Thread Local CarbonContext (now the authenticated session has not been >>>> created so it sets username null). >>>> 3. Authentication happens, which updates session. >>>> 4. Hits AbstractAdmin which uses CarbonContext.getCurrentContext() >>>> 5. Returns Context with *wrong* values. >>>> >>>> Now, as you can see, the wrong values are returned because >>>> the CarbonContextCreator valve was not hit after a valid session was >>>> available. If you take a look @ how the CarbonContext.getCurrentContext() >>>> works, >>>> >>>> public static CarbonContextDataHolder getCurrentCarbonContextHolder() { >>>> //1. Check ThreadLocalCarbonContextHolder >>>> CarbonContextDataHolder currentCarbonContext = >>>> getThreadLocalCarbonContextHolder(); >>>> if (null == currentCarbonContext){ >>>> try { >>>> //2. Check MessageContext >>>> MessageContext messageContext = >>>> MessageContext.getCurrentMessageContext(); >>>> if (messageContext != null) { >>>> currentCarbonContext = >>>> getCurrentCarbonContextHolder(messageContext); >>>> } else { >>>> //3. Check ConfigurationContext >>>> currentCarbonContext = >>>> getCurrentCarbonContextHolder((ConfigurationContext) null); >>>> } >>>> } catch (NullPointerException ignore) { >>>> currentCarbonContext = null; >>>> } catch (NoClassDefFoundError ignore) { >>>> currentCarbonContext = null; >>>> } >>>> } >>>> return currentCarbonContext; >>>> } >>>> >>>> You'll understand that it, >>>> >>>> 1. First checks the thread >>>> 2. Then checks the message context >>>> 3. And finally the configuration context >>>> >>>> If you expand on step #2, you'll find that it will utilize the context >>>> on the session when it checks the message context. Therefore, in the second >>>> sequence, if you did not have a valve setting anything to the thread, it >>>> will actually pick the one on session, which will in return mean, >>>> AbstractAdmin would actually see the context with proper values. >>>> >>>> Now, this explains that this interesting situation is a regression of >>>> the fix introduced by the CarbonContextCreator valve modification. Now, >>>> looking back into the reasons of why the CarbonContextCreator valve >>>> modification was needed, you will understand that by doing so, it addressed >>>> issues of having null values on the context returned >>>> by CarbonContext.getCurrentContext(). Digging deeper into why this >>>> happened, I was able to find the older code of this to be: >>>> >>>> public static CarbonContextDataHolder >>>> getCurrentCarbonContextHolder() { >>>> try { >>>> MessageContext messageContext = >>>> MessageContext.getCurrentMessageContext(); >>>> if (messageContext != null) { >>>> return getCurrentCarbonContextHolder(messageContext); >>>> } else { >>>> return >>>> getCurrentCarbonContextHolder((ConfigurationContext) null); >>>> } >>>> } catch (NullPointerException ignore) { >>>> // This is thrown when the message context is not >>>> initialized >>>> // So return the Threadlocal >>>> return getThreadLocalCarbonContextHolder(); >>>> } catch (NoClassDefFoundError ignore) { >>>> // There can be situations where the CarbonContext is >>>> accessed, when there is no Axis2 >>>> // library on the classpath. >>>> return getThreadLocalCarbonContextHolder(); >>>> } >>>> } >>>> >>>> You'll understand that it, >>>> >>>> 1. First checks the message context >>>> 2. Then checks the configuration context >>>> 3. And finally the thread >>>> >>>> Therefore, the actual cause of what CarbonContextCreator valve >>>> modification tried to fix was the change of this sequence. The current >>>> sequence assumes that "*null == currentCarbonContext*" will happen at >>>> times, when the CarbonContext should not exist on the thread, which will >>>> then return the one on the MessageContext or the ConfigurationContext. But, >>>> as it turns out to be, that condition is *always false*. This is >>>> because the initialValue of the thread local variable ensures that this >>>> will never be null. >>>> >>>> So, in summary, as a solution to this, I believe that it is best to >>>> revert the change to the sequencing of getCurrentCarbonContextHolder and >>>> revert back the changes done in the valve, which should solve most issues. >>>> However, the change of sequencing AFAIU, must have been done for a >>>> performance improvement. But, for that, we will have to come up with a >>>> proper implementation that does not lead into these issues. >>>> >>>> Thanks, >>>> Senaka. >>>> >>>> On Sat, Dec 15, 2012 at 9:36 PM, Dimuthu Leelarathne <[email protected] >>>> > wrote: >>>> >>>>> Hi Senaka, >>>>> >>>>> You can reproduce the issue using SOAP UI, without any code. I try >>>>> calling add method of GenericArtifact Admin method. >>>>> >>>>> thanks, >>>>> dimuthu >>>>> >>>>> On Sat, Dec 15, 2012 at 7:44 PM, Senaka Fernando <[email protected]>wrote: >>>>> >>>>>> Hi all, >>>>>> >>>>>> I reproduced this issue. When we log in with Basic Auth Credentials, >>>>>> the CarbonContext does not have the Username as it seems. Shariq can you >>>>>> look into this? >>>>>> >>>>>> Here is a basic code snippet to try this out if you have G-Reg. >>>>>> >>>>>> import >>>>>> org.wso2.carbon.automation.api.clients.registry.SearchAdminServiceClient; >>>>>> import >>>>>> org.wso2.carbon.registry.search.metadata.test.bean.SearchParameterBean; >>>>>> import org.wso2.carbon.registry.search.stub.beans.xsd.ArrayOfString; >>>>>> import >>>>>> org.wso2.carbon.registry.search.stub.beans.xsd.CustomSearchParameterBean; >>>>>> import java.io.File; >>>>>> >>>>>> public static void main(String[] args) throws Exception { >>>>>> System.setProperty("javax.net.ssl.trustStore", >>>>>> "D:\\Work\\Downloads\\wso2greg-4.5.3" + File.separator + "repository" + >>>>>> File.separator + "resources" + File.separator + >>>>>> "security" + File.separator + >>>>>> "wso2carbon.jks"); >>>>>> System.setProperty("javax.net.ssl.trustStorePassword", >>>>>> "wso2carbon"); >>>>>> System.setProperty("javax.net.ssl.trustStoreType", "JKS"); >>>>>> SearchAdminServiceClient searchAdminServiceClient = >>>>>> new SearchAdminServiceClient(" >>>>>> https://localhost:9443/services/", >>>>>> "admin", "admin"); >>>>>> CustomSearchParameterBean searchQuery = new >>>>>> CustomSearchParameterBean(); >>>>>> SearchParameterBean paramBean = new SearchParameterBean(); >>>>>> paramBean.setResourceName("testService"); >>>>>> >>>>>> ArrayOfString[] paramList = paramBean.getParameterList(); >>>>>> >>>>>> searchQuery.setParameterValues(paramList); >>>>>> >>>>>> searchAdminServiceClient.saveAdvancedSearchFilter(searchQuery, "boo"); >>>>>> } >>>>>> >>>>>> On Sat, Dec 15, 2012 at 1:16 PM, Senaka Fernando <[email protected]>wrote: >>>>>> >>>>>>> Hi Shariq, >>>>>>> >>>>>>> On Sat, Dec 15, 2012 at 12:07 PM, Muhammed Shariq >>>>>>> <[email protected]>wrote: >>>>>>> >>>>>>>> On Fri, Dec 14, 2012 at 4:16 PM, Dimuthu Leelarathne < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi Senaka, >>>>>>>>> >>>>>>>>> Username in Carbon Context is null. I am debugging more to find >>>>>>>>> out how the username in CC got set to null. >>>>>>>>> >>>>>>>> >>>>>>>> We fixed a similar issue recently. Recently Sinthuja did a fix to >>>>>>>> give priority to the ThreadLocal CC instead of MessageContext. The CC >>>>>>>> was >>>>>>>> not getting initialized properly for the login request cz the >>>>>>>> TomcatValve >>>>>>>> wasn't initializing the tenant's CC, reason for that is the login >>>>>>>> request >>>>>>>> (/carbon/admin/login_action.jsp) doesn't have tenant info .. >>>>>>>> >>>>>>>> We fixed this by using current MessageContext to populate the CC >>>>>>>> for post login operations (fix in LoggedUserInfoAdmin) .. diff is >>>>>>>> as follows; >>>>>>>> >>>>>>>> - UserRealm userRealm = getUserRealm(); >>>>>>>> + UserRealm userRealm = (UserRealm) >>>>>>>> PrivilegedCarbonContext.getCurrentContext(messageContext >>>>>>>> ).getUserRealm(); >>>>>>>> >>>>>>> >>>>>>> That's a hack. >>>>>>> >>>>>>>> >>>>>>>> You could try this fix just to verify if the issue ur facing has >>>>>>>> anything to do with CC hierarchy ... >>>>>>>> >>>>>>>> Also I changed the tomcat valve to set the username when it gets >>>>>>>> hit .. but in the CC class, it doesn't try to fetch the username if its >>>>>>>> null, it merely does a return expecting upstream code set it .. which >>>>>>>> is >>>>>>>> not happening .. >>>>>>>> >>>>>>> >>>>>>> That has to happen. We need to locate this and fix it. It should be >>>>>>> some combination of calls which ends up leading into this. >>>>>>> >>>>>>> Thanks, >>>>>>> Senaka. >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> thanks, >>>>>>>>> dimuthu >>>>>>>>> >>>>>>>>> >>>>>>>>> On Fri, Dec 14, 2012 at 3:49 PM, Senaka Fernando >>>>>>>>> <[email protected]>wrote: >>>>>>>>> >>>>>>>>>> Hi Dimuthu, >>>>>>>>>> >>>>>>>>>> What's null? Based on that, please check back the stacktrace to >>>>>>>>>> see how that value is obtained and passed into UM - because IIRC we >>>>>>>>>> don't >>>>>>>>>> construct anything about users and/or permissions within the registry >>>>>>>>>> kernel. And, from what I understand it seems that the CCtx does not >>>>>>>>>> seem to >>>>>>>>>> have the proper value of something. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Senaka. >>>>>>>>>> >>>>>>>>>> On Fri, Dec 14, 2012 at 2:57 PM, Dimuthu Leelarathne < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> ManageGenericArtifactService >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> * <http://wso2con.com/> >>>>>>>>>> * >>>>>>>>>> * >>>>>>>>>> >>>>>>>>>> Senaka Fernando* >>>>>>>>>> Member - Integration Technologies Management Committee; >>>>>>>>>> Technical Lead; WSO2 Inc.; http://wso2.com* >>>>>>>>>> Member; Apache Software Foundation; http://apache.org >>>>>>>>>> >>>>>>>>>> E-mail: senaka AT wso2.com >>>>>>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 >>>>>>>>>> Linked-In: http://linkedin.com/in/senakafernando >>>>>>>>>> >>>>>>>>>> *Lean . Enterprise . Middleware >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Dev mailing list >>>>>>>>> [email protected] >>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Thanks, >>>>>>>> Shariq. >>>>>>>> Phone: +94 777 202 225 >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> * <http://wso2con.com/> >>>>>>> * >>>>>>> * >>>>>>> >>>>>>> Senaka Fernando* >>>>>>> Member - Integration Technologies Management Committee; >>>>>>> Technical Lead; WSO2 Inc.; http://wso2.com* >>>>>>> Member; Apache Software Foundation; http://apache.org >>>>>>> >>>>>>> E-mail: senaka AT wso2.com >>>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 >>>>>>> Linked-In: http://linkedin.com/in/senakafernando >>>>>>> >>>>>>> *Lean . Enterprise . Middleware >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> * <http://wso2con.com/> >>>>>> * >>>>>> * >>>>>> >>>>>> Senaka Fernando* >>>>>> Member - Integration Technologies Management Committee; >>>>>> Technical Lead; WSO2 Inc.; http://wso2.com* >>>>>> Member; Apache Software Foundation; http://apache.org >>>>>> >>>>>> E-mail: senaka AT wso2.com >>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 >>>>>> Linked-In: http://linkedin.com/in/senakafernando >>>>>> >>>>>> *Lean . Enterprise . Middleware >>>>>> >>>>>> >>>>> >>>> >>>> >>>> -- >>>> * <http://wso2con.com/> >>>> * >>>> * >>>> >>>> Senaka Fernando* >>>> Member - Integration Technologies Management Committee; >>>> Technical Lead; WSO2 Inc.; http://wso2.com* >>>> Member; Apache Software Foundation; http://apache.org >>>> >>>> E-mail: senaka AT wso2.com >>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 >>>> Linked-In: http://linkedin.com/in/senakafernando >>>> >>>> *Lean . Enterprise . Middleware >>>> >>>> >>>> _______________________________________________ >>>> Dev mailing list >>>> [email protected] >>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>> >>>> >>> >> >> >> -- >> * <http://wso2con.com/> >> * >> * >> >> Senaka Fernando* >> Member - Integration Technologies Management Committee; >> Technical Lead; WSO2 Inc.; http://wso2.com* >> Member; Apache Software Foundation; http://apache.org >> >> E-mail: senaka AT wso2.com >> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 >> Linked-In: http://linkedin.com/in/senakafernando >> >> *Lean . Enterprise . Middleware >> >> > > > -- > * <http://wso2con.com/> > * > * > > Senaka Fernando* > Member - Integration Technologies Management Committee; > Technical Lead; WSO2 Inc.; http://wso2.com* > Member; Apache Software Foundation; http://apache.org > > E-mail: senaka AT wso2.com > **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818 > Linked-In: http://linkedin.com/in/senakafernando > > *Lean . Enterprise . Middleware > >
_______________________________________________ Dev mailing list [email protected] http://wso2.org/cgi-bin/mailman/listinfo/dev
