[ 
https://issues.apache.org/jira/browse/GEODE-5618?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16595468#comment-16595468
 ] 

ASF subversion and git services commented on GEODE-5618:
--------------------------------------------------------

Commit 60ea939e85e7d94da9d8eb64d5b88dd62edb2618 in geode's branch 
refs/heads/feature/GEODE-5338 from Juan José Ramos
[ https://gitbox.apache.org/repos/asf?p=geode.git;h=60ea939 ]

GEODE-5618: Auth Attributes in FunctionService (#2360)

   * When a client executes a function using the id instead of the actual 
instance, an internal invocation to the `GetFunctionAttributeOp` function is 
executed to get the metadata about the original function itself. This 
invocation doesn't set the user attributes requried by the authentication 
mechanism, so the entire invocation fails.
   * Added distributed tests.
   * Classes `ServerFunctionExecutor` and `ServerRegionFunctionExecutor` now 
set the `userAttributes` in the local thread before getting the metadata when 
the function is executed by id.

> FunctionService.onServer() and FunctionService.onRegion() fail when 
> multiuser-authentication=true
> -------------------------------------------------------------------------------------------------
>
>                 Key: GEODE-5618
>                 URL: https://issues.apache.org/jira/browse/GEODE-5618
>             Project: Geode
>          Issue Type: Bug
>          Components: functions, security
>            Reporter: Juan José Ramos Cassella
>            Assignee: Juan José Ramos Cassella
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> The problem resides within the {{ServerFunctionExecutor}} class, specifically 
> in the following section of code:
> {code:title=ServerFunctionExecutor.java|borderStyle=solid}
> public ResultCollector execute(final String functionName) {
> (...)
>  byte[] functionAttributes = getFunctionAttributes(functionName);
>  if (functionAttributes == null) {
>  Object obj = GetFunctionAttributeOp.execute(this.pool, functionName);
>  functionAttributes = (byte[]) obj;
>  addFunctionAttributes(functionName, functionAttributes);
>  }
> (..)
> }
> {code}
> We are specifically executing an internal function (namely 
> {{GetFunctionAttributeOp}}) to retrieve the metadata for the function 
> executed by the client *without setting the user attributes* required by the 
> authentication mechanism and, as such, the execution fails for this 
> particular function instead of the one executed by the client (it's not even 
> part of the stack trace):
> {noformat}
> Exception in thread "main" java.lang.UnsupportedOperationException: Use Pool 
> APIs for doing operations when multiuser-secure-mode-enabled is set to true.
>  at 
> org.apache.geode.cache.client.internal.PoolImpl.authenticateIfRequired(PoolImpl.java:1549)
>  at 
> org.apache.geode.cache.client.internal.PoolImpl.authenticateIfRequired(PoolImpl.java:1531)
>  at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:781)
>  at 
> org.apache.geode.cache.client.internal.GetFunctionAttributeOp.execute(GetFunctionAttributeOp.java:24)
>  at 
> org.apache.geode.internal.cache.execute.ServerFunctionExecutor.execute(ServerFunctionExecutor.java:310)
> {noformat}
> The other top-level methods from {{ServerFunctionExecutor}} and 
> {{ServerRegionFunctionExecutor}} configure the user attributes before 
> actually executing the function, that's why (as a workaround), the user can 
> use {{FunctionService.onServer(regionService).execute(new MyFunction())}}, 
> works as expected:
> {code}
>  if (proxyCache != null) {
>  if (this.proxyCache.isClosed()) {
>  throw proxyCache.getCacheClosedException("Cache is closed for this user.");
>  }
>  UserAttributes.userAttributes.set(this.proxyCache.getUserAttributes());
>  }
> {code}
> The solution would be to add the same _pre-operation logic_ to the buggy 
> method.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to