All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.client.impl.protocol.task.CreateProxiesMessageTask Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hazelcast.client.impl.protocol.task;

import com.hazelcast.client.impl.protocol.ClientMessage;
import com.hazelcast.client.impl.protocol.codec.ClientCreateProxiesCodec;
import com.hazelcast.cluster.Member;
import com.hazelcast.core.MemberLeftException;
import com.hazelcast.instance.impl.Node;
import com.hazelcast.internal.nio.Connection;
import com.hazelcast.security.SecurityContext;
import com.hazelcast.security.permission.ActionConstants;
import com.hazelcast.security.SecurityInterceptorConstants;
import com.hazelcast.spi.impl.operationservice.Operation;
import com.hazelcast.spi.impl.proxyservice.ProxyService;
import com.hazelcast.spi.impl.proxyservice.impl.ProxyInfo;
import com.hazelcast.spi.impl.proxyservice.impl.operations.PostJoinProxyOperation;

import java.security.AccessControlException;
import java.security.Permission;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;


public class CreateProxiesMessageTask extends AbstractMultiTargetMessageTask>>
        implements Supplier {

    private List> filteredProxies;

    public CreateProxiesMessageTask(ClientMessage clientMessage, Node node, Connection connection) {
        super(clientMessage, node, connection);
    }

    protected Supplier createOperationSupplier() {
        return this;
    }

    @Override
    public Operation get() {
        List proxyInfos = new ArrayList<>(filteredProxies.size());
        for (Map.Entry proxy : filteredProxies) {
            proxyInfos.add(new ProxyInfo(proxy.getValue(), proxy.getKey(), endpoint.getUuid()));
        }
        return new PostJoinProxyOperation(proxyInfos);
    }

    @Override
    protected Object reduce(Map map) throws Throwable {
        for (Object result : map.values()) {
            if (result instanceof Throwable throwable && !(result instanceof MemberLeftException)) {
                throw throwable;
            }
        }
        return null;
    }

    @Override
    public Collection getTargets() {
        return nodeEngine.getClusterService().getMembers();
    }

    @Override
    protected List> decodeClientMessage(ClientMessage clientMessage) {
        return ClientCreateProxiesCodec.decodeRequest(clientMessage);
    }

    @Override
    protected ClientMessage encodeResponse(Object response) {
        return ClientCreateProxiesCodec.encodeResponse();
    }

    /**
     *@see #beforeProcess()
     */
    @Override
    public Permission getRequiredPermission() {
        return null;
    }

    @Override
    protected void beforeProcess() {
        // replacement for getRequiredPermission-based checks, we have to check multiple permission
        SecurityContext securityContext = clientEngine.getSecurityContext();
        if (securityContext != null) {
            filteredProxies = new ArrayList<>(parameters.size());
            ProxyService proxyService = clientEngine.getProxyService();
            for (Map.Entry proxy : parameters) {
                String objectName = proxy.getKey();
                String serviceName = proxy.getValue();
                if (proxyService.existsDistributedObject(serviceName, objectName)) {
                    continue;
                }
                try {
                    Permission permission = ActionConstants.getPermission(objectName, serviceName,
                            ActionConstants.ACTION_CREATE);
                    securityContext.checkPermission(endpoint.getSubject(), permission);
                    filteredProxies.add(proxy);
                } catch (AccessControlException ace) {
                    logger.info("Insufficient client permissions. Proxy won't be created for type '" + serviceName + "': "
                            + objectName);
                    if (logger.isFineEnabled()) {
                        logger.fine("Skipping proxy creation due to AccessControlException", ace);
                    }
                } catch (Exception e) {
                    // unknown serviceName or another unexpected issue
                    logger.warning("Proxy won't be created for type '" + serviceName + "': " + objectName, e);
                }
            }
        } else {
            filteredProxies = parameters;
        }
        super.beforeProcess();
    }

    @Override
    public String getServiceName() {
        return null;
    }

    @Override
    public String getDistributedObjectName() {
        return null;
    }

    @Override
    public String getMethodName() {
        return SecurityInterceptorConstants.CREATE_PROXIES;
    }

    @Override
    public Object[] getParameters() {
        return new Object[]{parameters};
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy