Merge branch '0.13.0'
diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec
index 7bbfb0d..6dc3225 100644
--- a/ApacheThrift.nuspec
+++ b/ApacheThrift.nuspec
@@ -21,14 +21,14 @@
the "Thrift" project.
3. nuget setApiKey <your-api-key>
3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg
- 4. nuget push ApacheThrift.0.13.0.nupkg -Source https://api.nuget.org/v3/index.json
+ 4. nuget push ApacheThrift.0.14.0.nupkg -Source https://api.nuget.org/v3/index.json
-->
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>ApacheThrift</id>
- <version>0.13.0</version>
- <title>Apache Thrift 0.13.0</title>
+ <version>0.14.0</version>
+ <title>Apache Thrift 0.14.0</title>
<authors>Apache Thrift Developers</authors>
<owners>Apache Software Foundation</owners>
<license type="expression">Apache-2.0</license>
@@ -39,7 +39,7 @@
Contains runtime libraries from lib/csharp for net35 and net45 frameworks,
and from lib/netstd for netstandard2.0 framework development.
</description>
- <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.13.0" />
+ <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.14.0" />
<tags>Apache Thrift RPC</tags>
</metadata>
<files>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1880b79..f2e682a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@
# PACKAGE_VERSION is used by cpack scripts currently
# Both thrift_VERSION and PACKAGE_VERSION should be the same for now
-set(thrift_VERSION "0.13.0")
+set(thrift_VERSION "0.14.0")
set(PACKAGE_VERSION ${thrift_VERSION})
project("thrift" VERSION ${PACKAGE_VERSION})
diff --git a/appveyor.yml b/appveyor.yml
index ef729eb..233a056 100755
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -19,7 +19,7 @@
# build Apache Thrift on AppVeyor - https://ci.appveyor.com
-version: '0.13.0.{build}'
+version: '0.14.0.{build}'
shallow_clone: true
diff --git a/bower.json b/bower.json
index c602af1..68f2c8d 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
{
"name": "thrift",
- "version": "0.13.0",
+ "version": "0.14.0",
"homepage": "https://github.com/apache/thrift.git",
"authors": [
"Apache Thrift <dev@thrift.apache.org>"
diff --git a/configure.ac b/configure.ac
index 58f9319..2784699 100755
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@
AC_PREREQ(2.65)
AC_CONFIG_MACRO_DIR([./aclocal])
-AC_INIT([thrift], [0.13.0])
+AC_INIT([thrift], [0.14.0])
AC_CONFIG_AUX_DIR([.])
diff --git a/contrib/thrift.spec b/contrib/thrift.spec
index cbb08fb..225a969 100644
--- a/contrib/thrift.spec
+++ b/contrib/thrift.spec
@@ -28,7 +28,7 @@
License: Apache License v2.0
Group: Development
Summary: RPC and serialization framework
-Version: 0.13.0
+Version: 0.14.0
Release: 0
URL: http://thrift.apache.org
Packager: Thrift Developers <dev@thrift.apache.org>
diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md
index 362fd83..ee744ae 100644
--- a/doc/ReleaseManagement.md
+++ b/doc/ReleaseManagement.md
@@ -331,7 +331,7 @@
~/thrift$ git push --tags
```
- **NOTE:** If you get the error "gpg failed to sign the data" when tagging, try this fix: "export GPG_TTY=$(tty)"
+ **NOTE:** If you get the error "gpg failed to sign the data" when tagging, try this fix: ```export GPG_TTY=$(tty)```. Alternatively, it may be necessary to specify the ```-u <keyid>``` as an additional argument.
1. Create a new release from the [GitHub Tags Page](https://github.com/apache/thrift/tags). Attach the statically built Windows thrift compiler as a binary here.
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
index b413002..64f08dd 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
@@ -957,6 +957,28 @@
}
}
+void TSSLSocketFactory::loadCertificateFromBuffer(const char* aCertificate, const char* format) {
+ if (aCertificate == nullptr || format == nullptr) {
+ throw TTransportException(TTransportException::BAD_ARGS,
+ "loadCertificate: either <path> or <format> is NULL");
+ }
+ if (strcmp(format, "PEM") == 0) {
+ BIO* mem = BIO_new(BIO_s_mem());
+ BIO_puts(mem, aCertificate);
+ X509* cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+ BIO_free(mem);
+
+ if (SSL_CTX_use_certificate(ctx_->get(), cert) == 0) {
+ int errno_copy = THRIFT_GET_SOCKET_ERROR;
+ string errors;
+ buildErrors(errors, errno_copy);
+ throw TSSLException("SSL_CTX_use_certificate: " + errors);
+ }
+ } else {
+ throw TSSLException("Unsupported certificate format: " + string(format));
+ }
+}
+
void TSSLSocketFactory::loadPrivateKey(const char* path, const char* format) {
if (path == nullptr || format == nullptr) {
throw TTransportException(TTransportException::BAD_ARGS,
@@ -972,6 +994,28 @@
}
}
+void TSSLSocketFactory::loadPrivateKeyFromBuffer(const char* aPrivateKey, const char* format) {
+ if (aPrivateKey == nullptr || format == nullptr) {
+ throw TTransportException(TTransportException::BAD_ARGS,
+ "loadPrivateKey: either <path> or <format> is NULL");
+ }
+ if (strcmp(format, "PEM") == 0) {
+ BIO* mem = BIO_new(BIO_s_mem());
+ BIO_puts(mem, aPrivateKey);
+ EVP_PKEY* cert = PEM_read_bio_PrivateKey(mem, nullptr, nullptr, nullptr);
+
+ BIO_free(mem);
+ if (SSL_CTX_use_PrivateKey(ctx_->get(), cert) == 0) {
+ int errno_copy = THRIFT_GET_SOCKET_ERROR;
+ string errors;
+ buildErrors(errors, errno_copy);
+ throw TSSLException("SSL_CTX_use_PrivateKey: " + errors);
+ }
+ } else {
+ throw TSSLException("Unsupported certificate format: " + string(format));
+ }
+}
+
void TSSLSocketFactory::loadTrustedCertificates(const char* path, const char* capath) {
if (path == nullptr) {
throw TTransportException(TTransportException::BAD_ARGS,
@@ -985,6 +1029,39 @@
}
}
+void TSSLSocketFactory::loadTrustedCertificatesFromBuffer(const char* aCertificate, const char* aChain) {
+ if (aCertificate == nullptr) {
+ throw TTransportException(TTransportException::BAD_ARGS,
+ "loadTrustedCertificates: aCertificate is empty");
+ }
+ X509_STORE* vX509Store = SSL_CTX_get_cert_store(ctx_->get());
+ BIO* mem = BIO_new(BIO_s_mem());
+ BIO_puts(mem, aCertificate);
+ X509* cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+ BIO_free(mem);
+
+ if (X509_STORE_add_cert(vX509Store, cert) == 0) {
+ int errno_copy = THRIFT_GET_SOCKET_ERROR;
+ string errors;
+ buildErrors(errors, errno_copy);
+ throw TSSLException("X509_STORE_add_cert: " + errors);
+ }
+
+ if (aChain) {
+ mem = BIO_new(BIO_s_mem());
+ BIO_puts(mem, aChain);
+ cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+ BIO_free(mem);
+
+ if (SSL_CTX_add_extra_chain_cert(ctx_->get(), cert) == 0) {
+ int errno_copy = THRIFT_GET_SOCKET_ERROR;
+ string errors;
+ buildErrors(errors, errno_copy);
+ throw TSSLException("X509_STORE_add_cert: " + errors);
+ }
+ }
+}
+
void TSSLSocketFactory::randomize() {
RAND_poll();
}
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.h b/lib/cpp/src/thrift/transport/TSSLSocket.h
index 87a9601..a78112c 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.h
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.h
@@ -261,6 +261,7 @@
* @param format Certificate file format
*/
virtual void loadCertificate(const char* path, const char* format = "PEM");
+ virtual void loadCertificateFromBuffer(const char* aCertificate, const char* format = "PEM");
/**
* Load private key.
*
@@ -268,12 +269,14 @@
* @param format Private key file format
*/
virtual void loadPrivateKey(const char* path, const char* format = "PEM");
+ virtual void loadPrivateKeyFromBuffer(const char* aPrivateKey, const char* format = "PEM");
/**
* Load trusted certificates from specified file.
*
* @param path Path to trusted certificate file
*/
virtual void loadTrustedCertificates(const char* path, const char* capath = nullptr);
+ virtual void loadTrustedCertificatesFromBuffer(const char* aCertificate, const char* aChain = nullptr);
/**
* Default randomize method.
*/
diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt
index ef08dbc..fba15f6 100644
--- a/lib/cpp/test/CMakeLists.txt
+++ b/lib/cpp/test/CMakeLists.txt
@@ -334,6 +334,17 @@
endif ()
add_test(NAME SecurityTest COMMAND SecurityTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys")
+add_executable(SecurityFromBufferTest SecurityFromBufferTest.cpp)
+target_link_libraries(SecurityFromBufferTest
+ testgencpp
+ ${Boost_LIBRARIES}
+)
+LINK_AGAINST_THRIFT_LIBRARY(SecurityFromBufferTest thrift)
+if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW)
+target_link_libraries(SecurityFromBufferTest -lrt)
+endif ()
+add_test(NAME SecurityFromBufferTest COMMAND SecurityFromBufferTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys")
+
endif()
if(WITH_QT5)
diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am
index 2a0b9e6..8399d9e 100755
--- a/lib/cpp/test/Makefile.am
+++ b/lib/cpp/test/Makefile.am
@@ -99,6 +99,7 @@
TInterruptTest \
TServerIntegrationTest \
SecurityTest \
+ SecurityFromBufferTest \
ZlibTest \
TFileTransportTest \
link_test \
@@ -174,6 +175,17 @@
$(BOOST_SYSTEM_LDADD) \
$(BOOST_THREAD_LDADD)
+SecurityFromBufferTest_SOURCES = \
+ SecurityFromBufferTest.cpp
+
+SecurityFromBufferTest_LDADD = \
+ libtestgencpp.la \
+ libprocessortest.la \
+ $(BOOST_TEST_LDADD) \
+ $(BOOST_FILESYSTEM_LDADD) \
+ $(BOOST_SYSTEM_LDADD) \
+ $(BOOST_THREAD_LDADD)
+
TransportTest_SOURCES = \
TransportTest.cpp
diff --git a/lib/cpp/test/SecurityFromBufferTest.cpp b/lib/cpp/test/SecurityFromBufferTest.cpp
new file mode 100644
index 0000000..72a4c2a
--- /dev/null
+++ b/lib/cpp/test/SecurityFromBufferTest.cpp
@@ -0,0 +1,253 @@
+/*
+ * 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.
+ */
+
+#define BOOST_TEST_MODULE SecurityFromBufferTest
+#include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/thread.hpp>
+#include <stdexcept>
+#include <fstream>
+#include <memory>
+#include <thrift/transport/TSSLServerSocket.h>
+#include <thrift/transport/TSSLSocket.h>
+#include <thrift/transport/TTransport.h>
+#include <vector>
+#ifdef __linux__
+#include <signal.h>
+#endif
+
+using apache::thrift::transport::TServerTransport;
+using apache::thrift::transport::TSSLServerSocket;
+using apache::thrift::transport::TSSLSocket;
+using apache::thrift::transport::TSSLSocketFactory;
+using apache::thrift::transport::TTransport;
+using apache::thrift::transport::TTransportException;
+using apache::thrift::transport::TTransportFactory;
+
+using std::bind;
+using std::shared_ptr;
+
+boost::filesystem::path keyDir;
+boost::filesystem::path certFile(const std::string& filename) {
+ return keyDir / filename;
+}
+std::string certString(const std::string& filename) {
+ std::ifstream ifs(certFile(filename).string());
+ if(!ifs.is_open() || !ifs.good()) {
+ throw(std::runtime_error("Failed to open key file " + filename + " for reading"));
+ }
+ std::stringstream buffer;
+ buffer << ifs.rdbuf();
+ return buffer.str();
+}
+boost::mutex gMutex;
+
+struct GlobalFixture {
+ GlobalFixture() {
+ using namespace boost::unit_test::framework;
+ for (int i = 0; i < master_test_suite().argc; ++i) {
+ BOOST_TEST_MESSAGE(boost::format("argv[%1%] = \"%2%\"") % i % master_test_suite().argv[i]);
+ }
+
+#ifdef __linux__
+ // OpenSSL calls send() without MSG_NOSIGPIPE so writing to a socket that has
+ // disconnected can cause a SIGPIPE signal...
+ signal(SIGPIPE, SIG_IGN);
+#endif
+
+ TSSLSocketFactory::setManualOpenSSLInitialization(true);
+ apache::thrift::transport::initializeOpenSSL();
+
+ keyDir = boost::filesystem::current_path().parent_path().parent_path().parent_path() / "test" / "keys";
+ if (!boost::filesystem::exists(certFile("server.crt"))) {
+ keyDir = boost::filesystem::path(master_test_suite().argv[master_test_suite().argc - 1]);
+ if (!boost::filesystem::exists(certFile("server.crt"))) {
+ throw std::invalid_argument("The last argument to this test must be the directory containing the test certificate(s).");
+ }
+ }
+ }
+
+ virtual ~GlobalFixture() {
+ apache::thrift::transport::cleanupOpenSSL();
+#ifdef __linux__
+ signal(SIGPIPE, SIG_DFL);
+#endif
+ }
+};
+
+#if (BOOST_VERSION >= 105900)
+BOOST_GLOBAL_FIXTURE(GlobalFixture);
+#else
+BOOST_GLOBAL_FIXTURE(GlobalFixture)
+#endif
+
+struct SecurityFromBufferFixture {
+ void server(apache::thrift::transport::SSLProtocol protocol) {
+ try {
+ boost::mutex::scoped_lock lock(mMutex);
+
+ shared_ptr<TSSLSocketFactory> pServerSocketFactory;
+ shared_ptr<TSSLServerSocket> pServerSocket;
+
+ pServerSocketFactory.reset(new TSSLSocketFactory(static_cast<apache::thrift::transport::SSLProtocol>(protocol)));
+ pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+ pServerSocketFactory->loadCertificateFromBuffer(certString("server.crt").c_str());
+ pServerSocketFactory->loadPrivateKeyFromBuffer(certString("server.key").c_str());
+ pServerSocketFactory->server(true);
+ pServerSocket.reset(new TSSLServerSocket("localhost", 0, pServerSocketFactory));
+ shared_ptr<TTransport> connectedClient;
+
+ try {
+ pServerSocket->listen();
+ mPort = pServerSocket->getPort();
+ mCVar.notify_one();
+ lock.unlock();
+
+ connectedClient = pServerSocket->accept();
+ uint8_t buf[2];
+ buf[0] = 'O';
+ buf[1] = 'K';
+ connectedClient->write(&buf[0], 2);
+ connectedClient->flush();
+ }
+
+ catch (apache::thrift::transport::TTransportException& ex) {
+ boost::mutex::scoped_lock lock(gMutex);
+ BOOST_TEST_MESSAGE(boost::format("SRV %1% Exception: %2%") % boost::this_thread::get_id() % ex.what());
+ }
+
+ if (connectedClient) {
+ connectedClient->close();
+ connectedClient.reset();
+ }
+
+ pServerSocket->close();
+ pServerSocket.reset();
+ } catch (std::exception& ex) {
+ BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+ }
+ }
+
+ void client(apache::thrift::transport::SSLProtocol protocol) {
+ try {
+ shared_ptr<TSSLSocketFactory> pClientSocketFactory;
+ shared_ptr<TSSLSocket> pClientSocket;
+
+ try {
+ pClientSocketFactory.reset(new TSSLSocketFactory(static_cast<apache::thrift::transport::SSLProtocol>(protocol)));
+ pClientSocketFactory->authenticate(true);
+ pClientSocketFactory->loadCertificateFromBuffer(certString("client.crt").c_str());
+ pClientSocketFactory->loadPrivateKeyFromBuffer(certString("client.key").c_str());
+ pClientSocketFactory->loadTrustedCertificatesFromBuffer(certString("CA.pem").c_str());
+ pClientSocket = pClientSocketFactory->createSocket("localhost", mPort);
+ pClientSocket->open();
+
+ uint8_t buf[3];
+ buf[0] = 0;
+ buf[1] = 0;
+ BOOST_CHECK_EQUAL(2, pClientSocket->read(&buf[0], 2));
+ BOOST_CHECK_EQUAL(0, memcmp(&buf[0], "OK", 2));
+ mConnected = true;
+ } catch (apache::thrift::transport::TTransportException& ex) {
+ boost::mutex::scoped_lock lock(gMutex);
+ BOOST_TEST_MESSAGE(boost::format("CLI %1% Exception: %2%") % boost::this_thread::get_id() % ex.what());
+ }
+
+ if (pClientSocket) {
+ pClientSocket->close();
+ pClientSocket.reset();
+ }
+ } catch (std::exception& ex) {
+ BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+ }
+ }
+
+ static const char* protocol2str(size_t protocol) {
+ static const char* strings[apache::thrift::transport::LATEST + 1]
+ = {"SSLTLS", "SSLv2", "SSLv3", "TLSv1_0", "TLSv1_1", "TLSv1_2"};
+ return strings[protocol];
+ }
+
+ boost::mutex mMutex;
+ boost::condition_variable mCVar;
+ int mPort;
+ bool mConnected;
+};
+
+BOOST_FIXTURE_TEST_SUITE(BOOST_TEST_MODULE, SecurityFromBufferFixture)
+
+BOOST_AUTO_TEST_CASE(ssl_security_matrix) {
+ try {
+ // matrix of connection success between client and server with different SSLProtocol selections
+ static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols");
+ bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] =
+ {
+ // server = SSLTLS SSLv2 SSLv3 TLSv1_0 TLSv1_1 TLSv1_2
+ // client
+ /* SSLTLS */ { true, false, false, true, true, true },
+ /* SSLv2 */ { false, false, false, false, false, false },
+ /* SSLv3 */ { false, false, true, false, false, false },
+ /* TLSv1_0 */ { true, false, false, true, false, false },
+ /* TLSv1_1 */ { true, false, false, false, true, false },
+ /* TLSv1_2 */ { true, false, false, false, false, true }
+ };
+
+ for (size_t si = 0; si <= apache::thrift::transport::LATEST; ++si) {
+ for (size_t ci = 0; ci <= apache::thrift::transport::LATEST; ++ci) {
+ if (si == 1 || ci == 1) {
+ // Skip all SSLv2 cases - protocol not supported
+ continue;
+ }
+
+#ifdef OPENSSL_NO_SSL3
+ if (si == 2 || ci == 2) {
+ // Skip all SSLv3 cases - protocol not supported
+ continue;
+ }
+#endif
+
+ boost::mutex::scoped_lock lock(mMutex);
+
+ BOOST_TEST_MESSAGE(boost::format("TEST: Server = %1%, Client = %2%") % protocol2str(si)
+ % protocol2str(ci));
+
+ mConnected = false;
+ // thread_group manages the thread lifetime - ignore the return value of create_thread
+ boost::thread_group threads;
+ (void)threads.create_thread(bind(&SecurityFromBufferFixture::server, this,
+ static_cast<apache::thrift::transport::SSLProtocol>(si)));
+ mCVar.wait(lock); // wait for listen() to succeed
+ lock.unlock();
+ (void)threads.create_thread(bind(&SecurityFromBufferFixture::client, this,
+ static_cast<apache::thrift::transport::SSLProtocol>(ci)));
+ threads.join_all();
+
+ BOOST_CHECK_MESSAGE(mConnected == matrix[ci][si],
+ boost::format(" Server = %1%, Client = %2% expected mConnected == %3% but was %4%")
+ % protocol2str(si) % protocol2str(ci) % matrix[ci][si] % mConnected);
+ }
+ }
+ } catch (std::exception& ex) {
+ BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
index f4a26de..2589970 100644
--- a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+++ b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
@@ -45,7 +45,7 @@
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>0.13.0.0</ApplicationVersion>
+ <ApplicationVersion>0.14.0.0</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
diff --git a/lib/csharp/src/Thrift.csproj b/lib/csharp/src/Thrift.csproj
index da69554..1305482 100644
--- a/lib/csharp/src/Thrift.csproj
+++ b/lib/csharp/src/Thrift.csproj
@@ -45,7 +45,7 @@
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>0.13.0.0</ApplicationVersion>
+ <ApplicationVersion>0.14.0.0</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
diff --git a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj b/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
index 09d20f5..551640b 100644
--- a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
+++ b/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
@@ -46,7 +46,7 @@
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>0.13.0.0</ApplicationVersion>
+ <ApplicationVersion>0.14.0.0</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
diff --git a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs b/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
index 2b8a6af..50b11af 100644
--- a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
+++ b/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs b/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
index b812aaf..a87107c 100644
--- a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
+++ b/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
@@ -49,5 +49,5 @@
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d
index 150c3da..4a8fbd7 100644
--- a/lib/d/src/thrift/base.d
+++ b/lib/d/src/thrift/base.d
@@ -50,7 +50,7 @@
/// The Thrift version string, used for informative purposes.
// Note: This is currently hardcoded, but will likely be filled in by the build
// system in future versions.
-enum VERSION = "0.13.0";
+enum VERSION = "0.14.0";
/**
* Functions used for logging inside Thrift.
diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas
index 2ee8344..e127380 100644
--- a/lib/delphi/src/Thrift.pas
+++ b/lib/delphi/src/Thrift.pas
@@ -27,7 +27,7 @@
Thrift.Protocol;
const
- Version = '0.13.0';
+ Version = '0.14.0';
type
TException = Thrift.Exception.TException; // compatibility alias
diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json
index b3c1530..d0e437b 100644
--- a/lib/haxe/haxelib.json
+++ b/lib/haxe/haxelib.json
@@ -4,7 +4,7 @@
"license": "Apache",
"tags": ["thrift", "rpc", "serialization", "cross", "framework"],
"description": "Haxe bindings for the Apache Thrift RPC and serialization framework",
- "version": "0.13.0",
+ "version": "0.14.0",
"releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.",
"contributors": ["Apache Software Foundation (ASF)"],
"dependencies": { },
diff --git a/lib/hs/thrift.cabal b/lib/hs/thrift.cabal
index dd30d89..c60effb 100644
--- a/lib/hs/thrift.cabal
+++ b/lib/hs/thrift.cabal
@@ -18,7 +18,7 @@
--
Name: thrift
-Version: 0.13.0
+Version: 0.14.0
Cabal-Version: 1.24
License: Apache
Category: Foreign
diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties
index 0811659..c5d2a1b 100644
--- a/lib/java/gradle.properties
+++ b/lib/java/gradle.properties
@@ -1,7 +1,7 @@
# This file is shared currently between this Gradle build and the
# Ant builds for fd303 and JavaScript. Keep the dotted notation for
# the properties to minimize the changes in the dependencies.
-thrift.version=0.13.0
+thrift.version=0.14.0
thrift.groupid=org.apache.thrift
release=false
diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js
index 21a3d65..69bcccd 100644
--- a/lib/js/src/thrift.js
+++ b/lib/js/src/thrift.js
@@ -46,7 +46,7 @@
* @const {string} Version
* @memberof Thrift
*/
- Version: '0.13.0',
+ Version: '0.14.0',
/**
* Thrift IDL type string to Id mapping.
diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua
index a948b3d..4a290de 100644
--- a/lib/lua/Thrift.lua
+++ b/lib/lua/Thrift.lua
@@ -48,7 +48,7 @@
return count
end
-version = '0.13.0'
+version = '0.14.0'
TType = {
STOP = 0,
diff --git a/lib/netcore/Thrift/Properties/AssemblyInfo.cs b/lib/netcore/Thrift/Properties/AssemblyInfo.cs
index 0f433b6..58aa844 100644
--- a/lib/netcore/Thrift/Properties/AssemblyInfo.cs
+++ b/lib/netcore/Thrift/Properties/AssemblyInfo.cs
@@ -52,5 +52,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs b/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
index 8bce9e4..b2ff804 100644
--- a/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
+++ b/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
@@ -150,7 +150,7 @@
}
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-thrift"));
- httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("THttpClientTransport", "0.13.0"));
+ httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("THttpClientTransport", "0.14.0"));
if (CustomHeaders != null)
{
diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
index 597290d..58aa844 100644
--- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs
+++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
@@ -52,6 +52,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
-
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/php/test/Fixtures.php b/lib/php/test/Fixtures.php
index fd57d83..996f4af 100644
--- a/lib/php/test/Fixtures.php
+++ b/lib/php/test/Fixtures.php
@@ -66,32 +66,32 @@
self::$testArgs['testStruct'] =
new Xtruct(
- array(
+ array(
'string_thing' => 'worked',
'byte_thing' => 0x01,
'i32_thing' => pow(2, 30),
'i64_thing' => self::$testArgs['testI64']
)
- );
+ );
self::$testArgs['testNestNested'] =
new Xtruct(
- array(
+ array(
'string_thing' => 'worked',
'byte_thing' => 0x01,
'i32_thing' => pow(2, 30),
'i64_thing' => self::$testArgs['testI64']
)
- );
+ );
self::$testArgs['testNest'] =
new Xtruct2(
- array(
+ array(
'byte_thing' => 0x01,
'struct_thing' => self::$testArgs['testNestNested'],
'i32_thing' => pow(2, 15)
)
- );
+ );
self::$testArgs['testMap'] =
array(
@@ -138,23 +138,23 @@
$xtruct1 =
new Xtruct(
- array(
+ array(
'string_thing' => 'Goodbye4',
'byte_thing' => 4,
'i32_thing' => 4,
'i64_thing' => 4
)
- );
+ );
$xtruct2 =
new Xtruct(
- array(
+ array(
'string_thing' => 'Hello2',
'byte_thing' => 2,
'i32_thing' => 2,
'i64_thing' => 2
)
- );
+ );
$userMap =
array(
@@ -164,21 +164,21 @@
$insanity2 =
new Insanity(
- array(
+ array(
'userMap' => $userMap,
'xtructs' => array($xtruct1, $xtruct2)
)
- );
+ );
$insanity3 = $insanity2;
$insanity6 =
new Insanity(
- array(
+ array(
'userMap' => null,
'xtructs' => null
)
- );
+ );
self::$testArgs['testInsanityExpectedResult'] =
array(
diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec
index 869e5d9..3ee7e7c 100644
--- a/lib/rb/thrift.gemspec
+++ b/lib/rb/thrift.gemspec
@@ -3,7 +3,7 @@
Gem::Specification.new do |s|
s.name = 'thrift'
- s.version = '0.13.0'
+ s.version = '0.14.0'
s.authors = ['Apache Thrift Developers']
s.email = ['dev@thrift.apache.org']
s.homepage = 'http://thrift.apache.org'
diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml
index 69da0f3..0c71bab 100644
--- a/lib/rs/Cargo.toml
+++ b/lib/rs/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "thrift"
description = "Rust bindings for the Apache Thrift RPC system"
-version = "0.13.0"
+version = "0.14.0"
license = "Apache-2.0"
authors = ["Apache Thrift Developers <dev@thrift.apache.org>"]
homepage = "http://thrift.apache.org"
diff --git a/lib/st/package.xml b/lib/st/package.xml
index 21b7adc..eab4052 100644
--- a/lib/st/package.xml
+++ b/lib/st/package.xml
@@ -17,7 +17,7 @@
specific language governing permissions and limitations
under the License.
-->
-<!-- Apache Thrift Smalltalk library version 0.13.0 -->
+<!-- Apache Thrift Smalltalk library version 0.14.0 -->
<package>
<name>libthrift-st</name>
<file>thrift.st</file>
diff --git a/lib/ts/package.json b/lib/ts/package.json
index eda1c0a..1cd6c71 100644
--- a/lib/ts/package.json
+++ b/lib/ts/package.json
@@ -1,6 +1,6 @@
{
"name": "thrift",
- "version": "0.13.0",
+ "version": "0.14.0",
"description": "Thrift is a software framework for scalable cross-language services development.",
"author": {
"name": "Apache Thrift Developers",
diff --git a/package.json b/package.json
index 6393ee7..c674fef 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"type": "git",
"url": "https://github.com/apache/thrift.git"
},
- "version": "0.13.0",
+ "version": "0.14.0",
"author": {
"name": "Apache Thrift Developers",
"email": "dev@thrift.apache.org",
diff --git a/test/csharp/Properties/AssemblyInfo.cs b/test/csharp/Properties/AssemblyInfo.cs
index 76c9a80..376ff25 100644
--- a/test/csharp/Properties/AssemblyInfo.cs
+++ b/test/csharp/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs b/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
index bae5e70..8f5b32a 100644
--- a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
+++ b/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml
index ca122d2..1068f90 100644
--- a/tutorial/dart/console_client/pubspec.yaml
+++ b/tutorial/dart/console_client/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: tutorial_console_client
-version: 0.13.0
+version: 0.14.0
description: >
A Dart console client to implementation of the Apache Thrift tutorial
author: Apache Thrift Developers <dev@thrift.apache.org>
diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml
index e09465e..bdd74b8 100644
--- a/tutorial/dart/server/pubspec.yaml
+++ b/tutorial/dart/server/pubspec.yaml
@@ -16,7 +16,7 @@
# under the License.
name: tutorial_server
-version: 0.13.0
+version: 0.14.0
description: A Dart server to support the Apache Thrift tutorial
author: Apache Thrift Developers <dev@thrift.apache.org>
homepage: http://thrift.apache.org
diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj
index ec1da2e..132d1bf 100644
--- a/tutorial/delphi/DelphiServer/DelphiServer.dproj
+++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj
@@ -97,13 +97,13 @@
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription">Thrift Tutorial</VersionInfoKeys>
- <VersionInfoKeys Name="FileVersion">0.13.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="FileVersion">0.14.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">DelphiServer</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">Copyright © 2012 The Apache Software Foundation</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename">DelphiServer.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">Thrift</VersionInfoKeys>
- <VersionInfoKeys Name="ProductVersion">0.13.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="ProductVersion">0.14.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
diff --git a/tutorial/hs/ThriftTutorial.cabal b/tutorial/hs/ThriftTutorial.cabal
index b6a6122..acf2130 100755
--- a/tutorial/hs/ThriftTutorial.cabal
+++ b/tutorial/hs/ThriftTutorial.cabal
@@ -18,7 +18,7 @@
--
Name: ThriftTutorial
-Version: 0.13.0
+Version: 0.14.0
Cabal-Version: >= 1.4
License: OtherLicense
Category: Foreign
diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis
index 4a4f337..7491436 100644
--- a/tutorial/ocaml/_oasis
+++ b/tutorial/ocaml/_oasis
@@ -1,5 +1,5 @@
Name: tutorial
-Version: 0.13.0
+Version: 0.14.0
OASISFormat: 0.3
Synopsis: OCaml Tutorial example
Authors: Apache Thrift Developers <dev@thrift.apache.org>