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

com.ksyun.ks3.service.encryption.Ks3EncryptionClient Maven / Gradle / Ivy

package com.ksyun.ks3.service.encryption;

import java.io.File;
import java.io.InputStream;
import java.util.List;

import com.ksyun.ks3.config.Constants;
import com.ksyun.ks3.dto.CompleteMultipartUploadResult;
import com.ksyun.ks3.dto.CopyResult;
import com.ksyun.ks3.dto.GetObjectResult;
import com.ksyun.ks3.dto.InitiateMultipartUploadResult;
import com.ksyun.ks3.dto.Ks3Object;
import com.ksyun.ks3.dto.ListPartsResult;
import com.ksyun.ks3.dto.ObjectMetadata;
import com.ksyun.ks3.dto.PartETag;
import com.ksyun.ks3.dto.PutObjectResult;
import com.ksyun.ks3.exception.Ks3ClientException;
import com.ksyun.ks3.exception.Ks3ServiceException;
import com.ksyun.ks3.exception.serviceside.NoSuchKeyException;
import com.ksyun.ks3.http.HttpHeaders;
import com.ksyun.ks3.service.Ks3Client;
import com.ksyun.ks3.service.Ks3ClientConfig;
import com.ksyun.ks3.service.encryption.internal.CryptoModuleDispatcher;
import com.ksyun.ks3.service.encryption.internal.EncryptionUtils;
import com.ksyun.ks3.service.encryption.internal.S3CryptoModule;
import com.ksyun.ks3.service.encryption.model.CryptoConfiguration;
import com.ksyun.ks3.service.encryption.model.EncryptionMaterials;
import com.ksyun.ks3.service.encryption.model.EncryptionMaterialsProvider;
import com.ksyun.ks3.service.encryption.model.StaticEncryptionMaterialsProvider;
import com.ksyun.ks3.service.request.AbortMultipartUploadRequest;
import com.ksyun.ks3.service.request.CompleteMultipartUploadRequest;
import com.ksyun.ks3.service.request.CopyObjectRequest;
import com.ksyun.ks3.service.request.CopyPartRequest;
import com.ksyun.ks3.service.request.DeleteObjectRequest;
import com.ksyun.ks3.service.request.GetObjectRequest;
import com.ksyun.ks3.service.request.InitiateMultipartUploadRequest;
import com.ksyun.ks3.service.request.PutObjectRequest;
import com.ksyun.ks3.service.request.UploadPartRequest;
import com.ksyun.ks3.service.response.CompleteMultipartUploadResponse;

/**
 * @author lijunwei[[email protected]]  
 * 
 * @date 2015年4月8日 上午10:30:50
 * 
 * @description 
 **/
public class Ks3EncryptionClient extends Ks3Client{
    private final S3CryptoModule crypto;

    // ///////////////////// Constructors ////////////////
    public Ks3EncryptionClient(
    		String accesskeyid,
            String accesskeysecret,
            EncryptionMaterials encryptionMaterials) {
        this(accesskeyid,accesskeysecret, new StaticEncryptionMaterialsProvider(
                encryptionMaterials));
    }
    public Ks3EncryptionClient(
    		String accesskeyid,
            String accesskeysecret,
            EncryptionMaterialsProvider encryptionMaterialsProvider) {
        this(accesskeyid,accesskeysecret, encryptionMaterialsProvider,
                 new CryptoConfiguration(),new Ks3ClientConfig());
    }


    public Ks3EncryptionClient(
    		String accesskeyid,
            String accesskeysecret,
            EncryptionMaterials encryptionMaterials,
            CryptoConfiguration cryptoConfig,
            Ks3ClientConfig ks3config) {
        this(accesskeyid,accesskeysecret, new StaticEncryptionMaterialsProvider(
                encryptionMaterials), cryptoConfig,ks3config);
    }


    public Ks3EncryptionClient(
            String accesskeyid,
            String accesskeysecret,
            EncryptionMaterials encryptionMaterials,
            CryptoConfiguration cryptoConfig) {
        this(accesskeyid,accesskeysecret, new StaticEncryptionMaterialsProvider(
                encryptionMaterials),
        		cryptoConfig,new Ks3ClientConfig());
    }
    public Ks3EncryptionClient(
            String accesskeyid,
            String accesskeysecret,
            EncryptionMaterialsProvider kekMaterialsProvider,
            CryptoConfiguration cryptoConfig,
            Ks3ClientConfig ks3config) {
        super(accesskeyid, accesskeysecret);
        assertParameterNotNull(kekMaterialsProvider,
                "EncryptionMaterialsProvider parameter must not be null.");
        assertParameterNotNull(cryptoConfig,
                "CryptoConfiguration parameter must not be null.");
        this.crypto = new CryptoModuleDispatcher(new S3DirectImpl(),
                 kekMaterialsProvider
                 ,cryptoConfig);
        this.setKs3config(ks3config);
    }

    private void assertParameterNotNull(Object parameterValue,
            String errorMessage) {
        if (parameterValue == null)
            throw new IllegalArgumentException(errorMessage);
    }

    @Override
    public PutObjectResult putObject(PutObjectRequest req) {
        return crypto.putObjectSecurely(req);
    }

    @Override
    public GetObjectResult getObject(GetObjectRequest req) {
        return crypto.getObjectSecurely(req);
    }

    @Override
    public void deleteObject(DeleteObjectRequest req) {
        req.getRequestConfig().setUserAgent(Constants.KS3_ENCRYPTION_CLIENT_USER_AGENT);
        // Delete the object
        super.deleteObject(req);
        // If it exists, delete the instruction file.
        DeleteObjectRequest instructionDeleteRequest = EncryptionUtils
                .createInstructionDeleteObjectRequest(req);
        try{
        	super.deleteObject(instructionDeleteRequest);
        }catch(NoSuchKeyException e){
        	//可能不存在
        }
    }
    @Override
    public CopyResult copyObject(CopyObjectRequest req){
    	req.getRequestConfig().setUserAgent(Constants.KS3_ENCRYPTION_CLIENT_USER_AGENT);
    	if(super.objectExists(req.getDestinationBucket(),req.getDestinationKey())){
    		throw new Ks3ClientException("copy faild,destination key exists!");
    	}
    	boolean copyinstruction = false;
    	if(super.objectExists(req.getSourceBucket(),req.getSourceKey()+EncryptionUtils.INSTRUCTION_SUFFIX)){
    		if(super.objectExists(req.getDestinationBucket(), req.getDestinationKey()+EncryptionUtils.INSTRUCTION_SUFFIX))
    			throw new Ks3ClientException("copy faild,destination instruction file exists");
    		else
    			copyinstruction = true;
    	}
    	if(copyinstruction)
    		super.copyObject(req.getDestinationBucket(), req.getDestinationKey()+EncryptionUtils.INSTRUCTION_SUFFIX,
    				req.getSourceBucket(), req.getSourceKey()+EncryptionUtils.INSTRUCTION_SUFFIX);
    	return super.copyObject(req);
    }

    @Override
    public CompleteMultipartUploadResult completeMultipartUpload(
            CompleteMultipartUploadRequest req) {
        return crypto.completeMultipartUploadSecurely(req);
    }
    @Override
    public InitiateMultipartUploadResult initiateMultipartUpload(
            InitiateMultipartUploadRequest req) {
        return crypto.initiateMultipartUploadSecurely(req);
    }
    /**
     * 注意,当使用分块上传时,需要依次按顺序上传各个块,不能多线程并发上传或者上传顺序不对。
     */
    @Override
    public PartETag uploadPart(UploadPartRequest uploadPartRequest)
            throws Ks3ClientException, Ks3ServiceException {
        return crypto.uploadPartSecurely(uploadPartRequest);
    }

    @Override
    public CopyResult copyPart(CopyPartRequest copyPartRequest) {
    	//TODO remove InstructionFile
        return crypto.copyPartSecurely(copyPartRequest);
    }

    @Override
    public void abortMultipartUpload(AbortMultipartUploadRequest req) {
        crypto.abortMultipartUploadSecurely(req);
    }

    // /////////////////// Access to the methods in the super class //////////
    /**
     * An internal implementation used to provide limited but direct access to
     * the underlying methods of KS3Client without any encryption or
     * decryption operations.
     */
    private final class S3DirectImpl extends S3Direct {
        @Override
        public PutObjectResult putObject(PutObjectRequest req) {
            return Ks3EncryptionClient.super.putObject(req);
        }

        @Override
        public GetObjectResult getObject(GetObjectRequest req) {
            return Ks3EncryptionClient.super.getObject(req);
        }


        @Override
        public CompleteMultipartUploadResult completeMultipartUpload(
                CompleteMultipartUploadRequest req) {
            return Ks3EncryptionClient.super.completeMultipartUpload(req);
        }

        @Override
        public InitiateMultipartUploadResult initiateMultipartUpload(
                InitiateMultipartUploadRequest req) {
            return Ks3EncryptionClient.super.initiateMultipartUpload(req);
        }

        @Override
        public PartETag uploadPart(UploadPartRequest req)
                throws Ks3ClientException, Ks3ServiceException {
            return Ks3EncryptionClient.super.uploadPart(req);
        }

        @Override
        public CopyResult copyPart(CopyPartRequest req) {
            return Ks3EncryptionClient.super.copyPart(req);
        }

        @Override
        public void abortMultipartUpload(AbortMultipartUploadRequest req) {
            Ks3EncryptionClient.super.abortMultipartUpload(req);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy