HAWQ-1799. delete useless codes from libhdfs3
diff --git a/depends/libhdfs3/CMake/FindCurl.cmake b/depends/libhdfs3/CMake/FindCurl.cmake
deleted file mode 100644
index e93b01d..0000000
--- a/depends/libhdfs3/CMake/FindCurl.cmake
+++ /dev/null
@@ -1,26 +0,0 @@
-# - Try to find the CURL library (curl)
-#
-# Once done this will define
-#
-# CURL_FOUND - System has gnutls
-# CURL_INCLUDE_DIR - The gnutls include directory
-# CURL_LIBRARIES - The libraries needed to use gnutls
-# CURL_DEFINITIONS - Compiler switches required for using gnutls
-
-
-IF (CURL_INCLUDE_DIR AND CURL_LIBRARIES)
- # in cache already
- SET(CURL_FIND_QUIETLY TRUE)
-ENDIF (CURL_INCLUDE_DIR AND CURL_LIBRARIES)
-
-FIND_PATH(CURL_INCLUDE_DIR curl/curl.h)
-
-FIND_LIBRARY(CURL_LIBRARIES curl)
-
-INCLUDE(FindPackageHandleStandardArgs)
-
-# handle the QUIETLY and REQUIRED arguments and set CURL_FOUND to TRUE if
-# all listed variables are TRUE
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(CURL DEFAULT_MSG CURL_LIBRARIES CURL_INCLUDE_DIR)
-
-MARK_AS_ADVANCED(CURL_INCLUDE_DIR CURL_LIBRARIES)
diff --git a/depends/libhdfs3/CMake/FindSSL.cmake b/depends/libhdfs3/CMake/FindSSL.cmake
deleted file mode 100644
index bcbc5d8..0000000
--- a/depends/libhdfs3/CMake/FindSSL.cmake
+++ /dev/null
@@ -1,26 +0,0 @@
-# - Try to find the Open ssl library (ssl)
-#
-# Once done this will define
-#
-# SSL_FOUND - System has gnutls
-# SSL_INCLUDE_DIR - The gnutls include directory
-# SSL_LIBRARIES - The libraries needed to use gnutls
-# SSL_DEFINITIONS - Compiler switches required for using gnutls
-
-
-IF (SSL_INCLUDE_DIR AND SSL_LIBRARIES)
- # in cache already
- SET(SSL_FIND_QUIETLY TRUE)
-ENDIF (SSL_INCLUDE_DIR AND SSL_LIBRARIES)
-
-FIND_PATH(SSL_INCLUDE_DIR openssl/opensslv.h)
-
-FIND_LIBRARY(SSL_LIBRARIES crypto)
-
-INCLUDE(FindPackageHandleStandardArgs)
-
-# handle the QUIETLY and REQUIRED arguments and set SSL_FOUND to TRUE if
-# all listed variables are TRUE
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(SSL DEFAULT_MSG SSL_LIBRARIES SSL_INCLUDE_DIR)
-
-MARK_AS_ADVANCED(SSL_INCLUDE_DIR SSL_LIBRARIES)
\ No newline at end of file
diff --git a/depends/libhdfs3/mock/MockCryptoCodec.h b/depends/libhdfs3/mock/MockCryptoCodec.h
deleted file mode 100644
index a9a220e..0000000
--- a/depends/libhdfs3/mock/MockCryptoCodec.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_MOCK_CRYPTOCODEC_H_
-#define _HDFS_LIBHDFS3_MOCK_CRYPTOCODEC_H_
-
-#include "gmock/gmock.h"
-
-#include "client/CryptoCodec.h"
-#include "client/KmsClientProvider.h"
-
-class MockCryptoCodec: public Hdfs::CryptoCodec {
-public:
- MockCryptoCodec(FileEncryptionInfo *encryptionInfo, shared_ptr<KmsClientProvider> kcp, int32_t bufSize) : CryptoCodec(encryptionInfo, kcp, bufSize) {}
-
- MOCK_METHOD2(init, int(CryptoMethod crypto_method, int64_t stream_offset));
- MOCK_METHOD2(cipher_wrap, std::string(const char * buffer,int64_t size));
-};
-
-#endif /* _HDFS_LIBHDFS3_MOCK_CRYPTOCODEC_H_ */
diff --git a/depends/libhdfs3/mock/MockHttpClient.h b/depends/libhdfs3/mock/MockHttpClient.h
deleted file mode 100644
index 9da1186..0000000
--- a/depends/libhdfs3/mock/MockHttpClient.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_MOCK_HTTPCLIENT_H_
-#define _HDFS_LIBHDFS3_MOCK_HTTPCLIENT_H_
-
-#include "gmock/gmock.h"
-
-#include "client/HttpClient.h"
-#include "client/KmsClientProvider.h"
-#include <boost/property_tree/ptree.hpp>
-
-using boost::property_tree::ptree;
-
-class MockHttpClient: public Hdfs::HttpClient {
-public:
- MOCK_METHOD0(post, std::string());
- MOCK_METHOD0(del, std::string());
- MOCK_METHOD0(put, std::string());
- MOCK_METHOD0(get, std::string());
-
- std::string getPostResult(FileEncryptionInfo &encryptionInfo) {
- ptree map;
- map.put("name", encryptionInfo.getKeyName());
- map.put("iv", encryptionInfo.getIv());
- map.put("material", encryptionInfo.getKey());
-
- std::string json = KmsClientProvider::toJson(map);
- return json;
- }
-
-};
-
-#endif /* _HDFS_LIBHDFS3_MOCK_HTTPCLIENT_H_ */
diff --git a/depends/libhdfs3/mock/MockKmsClientProvider.h b/depends/libhdfs3/mock/MockKmsClientProvider.h
deleted file mode 100644
index 81fb8f3..0000000
--- a/depends/libhdfs3/mock/MockKmsClientProvider.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_MOCK_KMSCLIENTPROVIDER_H_
-#define _HDFS_LIBHDFS3_MOCK_KMSCLIENTPROVIDER_H_
-
-#include "gmock/gmock.h"
-
-#include "client/KmsClientProvider.h"
-
-using namespace Hdfs::Internal;
-
-class MockKmsClientProvider: public Hdfs::KmsClientProvider {
-public:
- MockKmsClientProvider(shared_ptr<RpcAuth> auth, shared_ptr<SessionConfig> conf) : KmsClientProvider(auth, conf) {}
- MOCK_METHOD1(setHttpClient, void(shared_ptr<HttpClient> hc));
- MOCK_METHOD1(getKeyMetadata, ptree(const FileEncryptionInfo &encryptionInfo));
- MOCK_METHOD1(deleteKey, void(const FileEncryptionInfo &encryptionInfo));
- MOCK_METHOD1(decryptEncryptedKey, ptree(const FileEncryptionInfo &encryptionInfo));
- MOCK_METHOD5(createKey, void(const std::string &keyName, const std::string &cipher, const int length, const std::string &material, const std::string &description));
-
- ptree getEDKResult(FileEncryptionInfo &encryptionInfo) {
- ptree map;
- map.put("name", encryptionInfo.getKeyName());
- map.put("iv", encryptionInfo.getIv());
- map.put("material", KmsClientProvider::base64Encode(encryptionInfo.getKey()));
- return map;
- }
-
-};
-
-#endif /* _HDFS_LIBHDFS3_MOCK_KMSCLIENTPROVIDER_H_ */
diff --git a/depends/libhdfs3/src/client/CryptoCodec.cpp b/depends/libhdfs3/src/client/CryptoCodec.cpp
deleted file mode 100644
index bd4443f..0000000
--- a/depends/libhdfs3/src/client/CryptoCodec.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-
-#include "CryptoCodec.h"
-#include "Logger.h"
-
-using namespace Hdfs::Internal;
-
-
-namespace Hdfs {
-
- //copy from java HDFS code
- std::string CryptoCodec::calculateIV(const std::string& initIV, unsigned long counter) {
- char IV[initIV.length()];
-
- int i = initIV.length(); // IV length
- int j = 0; // counter bytes index
- unsigned int sum = 0;
- while (i-- > 0) {
- // (sum >>> Byte.SIZE) is the carry for addition
- sum = (initIV[i] & 0xff) + (sum >> 8);
- if (j++ < 8) { // Big-endian, and long is 8 bytes length
- sum += (char) counter & 0xff;
- counter >>= 8;
- }
- IV[i] = (char) sum;
- }
-
- return std::string(IV, initIV.length());
- }
-
- CryptoCodec::CryptoCodec(FileEncryptionInfo *encryptionInfo, shared_ptr<KmsClientProvider> kcp, int32_t bufSize) :
- encryptionInfo(encryptionInfo), kcp(kcp), bufSize(bufSize)
- {
-
- // Init global status
- ERR_load_crypto_strings();
- OpenSSL_add_all_algorithms();
- OPENSSL_config(NULL);
-
- // Create cipher context
- cipherCtx = EVP_CIPHER_CTX_new();
- cipher = NULL;
-
- padding = 0;
- counter = 0;
- is_init = false;
- }
-
- CryptoCodec::~CryptoCodec()
- {
- if (cipherCtx)
- EVP_CIPHER_CTX_free(cipherCtx);
- }
-
- std::string CryptoCodec::getDecryptedKeyFromKms()
- {
- ptree map = kcp->decryptEncryptedKey(*encryptionInfo);
- std::string key;
- try {
- key = map.get < std::string > ("material");
- } catch (...) {
- THROW(HdfsIOException, "CryptoCodec : Can not get key from kms.");
- }
-
- int rem = key.length() % 4;
- if (rem) {
- rem = 4 - rem;
- while (rem != 0) {
- key = key + "=";
- rem--;
- }
- }
-
- std::replace(key.begin(), key.end(), '-', '+');
- std::replace(key.begin(), key.end(), '_', '/');
-
- LOG(DEBUG3, "CryptoCodec : getDecryptedKeyFromKms material is :%s", key.c_str());
-
- key = KmsClientProvider::base64Decode(key);
- return key;
- }
-
- int CryptoCodec::init(CryptoMethod crypto_method, int64_t stream_offset) {
- // Check CryptoCodec init or not.
- if (is_init)
- return 0;
-
- // Get decrypted key from KMS.
- decryptedKey = getDecryptedKeyFromKms();
-
- // Select cipher method based on the decrypted key length.
- AlgorithmBlockSize = decryptedKey.length();
- if (AlgorithmBlockSize == KEY_LENGTH_256) {
- cipher = EVP_aes_256_ctr();
- } else if (AlgorithmBlockSize == KEY_LENGTH_128) {
- cipher = EVP_aes_128_ctr();
- } else {
- LOG(WARNING, "CryptoCodec : Invalid key length.");
- return -1;
- }
-
- is_init = true;
- // Calculate iv and counter in order to init cipher context with cipher method. Default value is 0.
- if ((resetStreamOffset(crypto_method, stream_offset)) < 0) {
- is_init = false;
- return -1;
- }
-
- LOG(DEBUG3, "CryptoCodec init success, length of the decrypted key is : %llu, crypto method is : %d", AlgorithmBlockSize, crypto_method);
- return 1;
-
- }
-
- int CryptoCodec::resetStreamOffset(CryptoMethod crypto_method, int64_t stream_offset) {
- // Check CryptoCodec init or not.
- if (is_init == false)
- return -1;
- // Calculate new IV when appending an existed file.
- std::string iv = encryptionInfo->getIv();
- if (stream_offset > 0) {
- counter = stream_offset / AlgorithmBlockSize;
- padding = stream_offset % AlgorithmBlockSize;
- iv = this->calculateIV(iv, counter);
- }
-
- // Judge the crypto method is encrypt or decrypt.
- int enc = (method == CryptoMethod::ENCRYPT) ? 1 : 0;
-
- // Init cipher context with cipher method.
- if (!EVP_CipherInit_ex(cipherCtx, cipher, NULL,
- (const unsigned char *) decryptedKey.c_str(), (const unsigned char *) iv.c_str(),
- enc)) {
- LOG(WARNING, "EVP_CipherInit_ex failed");
- return -1;
- }
-
- // AES/CTR/NoPadding, set padding to 0.
- EVP_CIPHER_CTX_set_padding(cipherCtx, 0);
-
- return 1;
- }
-
- std::string CryptoCodec::cipher_wrap(const char * buffer, int64_t size) {
- if (!is_init)
- THROW(InvalidParameter, "CryptoCodec isn't init");
-
- int offset = 0;
- int remaining = size;
- int len = 0;
- int ret = 0;
-
- std::string in_buf(buffer,size);
- std::string out_buf(size, 0);
- //set necessary padding when appending a existed file
- if (padding > 0) {
- in_buf.insert(0, padding, 0);
- out_buf.resize(padding+size);
- remaining += padding;
- }
-
- // If the encode/decode buffer size larger than crypto buffer size, encode/decode buffer one by one
- while (remaining > bufSize) {
- ret = EVP_CipherUpdate(cipherCtx, (unsigned char *) &out_buf[offset], &len,
- (const unsigned char *)in_buf.data() + offset, bufSize);
-
- if (!ret) {
- std::string err = ERR_lib_error_string(ERR_get_error());
- THROW(HdfsIOException, "CryptoCodec : cipher_wrap AES data failed:%s, crypto_method:%d", err.c_str(), method);
- }
- offset += len;
- remaining -= len;
- LOG(DEBUG3, "CryptoCodec : EVP_CipherUpdate successfully, len:%d", len);
- }
-
- if (remaining) {
- ret = EVP_CipherUpdate(cipherCtx, (unsigned char *) &out_buf[offset], &len,
- (const unsigned char *) in_buf.data() + offset, remaining);
-
- if (!ret) {
- std::string err = ERR_lib_error_string(ERR_get_error());
- THROW(HdfsIOException, "CryptoCodec : cipher_wrap AES data failed:%s, crypto_method:%d", err.c_str(), method);
- }
-
- }
-
- //cut off padding when necessary
- if (padding > 0) {
- out_buf.erase(0, padding);
- padding = 0;
- }
-
- return out_buf;
- }
-
-}
-
diff --git a/depends/libhdfs3/src/client/CryptoCodec.h b/depends/libhdfs3/src/client/CryptoCodec.h
deleted file mode 100644
index f5070fe..0000000
--- a/depends/libhdfs3/src/client/CryptoCodec.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_CLIENT_CRYPTOCODEC_H_
-#define _HDFS_LIBHDFS3_CLIENT_CRYPTOCODEC_H_
-
-#include <string>
-
-#include "openssl/conf.h"
-#include "openssl/evp.h"
-#include "openssl/err.h"
-#include "FileEncryptionInfo.h"
-#include "KmsClientProvider.h"
-
-#define KEY_LENGTH_256 32
-#define KEY_LENGTH_128 16
-
-namespace Hdfs {
-
- enum CryptoMethod {
- DECRYPT = 0,
- ENCRYPT = 1
- };
-
- class CryptoCodec {
- public:
- /**
- * Construct a CryptoCodec instance.
- * @param encryptionInfo the encryption info of file.
- * @param kcp a KmsClientProvider instance to get key from kms server.
- * @param bufSize crypto buffer size.
- */
- CryptoCodec(FileEncryptionInfo *encryptionInfo, shared_ptr<KmsClientProvider> kcp, int32_t bufSize);
-
- /**
- * Destroy a CryptoCodec instance.
- */
- virtual ~CryptoCodec();
-
- /**
- * encrypt/decrypt(depends on init()) buffer data
- * @param buffer
- * @param size
- * @return encrypt/decrypt result string
- */
- virtual std::string cipher_wrap(const char * buffer, int64_t size);
-
- /**
- * init CryptoCodec
- * @param method CryptoMethod
- * @param stream_offset 0 when open a new file; file_lenght when append a existed file
- * @return 1 success; 0 no need(already inited); -1 failed
- */
- virtual int init(CryptoMethod crypto_method, int64_t stream_offset = 0);
-
- /**
- * Reset iv and padding value when seek file.
- * @param crypto_method do encrypt/decrypt work according to crypto_method.
- * @param stream_offset the offset of the current file.
- * @return 1 sucess; -1 failed.
- */
- virtual int resetStreamOffset(CryptoMethod crypto_method, int64_t stream_offset);
-
- private:
-
- /**
- * Get decrypted key from kms.
- */
- std::string getDecryptedKeyFromKms();
-
- /**
- * calculate new IV for appending a existed file
- * @param initIV
- * @param counter
- * @return new IV string
- */
- std::string calculateIV(const std::string& initIV, unsigned long counter);
-
- shared_ptr<KmsClientProvider> kcp;
- FileEncryptionInfo* encryptionInfo;
- EVP_CIPHER_CTX* cipherCtx;
- const EVP_CIPHER* cipher;
- CryptoMethod method;
-
- bool is_init;
- int32_t bufSize;
- int64_t padding;
- int64_t counter;
- std::string decryptedKey;
- uint64_t AlgorithmBlockSize;
- };
-
-}
-#endif
diff --git a/depends/libhdfs3/src/client/HttpClient.cpp b/depends/libhdfs3/src/client/HttpClient.cpp
deleted file mode 100644
index 09a74a6..0000000
--- a/depends/libhdfs3/src/client/HttpClient.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-
-#include "HttpClient.h"
-#include "Logger.h"
-
-using namespace Hdfs::Internal;
-
-namespace Hdfs {
-
-#define CURL_SETOPT(handle, option, optarg, fmt, ...) \
- res = curl_easy_setopt(handle, option, optarg); \
- if (res != CURLE_OK) { \
- THROW(HdfsIOException, fmt, ##__VA_ARGS__); \
- }
-
-#define CURL_SETOPT_ERROR1(handle, option, optarg, fmt) \
- CURL_SETOPT(handle, option, optarg, fmt, curl_easy_strerror(res));
-
-#define CURL_SETOPT_ERROR2(handle, option, optarg, fmt) \
- CURL_SETOPT(handle, option, optarg, fmt, curl_easy_strerror(res), \
- errorString().c_str())
-
-#define CURL_PERFORM(handle, fmt) \
- res = curl_easy_perform(handle); \
- if (res != CURLE_OK) { \
- THROW(HdfsIOException, fmt, curl_easy_strerror(res), errorString().c_str()); \
- }
-
-#define CURL_GETOPT_ERROR2(handle, option, optarg, fmt) \
- res = curl_easy_getinfo(handle, option, optarg); \
- if (res != CURLE_OK) { \
- THROW(HdfsIOException, fmt, curl_easy_strerror(res), errorString().c_str()); \
- }
-
-#define CURL_GET_RESPONSE(handle, code, fmt) \
- CURL_GETOPT_ERROR2(handle, CURLINFO_RESPONSE_CODE, code, fmt);
-
-HttpClient::HttpClient() : curl(NULL), list(NULL) {
-}
-
-/**
- * Construct a HttpClient instance.
- * @param url a url which is the address to send the request to the corresponding http server.
- */
-HttpClient::HttpClient(const std::string &url) {
- curl = NULL;
- list = NULL;
- this->url = url;
-}
-
-/**
- * Destroy a HttpClient instance.
- */
-HttpClient::~HttpClient()
-{
- destroy();
-}
-
-/**
- * Receive error string from curl.
- */
-std::string HttpClient::errorString() {
- if (strlen(errbuf) == 0) {
- return "";
- }
- return errbuf;
-}
-
-/**
- * Curl call back function to receive the reponse messages.
- * @return return the size of reponse messages.
- */
-size_t HttpClient::CurlWriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
-{
- size_t realsize = size * nmemb;
- if (userp == NULL || contents == NULL) {
- return 0;
- }
- ((std::string *) userp)->append((const char *) contents, realsize);
- LOG(DEBUG3, "HttpClient : Http response is : %s", ((std::string * )userp)->c_str());
- return realsize;
-}
-
-/**
- * Init curl handler and set curl options.
- */
-void HttpClient::init() {
- if (!initialized) {
- initialized = true;
- if (curl_global_init (CURL_GLOBAL_ALL)) {
- THROW(HdfsIOException, "Cannot initialize curl client for KMS");
- }
- }
-
- curl = curl_easy_init();
- if (!curl) {
- THROW(HdfsIOException, "Cannot initialize curl handle for KMS");
- }
-
- CURL_SETOPT_ERROR1(curl, CURLOPT_ERRORBUFFER, errbuf,
- "Cannot initialize curl error buffer for KMS: %s");
-
- errbuf[0] = 0;
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_NOPROGRESS, 1,
- "Cannot initialize no progress in HttpClient: %s: %s");
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_VERBOSE, 0,
- "Cannot initialize no verbose in HttpClient: %s: %s");
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_COOKIEFILE, "",
- "Cannot initialize cookie behavior in HttpClient: %s: %s");
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_HTTPHEADER, list,
- "Cannot initialize headers in HttpClient: %s: %s");
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_WRITEFUNCTION, HttpClient::CurlWriteMemoryCallback,
- "Cannot initialize body reader in HttpClient: %s: %s");
-
- CURL_SETOPT_ERROR2(curl, CURLOPT_WRITEDATA, (void *)&response,
- "Cannot initialize body reader data in HttpClient: %s: %s");
-
-
- /* Some servers don't like requests that are made without a user-agent
- * field, so we provide one
- */
- CURL_SETOPT_ERROR2(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0",
- "Cannot initialize user agent in HttpClient: %s: %s");
- list = NULL;
-}
-
-/**
- * Do clean up for curl.
- */
-void HttpClient::destroy() {
- if (curl) {
- curl_easy_cleanup(curl);
- curl = NULL;
- }
- if (list) {
- curl_slist_free_all(list);
- list = NULL;
- }
- initialized = false;
-}
-
-/**
- * Set url for http client.
- */
-void HttpClient::setURL(const std::string &url) {
- this->url = url;
-}
-
-/**
- * Set retry times for http request which can be configured in config file.
- */
-void HttpClient::setRequestRetryTimes(int request_retry_times) {
- if (request_retry_times < 0) {
- THROW(InvalidParameter, "HttpClient : Invalid value for request_retry_times.");
- }
- this->request_retry_times = request_retry_times;
-}
-
-/**
- * Set request timeout which can be configured in config file.
- */
-void HttpClient::setRequestTimeout(int64_t curl_timeout) {
- if (curl_timeout < 0) {
- THROW(InvalidParameter, "HttpClient : Invalid value for curl_timeout.");
- }
- this->curl_timeout = curl_timeout;
-}
-
-/**
- * Set headers for http client.
- */
-void HttpClient::setHeaders(const std::vector<std::string> &headers) {
- if (!headers.empty()) {
- this->headers = headers;
- for (std::string header : headers) {
- list = curl_slist_append(list, header.c_str());
- if (!list) {
- THROW(HdfsIOException, "Cannot add header in HttpClient.");
- }
- }
- } else {
- LOG(DEBUG3, "HttpClient : Header is empty.");
- }
-}
-
-
-/**
- * Set body for http client.
- */
-void HttpClient::setBody(const std::string &body) {
- this->body = body;
-}
-
-/**
- * Set expected response code.
- */
-void HttpClient::setExpectedResponseCode(int64_t response_code_ok) {
- this->response_code_ok = response_code_ok;
-}
-
-/**
- * Http common method to get response info by sending request to http server.
- * @param method : define different http methods.
- * @return return response info.
- */
-std::string HttpClient::httpCommon(httpMethod method) {
- /* Set headers and url. */
- if (list != NULL) {
- CURL_SETOPT_ERROR2(curl, CURLOPT_HTTPHEADER, list,
- "Cannot initialize headers in HttpClient: %s: %s");
- } else {
- LOG(DEBUG3, "HttpClient : Http Header is NULL");
- }
-
- if (curl != NULL) {
- CURL_SETOPT_ERROR2(curl, CURLOPT_URL, url.c_str(),
- "Cannot initialize url in HttpClient: %s: %s");
- } else {
- LOG(LOG_ERROR, "HttpClient : Http URL is NULL");
- }
-
- /* Set body based on different http method. */
- switch (method) {
- case HTTP_GET:
- {
- break;
- }
- case HTTP_POST:
- {
- CURL_SETOPT_ERROR2(curl, CURLOPT_COPYPOSTFIELDS, body.c_str(),
- "Cannot initialize post data in HttpClient: %s: %s");
- break;
- }
- case HTTP_DELETE:
- {
- CURL_SETOPT_ERROR2(curl, CURLOPT_CUSTOMREQUEST, "DELETE",
- "Cannot initialize set customer request in HttpClient: %s: %s");
- break;
- }
- case HTTP_PUT:
- {
- CURL_SETOPT_ERROR2(curl, CURLOPT_CUSTOMREQUEST, "PUT",
- "Cannot initialize set customer request in HttpClient: %s: %s");
- CURL_SETOPT_ERROR2(curl, CURLOPT_COPYPOSTFIELDS, body.c_str(),
- "Cannot initialize post data in HttpClient: %s: %s");
- break;
- }
- default:
- {
- LOG(LOG_ERROR, "HttpClient : unknown method: %d", method);
- }
- }
-
- /* Do several http request try according to request_retry_times
- * until got the right response code.
- */
- int64_t response_code = -1;
-
- while (request_retry_times >= 0 && response_code != response_code_ok) {
- request_retry_times -= 1;
- response = "";
- CURL_SETOPT_ERROR2(curl, CURLOPT_TIMEOUT, curl_timeout,
- "Send request to http server timeout: %s: %s");
- CURL_PERFORM(curl, "Could not send request in HttpClient: %s %s");
- CURL_GET_RESPONSE(curl, &response_code,
- "Cannot get response code in HttpClient: %s: %s");
- }
- LOG(DEBUG3, "HttpClient : The http method is %d. The http url is %s. The http response is %s.",
- method, url.c_str(), response.c_str());
- return response;
-}
-
-/**
- * Http GET method.
- */
-std::string HttpClient::get() {
- return httpCommon(HTTP_GET);
-}
-
-/**
- * Http POST method.
- */
-std::string HttpClient::post() {
- return httpCommon(HTTP_POST);
-}
-
-/**
- * Http DELETE method.
- */
-std::string HttpClient::del() {
- return httpCommon(HTTP_DELETE);
-}
-
-/**
- * Http PUT method.
- */
-std::string HttpClient::put() {
- return httpCommon(HTTP_PUT);
-}
-
-
-/**
- * URL encodes the given string.
- */
-std::string HttpClient::escape(const std::string &data) {
- if (curl) {
- char *output = curl_easy_escape(curl, data.c_str(), data.length());
- if (output) {
- std::string out(output);
- return out;
- } else {
- THROW(HdfsIOException, "HttpClient : Curl escape failed.");
- }
- } else {
- LOG(WARNING, "HttpClient : Curl in escape method is NULL");
- }
- std::string empty;
- return empty;
-}
-}
-
-/* Curl global init only can be done once. */
-bool Hdfs::HttpClient::initialized = false;
-
diff --git a/depends/libhdfs3/src/client/HttpClient.h b/depends/libhdfs3/src/client/HttpClient.h
deleted file mode 100644
index c77789b..0000000
--- a/depends/libhdfs3/src/client/HttpClient.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_CLIENT_HTTPCLIENT_H_
-#define _HDFS_LIBHDFS3_CLIENT_HTTPCLIENT_H_
-
-#include <string>
-#include <vector>
-#include <curl/curl.h>
-#include "Exception.h"
-#include "ExceptionInternal.h"
-
-typedef enum httpMethod {
- HTTP_GET = 0,
- HTTP_POST = 1,
- HTTP_DELETE = 2,
- HTTP_PUT = 3
-} httpMethod;
-
-namespace Hdfs {
-
-class HttpClient {
-public:
- HttpClient();
-
- /**
- * Construct a HttpClient instance.
- * @param url a url which is the address to send the request to the corresponding http server.
- */
- HttpClient(const std::string &url);
-
- /**
- * Destroy a HttpClient instance.
- */
- virtual ~HttpClient();
-
- /**
- * Set url for http client.
- */
- void setURL(const std::string &url);
-
- /**
- * Set headers for http client.
- */
- void setHeaders(const std::vector<std::string> &headers);
-
- /**
- * Set body for http client.
- */
- void setBody(const std::string &body);
-
- /**
- * Set retry times for http request which can be configured in config file.
- */
- void setRequestRetryTimes(int requst_retry_times);
-
- /**
- * Set request timeout which can be configured in config file.
- */
- void setRequestTimeout(int64_t curl_timeout);
-
- /**
- * Set expected response code.
- */
- void setExpectedResponseCode(int64_t response_code_ok);
-
- /**
- * Init curl handler and set options for curl.
- */
- void init();
-
- /**
- * Do clean up for curl.
- */
- void destroy();
-
- /**
- * Http POST method.
- */
- virtual std::string post();
-
- /**
- * Http DELETE method.
- */
- virtual std::string del();
-
- /**
- * Http PUT method.
- */
- virtual std::string put();
-
- /**
- * Http GET method.
- */
- virtual std::string get();
-
- /**
- * URL encodes the given string.
- */
- std::string escape(const std::string &data);
-
- /**
- * Receive error string from curl.
- */
- std::string errorString();
-
-private:
-
- /**
- * Http common method to get response info by sending request to http server.
- * @param method : define different http methods.
- * @return return response info.
- */
- std::string httpCommon(httpMethod method);
-
- /**
- * Curl call back function to receive the reponse messages.
- * @return return the size of reponse messages.
- */
- static size_t CurlWriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp);
-
- static bool initialized;
- CURLcode res;
- std::string url;
- std::vector<std::string> headers;
- std::string body;
- int64_t response_code_ok;
- int request_retry_times;
- int64_t curl_timeout;
- CURL *curl;
- struct curl_slist *list;
- std::string response;
- char errbuf[CURL_ERROR_SIZE] = { 0 };
-};
-
-}
-#endif
diff --git a/depends/libhdfs3/src/client/KmsClientProvider.cpp b/depends/libhdfs3/src/client/KmsClientProvider.cpp
deleted file mode 100644
index ac59570..0000000
--- a/depends/libhdfs3/src/client/KmsClientProvider.cpp
+++ /dev/null
@@ -1,325 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-
-#include "KmsClientProvider.h"
-#include "Logger.h"
-#include <gsasl.h>
-#include <map>
-#include <boost/property_tree/json_parser.hpp>
-using namespace Hdfs::Internal;
-using boost::property_tree::read_json;
-using boost::property_tree::write_json;
-
-namespace Hdfs {
-
-/**
- * Convert ptree format to json format
- */
-std::string KmsClientProvider::toJson(const ptree &data) {
- std::ostringstream buf;
- try {
- write_json(buf, data, false);
- std::string json = buf.str();
- return json;
- } catch (...) {
- THROW(HdfsIOException, "KmsClientProvider : Write json failed.");
- }
-}
-
-/**
- * Convert json format to ptree format
- */
-ptree KmsClientProvider::fromJson(const std::string &data) {
- ptree pt2;
- try {
- std::istringstream is(data);
- read_json(is, pt2);
- return pt2;
- } catch (...) {
- THROW(HdfsIOException, "KmsClientProvider : Read json failed.");
- }
-}
-
-/**
- * Encode string to base64.
- */
-std::string KmsClientProvider::base64Encode(const std::string &data) {
- char * buffer = NULL;
- size_t len = 0;
- int rc = 0;
- std::string result;
-
- LOG(DEBUG3, "KmsClientProvider : Encode data is %s", data.c_str());
-
- if (GSASL_OK != (rc = gsasl_base64_to(data.data(), data.size(), &buffer, &len))) {
- assert(GSASL_MALLOC_ERROR == rc);
- throw std::bad_alloc();
- }
-
- if (buffer) {
- result.assign(buffer, len);
- free(buffer);
- }
-
- if (!buffer || result.length() != len) {
- THROW(HdfsIOException,
- "KmsClientProvider: Failed to encode string to base64");
- }
-
- return result;
-}
-
-/**
- * Decode base64 to string.
- */
-std::string KmsClientProvider::base64Decode(const std::string &data) {
- char * buffer = NULL;
- size_t len = 0;
- int rc = 0;
- std::string result;
-
- if (GSASL_OK != (rc = gsasl_base64_from(data.data(), data.size(), &buffer, &len))) {
- assert(GSASL_MALLOC_ERROR == rc);
- throw std::bad_alloc();
- }
-
- if (buffer) {
- result.assign(buffer, len);
- free(buffer);
- }
-
- if (!buffer || result.length() != len) {
- THROW(HdfsIOException,
- "KmsClientProvider: Failed to decode base64 to string");
- }
-
- return result;
-}
-
-/**
- * Construct a KmsClientProvider instance.
- * @param auth RpcAuth to get the auth method and user info.
- * @param conf a SessionConfig to get the configuration.
- */
-KmsClientProvider::KmsClientProvider(shared_ptr<RpcAuth> rpcAuth, shared_ptr<SessionConfig> config) : auth(rpcAuth), conf(config)
-{
- hc.reset(new HttpClient());
- method = RpcAuth::ParseMethod(conf->getKmsMethod());
-}
-
-/**
- * Set HttpClient object.
- */
-void KmsClientProvider::setHttpClient(shared_ptr<HttpClient> hc)
-{
- this->hc = hc;
-}
-
-/**
- * Parse kms url from configure file.
- */
-std::string KmsClientProvider::parseKmsUrl()
-{
- std::string start = "kms://";
- std::string http = "http@";
- std::string https = "https@";
- std::string urlParse = conf->getKmsUrl();
- LOG(DEBUG3, "KmsClientProvider : Get kms url from conf : %s.",
- urlParse.c_str());
- if (urlParse.compare(0, start.length(), start) == 0) {
- start = urlParse.substr(start.length());
- if (start.compare(0, http.length(), http) == 0) {
- return "http://" + start.substr(http.length());
- } else if (start.compare(0, https.length(), https) == 0) {
- return "https://" + start.substr(https.length());
- } else
- THROW(HdfsIOException, "Bad KMS provider URL: %s", urlParse.c_str());
- } else
- THROW(HdfsIOException, "Bad KMS provider URL: %s", urlParse.c_str());
-
-}
-
-/**
- * Build kms url based on urlSuffix and different auth method.
- */
-std::string KmsClientProvider::buildKmsUrl(const std::string &url, const std::string &urlSuffix)
-{
- std::string baseUrl = url;
- baseUrl = url + "/v1/" + urlSuffix;
- std::size_t found = urlSuffix.find('?');
-
- if (method == AuthMethod::KERBEROS) {
- // todo
- THROW(InvalidParameter, "KmsClientProvider : Not support kerberos yet.");
- } else if (method == AuthMethod::SIMPLE) {
- std::string user = auth->getUser().getRealUser();
- LOG(DEBUG3,
- "KmsClientProvider : Kms urlSuffix is : %s. Auth real user is : %s.",
- urlSuffix.c_str(), user.c_str());
- if (user.length() == 0)
- user = auth->getUser().getKrbName();
- if (found != std::string::npos)
- return baseUrl + "&user.name=" + user;
- else
- return baseUrl + "?user.name=" + user;
- } else {
- return baseUrl;
- }
-}
-
-/**
- * Set common headers for kms API.
- */
-void KmsClientProvider::setCommonHeaders(std::vector<std::string>& headers)
-{
- headers.push_back("Content-Type: application/json");
- headers.push_back("Accept: *");
-}
-
-
-/**
- * Create an encryption key from kms.
- * @param keyName the name of this key.
- * @param cipher the ciphertext of this key. e.g. "AES/CTR/NoPadding" .
- * @param length the length of this key.
- * @param material will be encode to base64.
- * @param description key's info.
- */
-void KmsClientProvider::createKey(const std::string &keyName, const std::string &cipher, const int length, const std::string &material, const std::string &description)
-{
- hc->init();
- /* Prepare url for HttpClient.*/
- url = parseKmsUrl();
- std::string urlSuffix = "keys";
- url = buildKmsUrl(url, urlSuffix);
- /* Prepare headers for HttpClient.*/
- std::vector<std::string> headers;
- setCommonHeaders(headers);
- /* Prepare body for HttpClient. */
- ptree map;
- map.put("name", keyName);
- map.put("cipher", cipher);
- map.put("description", description);
- std::string body = toJson(map);
- /* Set options for HttpClient to get response. */
- hc->setURL(url);
- hc->setHeaders(headers);
- hc->setBody(body);
- hc->setRequestRetryTimes(conf->getHttpRequestRetryTimes());
- hc->setRequestTimeout(conf->getCurlTimeOut());
- hc->setExpectedResponseCode(201);
- std::string response = hc->post();
-
- LOG(DEBUG3,
- "KmsClientProvider::createKey : The key name, key cipher, key length, key material, description are : %s, %s, %d, %s, %s. The kms url is : %s . The kms body is : %s. The response of kms server is : %s .",
- keyName.c_str(), cipher.c_str(), length, material.c_str(),
- description.c_str(), url.c_str(), body.c_str(), response.c_str());
-
-}
-
-/**
- * Get key metadata based on encrypted file's key name.
- * @param encryptionInfo the encryption info of file.
- * @return return response info about key metadata from kms server.
- */
-ptree KmsClientProvider::getKeyMetadata(const FileEncryptionInfo &encryptionInfo)
-{
- hc->init();
- url = parseKmsUrl();
- std::string urlSuffix = "key/" + hc->escape(encryptionInfo.getKeyName()) + "/_metadata";
- url = buildKmsUrl(url, urlSuffix);
-
- hc->setURL(url);
- hc->setExpectedResponseCode(200);
- hc->setRequestRetryTimes(conf->getHttpRequestRetryTimes());
- hc->setRequestTimeout(conf->getCurlTimeOut());
- std::string response = hc->get();
-
- LOG(DEBUG3,
- "KmsClientProvider::getKeyMetadata : The kms url is : %s. The response of kms server is : %s .",
- url.c_str(), response.c_str());
-
- return fromJson(response);
-
-}
-
-/**
- * Delete an encryption key from kms.
- * @param encryptionInfo the encryption info of file.
- */
-void KmsClientProvider::deleteKey(const FileEncryptionInfo &encryptionInfo)
-{
- hc->init();
- url = parseKmsUrl();
- std::string urlSuffix = "key/" + hc->escape(encryptionInfo.getKeyName());
- url = buildKmsUrl(url, urlSuffix);
-
- hc->setURL(url);
- hc->setExpectedResponseCode(200);
- hc->setRequestRetryTimes(conf->getHttpRequestRetryTimes());
- hc->setRequestTimeout(conf->getCurlTimeOut());
- std::string response = hc->del();
-
- LOG(DEBUG3,
- "KmsClientProvider::deleteKey : The kms url is : %s. The response of kms server is : %s .",
- url.c_str(), response.c_str());
-}
-
-/**
- * Decrypt an encrypted key from kms.
- * @param encryptionInfo the encryption info of file.
- * @return return decrypted key.
- */
-ptree KmsClientProvider::decryptEncryptedKey(const FileEncryptionInfo &encryptionInfo)
-{
- hc->init();
- /* Prepare HttpClient url. */
- url = parseKmsUrl();
- std::string urlSuffix = "keyversion/" + hc->escape(encryptionInfo.getEzKeyVersionName()) + "/_eek?eek_op=decrypt";
- url = buildKmsUrl(url, urlSuffix);
- /* Prepare HttpClient headers. */
- std::vector<std::string> headers;
- setCommonHeaders(headers);
- /* Prepare HttpClient body with json format. */
- ptree map;
- map.put("name", encryptionInfo.getKeyName());
- map.put("iv", base64Encode(encryptionInfo.getIv()));
- map.put("material", base64Encode(encryptionInfo.getKey()));
- std::string body = toJson(map);
-
- /* Set options for HttpClient. */
- hc->setURL(url);
- hc->setHeaders(headers);
- hc->setBody(body);
- hc->setExpectedResponseCode(200);
- hc->setRequestRetryTimes(conf->getHttpRequestRetryTimes());
- hc->setRequestTimeout(conf->getCurlTimeOut());
- std::string response = hc->post();
-
- LOG(DEBUG3,
- "KmsClientProvider::decryptEncryptedKey : The kms url is : %s . The kms body is : %s. The response of kms server is : %s .",
- url.c_str(), body.c_str(), response.c_str());
- return fromJson(response);
-}
-
-}
-
diff --git a/depends/libhdfs3/src/client/KmsClientProvider.h b/depends/libhdfs3/src/client/KmsClientProvider.h
deleted file mode 100644
index a6c4336..0000000
--- a/depends/libhdfs3/src/client/KmsClientProvider.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#ifndef _HDFS_LIBHDFS3_CLIENT_KMSCLIENTPROVIDER_H_
-#define _HDFS_LIBHDFS3_CLIENT_KMSCLIENTPROVIDER_H_
-
-#include <string>
-#include <gsasl.h>
-
-#include "openssl/conf.h"
-#include "openssl/evp.h"
-#include "openssl/err.h"
-#include "FileEncryptionInfo.h"
-#include "HttpClient.h"
-#include <vector>
-#include "common/SessionConfig.h"
-#include "rpc/RpcAuth.h"
-#include "common/Memory.h"
-#include <boost/property_tree/ptree.hpp>
-
-using boost::property_tree::ptree;
-using namespace Hdfs::Internal;
-
-
-namespace Hdfs {
-
-class KmsClientProvider {
-public:
-
- /**
- * Construct a KmsClientProvider instance.
- * @param auth RpcAuth to get the auth method and user info.
- * @param conf a SessionConfig to get the configuration.
- */
- KmsClientProvider(shared_ptr<RpcAuth> auth, shared_ptr<SessionConfig> conf);
-
- /**
- * Destroy a KmsClientProvider instance.
- */
- virtual ~KmsClientProvider() {
- }
-
- /**
- * Set HttpClient object.
- */
- void setHttpClient(shared_ptr<HttpClient> hc);
-
- /**
- * Create an encryption key from kms.
- * @param keyName the name of this key.
- * @param cipher the ciphertext of this key. e.g. "AES/CTR/NoPadding" .
- * @param length the length of this key.
- * @param material will be encode to base64.
- * @param description key's info.
- */
- virtual void createKey(const std::string &keyName, const std::string &cipher, const int length, const std::string &material, const std::string &description);
-
- /**
- * Get key metadata based on encrypted file's key name.
- * @param encryptionInfo the encryption info of file.
- * @return return response info about key metadata from kms server.
- */
- virtual ptree getKeyMetadata(const FileEncryptionInfo &encryptionInfo);
-
- /**
- * Delete an encryption key from kms.
- * @param encryptionInfo the encryption info of file.
- */
- virtual void deleteKey(const FileEncryptionInfo &encryptionInfo);
-
- /**
- * Decrypt an encrypted key from kms.
- * @param encryptionInfo the encryption info of file.
- * @return return decrypted key.
- */
- virtual ptree decryptEncryptedKey(const FileEncryptionInfo &encryptionInfo);
-
- /**
- * Encode string to base64.
- */
- static std::string base64Encode(const std::string &data);
-
- /**
- * Decode base64 to string.
- */
- static std::string base64Decode(const std::string &data);
-
-private:
-
- /**
- * Convert ptree format to json format.
- */
- static std::string toJson(const ptree &data);
-
- /**
- * Convert json format to ptree format.
- */
- static ptree fromJson(const std::string &data);
-
- /**
- * Parse kms url from configure file.
- */
- std::string parseKmsUrl();
-
- /**
- * Build kms url based on urlSuffix and different auth method.
- */
- std::string buildKmsUrl(const std::string &url, const std::string &urlSuffix);
- /**
- * Set common headers for kms API.
- */
- void setCommonHeaders(std::vector<std::string>& headers);
-
- shared_ptr<HttpClient> hc;
- std::string url;
-
- shared_ptr<RpcAuth> auth;
- AuthMethod method;
- shared_ptr<SessionConfig> conf;
-
-};
-
-}
-#endif
diff --git a/depends/libhdfs3/test/function/TestKmsClient.cpp b/depends/libhdfs3/test/function/TestKmsClient.cpp
deleted file mode 100644
index 0295866..0000000
--- a/depends/libhdfs3/test/function/TestKmsClient.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#include "client/FileSystem.h"
-#include "client/FileSystemInter.h"
-#include "DateTime.h"
-#include "Exception.h"
-#include "ExceptionInternal.h"
-#include "gtest/gtest.h"
-#include "TestUtil.h"
-#include "Thread.h"
-#include "XmlConfig.h"
-#include "client/KmsClientProvider.h"
-#include "client/HttpClient.h"
-#include "client/hdfs.h"
-
-#include <ctime>
-
-#ifndef TEST_HDFS_PREFIX
-#define TEST_HDFS_PREFIX "./"
-#endif
-
-#define BASE_DIR TEST_HDFS_PREFIX"/testKmsClient/"
-
-using namespace Hdfs;
-using namespace Hdfs::Internal;
-
-class TestKmsClient: public ::testing::Test {
-public:
- TestKmsClient() :
- conf("function-test.xml") {
- conf.set("hadoop.kms.authentication.type", "simple");
- conf.set("dfs.encryption.key.provider.uri",
- "kms://http@0.0.0.0:16000/kms");
- sconf.reset(new SessionConfig(conf));
- userInfo.setRealUser("abai");
- auth.reset(new RpcAuth(userInfo, RpcAuth::ParseMethod(sconf->getKmsMethod())));
- hc.reset(new HttpClient());
- kcp.reset(new KmsClientProvider(auth, sconf));
- kcp->setHttpClient(hc);
- fs.reset(new FileSystem(conf));
- fs->connect();
- }
-
- ~TestKmsClient() {
- try {
- fs->disconnect();
- } catch (...) {
- }
- }
-protected:
- Config conf;
- UserInfo userInfo;
- shared_ptr<RpcAuth> auth;
- shared_ptr<HttpClient> hc;
- shared_ptr<KmsClientProvider> kcp;
- shared_ptr<SessionConfig> sconf;
- shared_ptr<FileSystem> fs;
-};
-
-TEST_F(TestKmsClient, CreateKeySuccess) {
- std::string keyName = "testcreatekeyname";
- std::string cipher = "AES/CTR/NoPadding";
- int length = 128;
- std::string material = "testCreateKey";
- std::string description = "Test create key success.";
- ASSERT_NO_THROW(
- kcp->createKey(keyName, cipher, length, material, description));
-}
-
-TEST_F(TestKmsClient, GetKeyMetadataSuccess) {
- FileEncryptionInfo encryptionInfo;
- encryptionInfo.setKeyName("testcreatekeyname");
- ptree map = kcp->getKeyMetadata(encryptionInfo);
- std::string keyName = map.get < std::string > ("name");
- ASSERT_STREQ("testcreatekeyname", keyName.c_str());
-}
-
-TEST_F(TestKmsClient, DeleteKeySuccess) {
- FileEncryptionInfo encryptionInfo;
- encryptionInfo.setKeyName("testcreatekeyname");
- ASSERT_NO_THROW(kcp->deleteKey(encryptionInfo));
-}
-
-
-TEST_F(TestKmsClient, DecryptEncryptedKeySuccess) {
- hdfsFS hfs = NULL;
- struct hdfsBuilder * bld = hdfsNewBuilder();
- assert(bld != NULL);
- hdfsBuilderSetNameNode(bld, "default");
- hfs = hdfsBuilderConnect(bld);
-
- //create key
- hc.reset(new HttpClient());
- kcp.reset(new KmsClientProvider(auth, sconf));
- kcp->setHttpClient(hc);
- std::string keyName = "testdekeyname";
- std::string cipher = "AES/CTR/NoPadding";
- int length = 128;
- std::string material = "test DEK";
- std::string description = "Test DEK create key success.";
- kcp->createKey(keyName, cipher, length, material, description);
-
- //delete dir
- hdfsDelete(hfs, BASE_DIR"/testDEKey", true);
-
- //create dir
- EXPECT_EQ(0, hdfsCreateDirectory(hfs, BASE_DIR"/testDEKey"));
-
- //create encryption zone and encrypted file
- ASSERT_EQ(0,
- hdfsCreateEncryptionZone(hfs, BASE_DIR"/testDEKey", "testdekeyname"));
- std::string hadoop_command = "hadoop fs -touchz ";
- std::string tdeFile = BASE_DIR"/testDEKey/tdefile";
- std::string createFile = hadoop_command + tdeFile;
- std::system(createFile.c_str());
-
- //decrypt encrypted key
- hc.reset(new HttpClient());
- kcp.reset(new KmsClientProvider(auth, sconf));
- kcp->setHttpClient(hc);
- FileStatus fileStatus = fs->getFileStatus(tdeFile.c_str());
- FileEncryptionInfo *enInfo = fileStatus.getFileEncryption();
- ptree map = kcp->decryptEncryptedKey(*enInfo);
- std::string versionName = map.get < std::string > ("versionName");
- ASSERT_STREQ("EK", versionName.c_str());
-
- //delete key
- hc.reset(new HttpClient());
- kcp.reset(new KmsClientProvider(auth, sconf));
- kcp->setHttpClient(hc);
- FileEncryptionInfo encryptionInfo;
- encryptionInfo.setKeyName("testdekeyname");
- kcp->deleteKey(encryptionInfo);
-
-}
-
-TEST_F(TestKmsClient, CreateKeyFailediBadUrl) {
- std::string keyName = "testcreatekeyfailname";
- std::string cipher = "AES/CTR/NoPadding";
- std::string material = "testCreateKey";
-
- std::string url[4] = { "ftp:///http@localhost:16000/kms",
- "kms://htttp@localhost:16000/kms",
- "kms:///httpss@localhost:16000/kms",
- "kms:///http@localhost:16000/kms" };
- for (int i = 0; i < 4; i++) {
- conf.set("hadoop.kms.authentication.type", "simple");
- conf.set("dfs.encryption.key.provider.uri", url[i]);
- sconf.reset(new SessionConfig(conf));
- userInfo.setRealUser("abai");
- auth.reset(new RpcAuth(userInfo, RpcAuth::ParseMethod(sconf->getKmsMethod())));
- hc.reset(new HttpClient());
- kcp.reset(new KmsClientProvider(auth, sconf));
- ASSERT_THROW(kcp->createKey("tesTdeBadUrl", "AES/CTR/NoPadding", 128,
- "test DEK", "test DEK description"), HdfsIOException);
- }
-}
-
-
diff --git a/depends/libhdfs3/test/unit/UnitTestCryptoCodec.cpp b/depends/libhdfs3/test/unit/UnitTestCryptoCodec.cpp
deleted file mode 100644
index 92e9403..0000000
--- a/depends/libhdfs3/test/unit/UnitTestCryptoCodec.cpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/********************************************************************
- * 2014 -
- * open source under Apache License Version 2.0
- ********************************************************************/
-/**
- * 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.
- */
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-
-#include "client/FileSystem.h"
-#include "client/FileSystemImpl.h"
-#include "client/FileSystemInter.h"
-#include "client/OutputStream.h"
-#include "client/OutputStreamImpl.h"
-#include "client/Packet.h"
-#include "client/Pipeline.h"
-#include "DateTime.h"
-#include "MockFileSystemInter.h"
-#include "MockCryptoCodec.h"
-#include "MockKmsClientProvider.h"
-#include "MockHttpClient.h"
-#include "MockLeaseRenewer.h"
-#include "MockPipeline.h"
-#include "NamenodeStub.h"
-#include "server/ExtendedBlock.h"
-#include "TestDatanodeStub.h"
-#include "TestUtil.h"
-#include "Thread.h"
-#include "XmlConfig.h"
-#include "client/KmsClientProvider.h"
-#include <string>
-
-using namespace Hdfs;
-using namespace Hdfs::Internal;
-using namespace Hdfs::Mock;
-using namespace testing;
-using ::testing::AtLeast;
-
-
-class TestCryptoCodec: public ::testing::Test {
-public:
- TestCryptoCodec() {
-
- }
-
- ~TestCryptoCodec() {
- }
-
-protected:
-};
-
-TEST_F(TestCryptoCodec, KmsGetKey_Success) {
- FileEncryptionInfo encryptionInfo;
- encryptionInfo.setKeyName("KmsName");
- encryptionInfo.setIv("KmsIv");
- encryptionInfo.setEzKeyVersionName("KmsVersionName");
- encryptionInfo.setKey("KmsKey");
- Config conf;
- conf.set("hadoop.kms.authentication.type", "simple");
- conf.set("dfs.encryption.key.provider.uri", "kms://http@0.0.0.0:16000/kms");
- shared_ptr<SessionConfig> sconf(new SessionConfig(conf));
- UserInfo userInfo;
- userInfo.setRealUser("abai");
- shared_ptr<RpcAuth> auth(new RpcAuth(userInfo, RpcAuth::ParseMethod(sconf->getKmsMethod())));
-
- KmsClientProvider kcp(auth, sconf);
- shared_ptr<MockHttpClient> hc(new MockHttpClient());
- kcp.setHttpClient(hc);
-
- EXPECT_CALL(*hc, post()).Times(1).WillOnce(
- Return(hc->getPostResult(encryptionInfo)));
-
- ptree map = kcp.decryptEncryptedKey(encryptionInfo);
- std::string KmsKey = map.get < std::string > ("material");
-
- ASSERT_STREQ("KmsKey", KmsKey.c_str());
-}
-
-TEST_F(TestCryptoCodec, encode_Success) {
- FileEncryptionInfo encryptionInfo;
- encryptionInfo.setKeyName("ESKeyName");
- encryptionInfo.setIv("ESIv");
- encryptionInfo.setEzKeyVersionName("ESVersionName");
-
- Config conf;
- conf.set("hadoop.kms.authentication.type", "simple");
- conf.set("dfs.encryption.key.provider.uri", "kms://http@0.0.0.0:16000/kms");
- shared_ptr<SessionConfig> sconf(new SessionConfig(conf));
- UserInfo userInfo;
- userInfo.setRealUser("abai");
- shared_ptr<RpcAuth> auth(
- new RpcAuth(userInfo, RpcAuth::ParseMethod(sconf->getKmsMethod())));
-
- shared_ptr<MockKmsClientProvider> kcp(
- new MockKmsClientProvider(auth, sconf));
-
- //char buf[1024] = "encode hello world";
- char buf[1024];
- Hdfs::FillBuffer(buf, sizeof(buf)-1, 2048);
- buf[sizeof(buf)-1] = 0;
-
- int32_t bufSize = 1024;
-
- std::string Key[2] = { "012345678901234567890123456789ab",
- "0123456789012345"};
- for (int i = 0; i < 2; i++) {
- encryptionInfo.setKey(Key[i]);
- shared_ptr<MockHttpClient> hc(new MockHttpClient());
- kcp->setHttpClient(hc);
-
- EXPECT_CALL(*kcp, decryptEncryptedKey(_)).Times(2).WillRepeatedly(
- Return(kcp->getEDKResult(encryptionInfo)));
-
- CryptoCodec es(&encryptionInfo, kcp, bufSize);
- es.init(CryptoMethod::ENCRYPT);
- CryptoCodec ds(&encryptionInfo, kcp, bufSize);
- ds.init(CryptoMethod::DECRYPT);
-
-
- std::string encodeStr = es.cipher_wrap(buf, strlen(buf));
- ASSERT_NE(0, memcmp(buf, encodeStr.c_str(), strlen(buf)));
-
- std::string decodeStr = ds.cipher_wrap(encodeStr.c_str(), strlen(buf));
- ASSERT_STREQ(decodeStr.c_str(), buf);
- }
-}