Unverified Commit 5bff5fa7 authored by 张亮's avatar 张亮 Committed by GitHub
Browse files

Merge pull request #1843 from tristaZero/dev

Add ShardingEncryptorConfiguration
parents e7f2ddda c298a4a9
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.shardingsphere.api.config;

import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.encrypt.ShardingEncryptorFactory;
import org.apache.shardingsphere.core.encrypt.encryptor.ShardingEncryptor;
import org.apache.shardingsphere.core.routing.strategy.ShardingEncryptorStrategy;

import java.util.Properties;

/**
 * Encryptor configuration.
 *
 * @author panjuan
 */
@RequiredArgsConstructor
@Getter
public final class EncryptorConfiguration {
    
    private final String type;
    
    private final String columns;
    
    private final String assistedQueryColumns;
    
    private final Properties props;
    
    /**
     * Get sharding encryptor strategy.
     *
     * @return sharding encryptor strategy
     */
    public ShardingEncryptorStrategy getShardingEncryptorStrategy() {
        if (Strings.isNullOrEmpty(type) || Strings.isNullOrEmpty(columns)) {
            return null;
        }
        ShardingEncryptor shardingEncryptor = ShardingEncryptorFactory.newInstance(type);
        shardingEncryptor.setProperties(props);
        return getShardingEncryptorStrategy(shardingEncryptor);
    }
    
    private ShardingEncryptorStrategy getShardingEncryptorStrategy(final ShardingEncryptor shardingEncryptor) {
        return Strings.isNullOrEmpty(assistedQueryColumns) ? new ShardingEncryptorStrategy(Splitter.on(",").trimResults().splitToList(columns), shardingEncryptor) 
                : new ShardingEncryptorStrategy(Splitter.on(",").trimResults().splitToList(columns), Splitter.on(",").trimResults().splitToList(assistedQueryColumns), shardingEncryptor);
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.api.config.rule;

import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.api.config.EncryptorConfiguration;
import org.apache.shardingsphere.api.config.KeyGeneratorConfiguration;
import org.apache.shardingsphere.api.config.strategy.ShardingStrategyConfiguration;

@@ -42,5 +43,7 @@ public final class TableRuleConfiguration implements RuleConfiguration {
    
    private KeyGeneratorConfiguration keyGeneratorConfig;
    
    private EncryptorConfiguration encryptorConfig;
    
    private String logicIndex;
}
+65 −0
Original line number Diff line number Diff line
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.shardingsphere.core.encrypt;

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.core.encrypt.encryptor.ShardingEncryptor;
import org.apache.shardingsphere.core.exception.ShardingConfigurationException;
import org.apache.shardingsphere.spi.NewInstanceServiceLoader;

import java.util.Collection;

/**
 * Sharding encryptor factory.
 * 
 * @author panjuan
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ShardingEncryptorFactory {
    
    static {
        NewInstanceServiceLoader.register(ShardingEncryptor.class);
    }
    
    /**
     * Create sharding encryptor.
     * 
     * @param encryptorType encryptor type
     * @return encryptor instance
     */
    public static ShardingEncryptor newInstance(final String encryptorType) {
        Collection<ShardingEncryptor> shardingEncryptors = loadEncryptors(encryptorType);
        if (shardingEncryptors.isEmpty()) {
            throw new ShardingConfigurationException("Invalid encryptor type.");
        }
        return shardingEncryptors.iterator().next();
    }
    
    private static Collection<ShardingEncryptor> loadEncryptors(final String encryptorType) {
        return Collections2.filter(NewInstanceServiceLoader.newServiceInstances(ShardingEncryptor.class), new Predicate<ShardingEncryptor>() {
            
            @Override
            public boolean apply(final ShardingEncryptor input) {
                return encryptorType.equalsIgnoreCase(input.getType());
            }
        });
    }
}
+65 −0
Original line number Diff line number Diff line
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.shardingsphere.core.encrypt.encryptor;

import java.util.Properties;

/**
 * Sharding encryptor.
 *
 * @author panjuan
 */
public interface ShardingEncryptor {
    
    /**
     * Get sharding encryptor type.
     * 
     * @return sharding encryptor type
     */
    String getType();
    
    /**
     * Get properties.
     * 
     * @return properties
     */
    Properties getProperties();
    
    /**
     * Set properties.
     * 
     * @param properties properties
     */
    void setProperties(Properties properties);
    
    /**
     * Encode.
     * 
     * @param plaintext plaintext
     * @return ciphertext
     */
    String encode(String plaintext);
    
    /**
     * Decode.
     * 
     * @param ciphertext ciphertext
     * @return plaintext
     */
    String decode(String ciphertext);
}
+34 −0
Original line number Diff line number Diff line
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.shardingsphere.core.encrypt.encryptor;

/**
 * Sharding query assisted encryptor.
 *
 * @author panjuan
 */
public interface ShardingQueryAssistedEncryptor extends ShardingEncryptor {
    
    /**
     * Query assisted encode.
     * 
     * @param plaintext plaintext
     * @return ciphertext
     */
    String queryAssistedEncode(String plaintext);
}
Loading