Kaydet (Commit) da41a44f authored tarafından Andre Fischer's avatar Andre Fischer Kaydeden (comit) Matúš Kukan

#i120041# Update of serf library from 1.0.0 to 1.1.0.

(cherry picked from commit eb0311f3)

Conflicts:
	external_deps.lst
	scp2/source/ooo/file_library_ooo.scp
	solenv/bin/download_external_dependencies.pl
	ucb/source/ucp/webdav/SerfPostReqProcImpl.cxx
	ucb/source/ucp/webdav/SerfPropFindReqProcImpl.cxx
	ucb/source/ucp/webdav/SerfPropPatchReqProcImpl.cxx
	ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx
	ucb/source/ucp/webdav/SerfSession.cxx

Change-Id: I6b9576226f86b87397bedc2b67a9289bc19317a7
üst 317b5bda
...@@ -59,8 +59,9 @@ extern "C" apr_status_t Serf_Credentials( char **username, ...@@ -59,8 +59,9 @@ extern "C" apr_status_t Serf_Credentials( char **username,
extern "C" apr_status_t Serf_CertificateChainValidation( extern "C" apr_status_t Serf_CertificateChainValidation(
void* pSerfSession, void* pSerfSession,
int nFailures, int nFailures,
const char** pCertificateChainBase64Encoded, int nErrorCode,
int nCertificateChainLength) const serf_ssl_certificate_t * const * pCertificateChainBase64Encoded,
apr_size_t nCertificateChainLength)
{ {
return static_cast<SerfSession*>(pSerfSession) return static_cast<SerfSession*>(pSerfSession)
->verifySerfCertificateChain(nFailures, pCertificateChainBase64Encoded, nCertificateChainLength); ->verifySerfCertificateChain(nFailures, pCertificateChainBase64Encoded, nCertificateChainLength);
......
...@@ -41,8 +41,9 @@ extern "C" apr_status_t Serf_Credentials( char **username, ...@@ -41,8 +41,9 @@ extern "C" apr_status_t Serf_Credentials( char **username,
extern "C" apr_status_t Serf_CertificateChainValidation( extern "C" apr_status_t Serf_CertificateChainValidation(
void* pSerfSession, void* pSerfSession,
int nFailures, int nFailures,
const char** pCertificateChainBase64Encoded, int error_depth,
int nCertificateChainLength); const serf_ssl_certificate_t * const * pCertificateChainBase64Encoded,
apr_size_t nCertificateChainLength);
extern "C" apr_status_t Serf_SetupRequest( serf_request_t *request, extern "C" apr_status_t Serf_SetupRequest( serf_request_t *request,
void *setup_baton, void *setup_baton,
......
...@@ -73,10 +73,6 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i ...@@ -73,10 +73,6 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i
if ( mpPostData != 0 && mnPostDataLen > 0 ) if ( mpPostData != 0 && mnPostDataLen > 0 )
{ {
body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpPostData, mnPostDataLen, pSerfBucketAlloc ); body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpPostData, mnPostDataLen, pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
} }
// create serf request // create serf request
...@@ -91,16 +87,9 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i ...@@ -91,16 +87,9 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i
// general header fields provided by caller // general header fields provided by caller
setRequestHeaders( hdrs_bkt ); setRequestHeaders( hdrs_bkt );
handleChunkedEncoding(req_bkt, mnPostDataLen);
// request specific header fields // request specific header fields
if ( body_bkt != 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_set( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_set( hdrs_bkt, "Content-Length",
OUStringToOString( OUString::valueOf( (sal_Int32)mnPostDataLen ), RTL_TEXTENCODING_UTF8 ) );
}
if ( mpContentType != 0 ) if ( mpContentType != 0 )
{ {
serf_bucket_headers_set( hdrs_bkt, "Content-Type", mpContentType ); serf_bucket_headers_set( hdrs_bkt, "Content-Type", mpContentType );
......
...@@ -147,23 +147,25 @@ serf_bucket_t * SerfPropFindReqProcImpl::createSerfRequestBucket( serf_request_t ...@@ -147,23 +147,25 @@ serf_bucket_t * SerfPropFindReqProcImpl::createSerfRequestBucket( serf_request_t
getPathStr(), getPathStr(),
body_bkt, body_bkt,
pSerfBucketAlloc ); pSerfBucketAlloc );
handleChunkedEncoding(req_bkt, aBodyText.getLength());
// set request header fields // set request header fields
serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt ); serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
// general header fields provided by caller if (hdrs_bkt != NULL)
setRequestHeaders( hdrs_bkt );
// request specific header fields
serf_bucket_headers_set( hdrs_bkt, "Depth", mDepthStr );
if ( body_bkt != 0 && aBodyText.getLength() > 0 )
{ {
if ( useChunkedEncoding() ) // general header fields provided by caller
setRequestHeaders( hdrs_bkt );
// request specific header fields
serf_bucket_headers_set( hdrs_bkt, "Depth", mDepthStr );
if (hdrs_bkt!=NULL && body_bkt != 0 && aBodyText.getLength() > 0 )
{ {
serf_bucket_headers_set( hdrs_bkt, "Transfer-Encoding", "chunked"); serf_bucket_headers_set( hdrs_bkt, "Content-Type", "application/xml" );
} }
serf_bucket_headers_set( hdrs_bkt, "Content-Type", "application/xml" ); }
serf_bucket_headers_set( hdrs_bkt, "Content-Length", else
OUStringToOString( OUString::valueOf( aBodyText.getLength() ), RTL_TEXTENCODING_UTF8 ) ); {
OSL_ASSERT("Headers Bucket missing");
} }
return req_bkt; return req_bkt;
......
...@@ -152,22 +152,24 @@ serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_ ...@@ -152,22 +152,24 @@ serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_
getPathStr(), getPathStr(),
body_bkt, body_bkt,
pSerfBucketAlloc ) ; pSerfBucketAlloc ) ;
handleChunkedEncoding(req_bkt, aBodyText.getLength());
// set request header fields // set request header fields
serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt ); serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
// general header fields provided by caller if (hdrs_bkt != NULL)
setRequestHeaders( hdrs_bkt );
// request specific header fields
if ( body_bkt != 0 && aBodyText.getLength() > 0 )
{ {
if ( useChunkedEncoding() ) // general header fields provided by caller
setRequestHeaders( hdrs_bkt );
// request specific header fields
if ( body_bkt != 0 && aBodyText.getLength() > 0 )
{ {
serf_bucket_headers_set( hdrs_bkt, "Transfer-Encoding", "chunked"); serf_bucket_headers_set( hdrs_bkt, "Content-Type", "application/xml" );
} }
serf_bucket_headers_set( hdrs_bkt, "Content-Type", "application/xml" ); }
serf_bucket_headers_set( hdrs_bkt, "Content-Length", else
OUStringToOString( OUString::valueOf( aBodyText.getLength() ), RTL_TEXTENCODING_UTF8 ) ); {
OSL_ASSERT("Headers Bucket missing");
} }
return req_bkt; return req_bkt;
......
...@@ -49,10 +49,6 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in ...@@ -49,10 +49,6 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
if ( mpData != 0 && mnDataLen > 0 ) if ( mpData != 0 && mnDataLen > 0 )
{ {
body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpData, mnDataLen, pSerfBucketAlloc ); body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpData, mnDataLen, pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
} }
// create serf request // create serf request
...@@ -61,23 +57,7 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in ...@@ -61,23 +57,7 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
getPathStr(), getPathStr(),
body_bkt, body_bkt,
serf_request_get_alloc( inSerfRequest ) ); serf_request_get_alloc( inSerfRequest ) );
handleChunkedEncoding(req_bkt, mnDataLen);
// set request header fields
serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
// general header fields provided by caller
setRequestHeaders( hdrs_bkt );
// request specific header fields
if ( body_bkt != 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_set( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_set( hdrs_bkt, "Content-Length",
OUStringToOString( OUString::valueOf( (sal_Int32)mnDataLen ), RTL_TEXTENCODING_UTF8 ) );
}
// set request header fields // set request header fields
serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt ); serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
......
...@@ -20,6 +20,14 @@ ...@@ -20,6 +20,14 @@
#include "SerfRequestProcessorImpl.hxx" #include "SerfRequestProcessorImpl.hxx"
#include "webdavuseragent.hxx" #include "webdavuseragent.hxx"
namespace
{
// Define a magic value that is used by serf to reset chunked
// encoding. The value definition is not supported by serf, hence the
// definition here.
static const apr_int64_t SERF_UNKNOWN_LENGTH (-1);
}
namespace http_dav_ucp namespace http_dav_ucp
{ {
...@@ -50,6 +58,27 @@ bool SerfRequestProcessorImpl::useChunkedEncoding() const ...@@ -50,6 +58,27 @@ bool SerfRequestProcessorImpl::useChunkedEncoding() const
return mbUseChunkedEncoding; return mbUseChunkedEncoding;
} }
void SerfRequestProcessorImpl::handleChunkedEncoding (
serf_bucket_t* pRequestBucket,
apr_int64_t nLength) const
{
if (pRequestBucket != NULL)
{
if (useChunkedEncoding())
{
// Activate chunked encoding.
serf_bucket_request_set_CL(pRequestBucket, SERF_UNKNOWN_LENGTH);
}
else
{
// Deactivate chunked encoding by setting the length.
serf_bucket_request_set_CL(pRequestBucket, nLength);
}
}
}
void SerfRequestProcessorImpl::setRequestHeaders( serf_bucket_t* inoutSerfHeaderBucket ) void SerfRequestProcessorImpl::setRequestHeaders( serf_bucket_t* inoutSerfHeaderBucket )
{ {
bool bHasUserAgent( false ); bool bHasUserAgent( false );
......
...@@ -47,6 +47,13 @@ public: ...@@ -47,6 +47,13 @@ public:
void activateChunkedEncoding(); void activateChunkedEncoding();
/** Turn chunked encoding on or off, dependeing on the result of
useChunkedEncoding().
*/
void handleChunkedEncoding (
serf_bucket_t* pRequestBucket,
apr_int64_t nLength) const;
protected: protected:
void setRequestHeaders( serf_bucket_t* inoutSerfHeaderBucket ); void setRequestHeaders( serf_bucket_t* inoutSerfHeaderBucket );
......
...@@ -269,6 +269,7 @@ apr_status_t SerfSession::setupSerfConnection( apr_socket_t * inAprSocket, ...@@ -269,6 +269,7 @@ apr_status_t SerfSession::setupSerfConnection( apr_socket_t * inAprSocket,
*/ */
serf_ssl_server_cert_chain_callback_set( serf_ssl_server_cert_chain_callback_set(
serf_bucket_ssl_decrypt_context_get(tmpInputBkt), serf_bucket_ssl_decrypt_context_get(tmpInputBkt),
NULL,
Serf_CertificateChainValidation, Serf_CertificateChainValidation,
this); this);
serf_ssl_set_hostname( serf_bucket_ssl_decrypt_context_get( tmpInputBkt ), serf_ssl_set_hostname( serf_bucket_ssl_decrypt_context_get( tmpInputBkt ),
...@@ -366,7 +367,7 @@ namespace { ...@@ -366,7 +367,7 @@ namespace {
apr_status_t SerfSession::verifySerfCertificateChain ( apr_status_t SerfSession::verifySerfCertificateChain (
int, int,
const char** pCertificateChainBase64Encoded, const serf_ssl_certificate_t * const * pCertificateChainBase64Encoded,
int nCertificateChainLength) int nCertificateChainLength)
{ {
// Check arguments. // Check arguments.
...@@ -411,9 +412,13 @@ apr_status_t SerfSession::verifySerfCertificateChain ( ...@@ -411,9 +412,13 @@ apr_status_t SerfSession::verifySerfCertificateChain (
} }
// Decode the server certificate. // Decode the server certificate.
const char* sBase64EncodedServerCertificate (
serf_ssl_cert_export(
pCertificateChainBase64Encoded[0],
getAprPool()));
uno::Reference< security::XCertificate > xServerCertificate( uno::Reference< security::XCertificate > xServerCertificate(
xSecurityEnv->createCertificateFromAscii( xSecurityEnv->createCertificateFromAscii(
OUString::createFromAscii(pCertificateChainBase64Encoded[0]))); OUString::createFromAscii(sBase64EncodedServerCertificate)));
if ( ! xServerCertificate.is()) if ( ! xServerCertificate.is())
return SERF_SSL_CERT_UNKNOWN_FAILURE; return SERF_SSL_CERT_UNKNOWN_FAILURE;
...@@ -454,9 +459,13 @@ apr_status_t SerfSession::verifySerfCertificateChain ( ...@@ -454,9 +459,13 @@ apr_status_t SerfSession::verifySerfCertificateChain (
std::vector< uno::Reference< security::XCertificate > > aChain; std::vector< uno::Reference< security::XCertificate > > aChain;
for (int nIndex=1; nIndex<nCertificateChainLength; ++nIndex) for (int nIndex=1; nIndex<nCertificateChainLength; ++nIndex)
{ {
const char* sBase64EncodedCertificate (
serf_ssl_cert_export(
pCertificateChainBase64Encoded[nIndex],
getAprPool()));
uno::Reference< security::XCertificate > xCertificate( uno::Reference< security::XCertificate > xCertificate(
xSecurityEnv->createCertificateFromAscii( xSecurityEnv->createCertificateFromAscii(
OUString::createFromAscii(pCertificateChainBase64Encoded[nIndex]))); OUString::createFromAscii(sBase64EncodedCertificate)));
if ( ! xCertificate.is()) if ( ! xCertificate.is())
return SERF_SSL_CERT_UNKNOWN_FAILURE; return SERF_SSL_CERT_UNKNOWN_FAILURE;
aChain.push_back(xCertificate); aChain.push_back(xCertificate);
......
...@@ -96,7 +96,7 @@ public: ...@@ -96,7 +96,7 @@ public:
apr_status_t verifySerfCertificateChain ( apr_status_t verifySerfCertificateChain (
int nFailures, int nFailures,
const char** pCertificateChainBase64Encoded, const serf_ssl_certificate_t * const * pCertificateChainBase64Encoded,
int nCertificateChainLength); int nCertificateChainLength);
serf_bucket_t* acceptSerfResponse( serf_request_t * inSerfRequest, serf_bucket_t* acceptSerfResponse( serf_request_t * inSerfRequest,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment